说我们有
typedef struct {
int value1;
int value2;
} values_t;
Run Code Online (Sandbox Code Playgroud)
和
values_t* values;
Run Code Online (Sandbox Code Playgroud)
填充了值[i] .value1和values [i] .value2对,它们可能是唯一的,也可能不是唯一的.
我们想填补
values_t* values_unique;
Run Code Online (Sandbox Code Playgroud)
只有值中的唯一对,按照它们首次出现在值中的顺序.
在C中执行此操作的理想方法是什么?
编辑:假设他们是正确的malloced指针; 上面只是伪代码.
有人能提醒我为什么会这样吗?
需要int*的函数可以作为输入(显然)
int *integer;
Run Code Online (Sandbox Code Playgroud)
但它也可以接受
&var->integer
Run Code Online (Sandbox Code Playgroud)
var为var_t*,其中var_t:
typedef struct {
int integer;
} var_t;
Run Code Online (Sandbox Code Playgroud)
为什么第二次被接受?
编辑:oopsy,问题是相同的,但var实际上是var_t*(而不是var_t)更精确.
这应该很简单.假设我们有一个不提供复制功能的库的结构.是否有一种简单的方法可以将该结构类型的变量复制到相同类型的新变量,而无需为每个子成员执行赋值?或者是否必须制作特殊的复印功能?
[这最初是在矩阵上,但我想它通常适用于任何变量]
说我们有Var1 * Var2 * Var3 * Var4.
其中一个零星地改变,其中一个是随机的.
是否可以最小化乘法?
如果我做
In case Var1 changes: newVar1 * savedVar2Var3Var4
Run Code Online (Sandbox Code Playgroud)
我注意到,每当Var2,Var3,Var4改变时,我需要重新计算savedVar2Var3Var4.
重新计算"已保存的组合"是否会违背目的?
我有一个奇怪的情况,只出现在gcc -O0 -g输出上,而不是在gcc -O3上,而不是在MSVC上,而不是在MSVC调试输出上.
void func(void) {
static int enabled;
if (!enabled) {
// do stuff
enabled = 1;
}
}
Run Code Online (Sandbox Code Playgroud)
gcc -O0 -g上出现的问题只是有时启用会返回0.但并非总是如此,只是在执行程序的某些罕见点上.该函数通常循环通过它.有什么可以让它感到困惑呢?可以在外部改变"启用"吗?但它在里面宣布了.
编辑:有一种方法可以在函数内部设置为0,但之前是一个大的fatf,它根本不打印[并且在测试条件下根本没有逻辑方式发生].它似乎根本不会发生任何明确启用= 0的事情.
EDIT2:它只由主线程调用.
编辑3:它变得更奇怪.它不会出现在linux gcc -O0 -g上,而只出现在mingw-w64 [gcc -O0 -g]上.
EDIT4:启用了rwatch和watch on似乎表明在if(!enabled)(应该只读)的某些情况下它被改变了.
EDIT5:在#tingw-w64的帮助下,如果'布尔序列'被反转,例如启用被初始化为1,然后设置为0,则通过非零值初始化静态变量,看起来"修复"它进入.data部分""所以有一个关于lcomm的问题""我假设你的代码中的其他地方有一个缓冲区溢出"
这个按预期工作:
if (clu.raw.butsnum) {
int i;
for (i=0;i<clu.raw.butsnum;i++){
if (clu.raw.buts[i] & RI_MOUSE_BUTTON_1_DOWN)
Com_QueueEvent( 0, SE_KEY, K_MOUSE1, qtrue, 0, NULL );
if (clu.raw.buts[i] & RI_MOUSE_BUTTON_2_DOWN)
Com_QueueEvent( 0, SE_KEY, K_MOUSE2, qtrue, 0, NULL );
if (clu.raw.buts[i] & RI_MOUSE_BUTTON_3_DOWN)
Com_QueueEvent( 0, SE_KEY, K_MOUSE3, qtrue, 0, NULL );
if (clu.raw.buts[i] & RI_MOUSE_BUTTON_4_DOWN)
Com_QueueEvent( 0, SE_KEY, K_MOUSE4, qtrue, 0, NULL );
if (clu.raw.buts[i] & RI_MOUSE_BUTTON_5_DOWN)
Com_QueueEvent( 0, SE_KEY, K_MOUSE5, qtrue, 0, NULL );
if (clu.raw.buts[i] & RI_MOUSE_BUTTON_1_UP)
Com_QueueEvent( 0, SE_KEY, K_MOUSE1, qfalse, 0, NULL ); …Run Code Online (Sandbox Code Playgroud) 为了使用pthreads,我使用了一个char*作为输入转换为void*.如果它稍后被转换为(char*),则可以打印并正常使用((char*)var).但是,如果有人(char*)var [i],其中'i'将帮助我们引用一个字符,但它不会.为什么?
例如MS说'表达式必须是指向完整对象类型的指针'.
例如
sprintf(pos,"%f ",cl.snap.ps.origin[0]); //don't start with strcat
sprintf(tmp,"%f ",cl.snap.ps.origin[1]);strcat(pos, tmp);
Run Code Online (Sandbox Code Playgroud)
精细.
同
sprintf(tmp,"%f ",cl.snap.ps.origin[0]);strcat(pos, tmp);
sprintf(tmp,"%f ",cl.snap.ps.origin[1]);strcat(pos, tmp);
Run Code Online (Sandbox Code Playgroud)
不好
正如标题所暗示的那样:假设我们有一个复杂的程序,我们想让它更快,但我们可以.我们能否以某种方式检测哪些循环或其结构的其他部分占用大部分时间来进行优化?
编辑:注意,重要的是假设软件非常复杂,我们不能逐个检查每个循环或其他结构,将定时器放在其中等.
当C表示全局[/ static]变量的启动值为零时,它是否也表示结构成员?什么是[全局/静态]指针的初始值?空值?