2017-06-12 92 views
0

我似乎在比较一个结构的两个成员时遇到了麻烦。 我可以在观察窗口看到所有日志中的序列都是0x000。在C语言中,比较一个结构的两个成员

这一个评估AllLogsNotZero为TRUE

for (i=0;(i<(3)&&(!AllLogsNotZero));i++) 
    { 
     UINT8 j; 
     j=i+1; 
     UINT16* comp1; 
     UINT16* comp2; 
     comp1 = (UINT16*) (&Data.log[i].Sequence); 
     comp2 = (UINT16*) (&Data.log[j].Sequence); 
     if ((Data.log[i].Sequence == Data.log[j].Sequence) == 0) 
      AllLogsNotZero=FALSE; 
     else 
      AllLogsNotZero=TRUE; 

这一个评估AllLogsNotZero为FALSE

for (i=0;(i<(3)&&(!AllLogsNotZero));i++) 
    { 
     UINT8 j; 
     j=i+1; 
     UINT16* comp1; 
     UINT16* comp2; 
     comp1 = (UINT16*) (&Data.log[i].Sequence); 
     comp2 = (UINT16*) (&Data.log[j].Sequence); 
     if (Data.log[i].Sequence == Data.log[j].Sequence) 
      AllLogsNotZero=FALSE; 
     else 
      AllLogsNotZero=TRUE; 

我不知道为什么。

+0

由于您在比较代码中未使用“comp1”或“comp2”,因此您应该从每个片段中删除这些行(其中4个) - 这是创建MCVE([MCVE])。将您的代码写入MCVE是个好主意。使用'UINT8 j = i + 1;'来初始化变量也是值得的,而不是使用两行。 (类似的注释也适用于'comp1'和'comp2'。) –

+0

2个循环之前'AllLogsNotZero'的初始值是多少? – chux

回答

2

看,如果语句

首先检查:

//You check if they are the same 
if (Data.log[i].Sequence == Data.log[j].Sequence) 

第二次检查

//You check if they are not the same 
if ((Data.log[i].Sequence == Data.log[j].Sequence) == 0) 

//Can be evaluated as: 
if (Data.log[i].Sequence != Data.log[j].Sequence) 
+0

但是我必须检查成员Data.log [1] .Sequence和Data.log [2]。确保所有成员都是0!因此我的代码有数字0。 – newb7777

+2

@ newb7777请理解,如果((Data.log [i] .Sequence == Data.log [j] .Sequence == 0)'不检查是否有任何/所有数据值都是'0'。它正在检查比较的结果,而不考虑实际的数据值。 Data.log [i] .Sequence == Data.log [j] .Sequence'的比较结果为'1'或'0',以显示数据是相等还是不相等。 –

+0

@Weather Vane,我明白了你的观点,结构成员将结果相互比较,如果不相等,则结果为0.否则,结果为**非零数字**(?)。我明白了为什么将非零数字结果与0比较总是'FALSE'。 – newb7777

3

我认为你正在做一个小题大做的。我想我会使用当前的变量名称编写循环的方式是:

bool AllLogsNotZero = true; 
for (int i = 0; i < 4; i++) 
{ 
    if (Data.log[i].Sequence == 0) 
    { 
     AllLogsNotZero = false; 
     break; 
    } 
} 
if (AllLogsNotZero) 
    …processing option for no zero logs 
else 
    …processing option for at least one log zero 

我们可以辩论的循环限制是否应为3或4(或其他某个值);它不是完全清楚你的代码,但你设置ji+1并使用它,并限制i< 3,所以当代码不使用i+1时,限制应该可能是4.最好是有一个枚举或#define值的限制 - 名称会显示您所测量的内容,而不仅仅是数字。

名称中的否定(AllLogsNotZero)也会使生活更加艰难;尽可能避免。例如:

bool LogsZero = false; 
for (int i = 0; i < 4; i++) 
{ 
    if (Data.log[i].Sequence == 0) 
    { 
     LogsZero = true; 
     break; 
    } 
} 
if (LogsZero) 
    …processing option for at least one log zero 
else 
    …processing option for no zero logs 
0
for (i=0;(i<(3)&&(!AllLogsNotZero));i++) 
    { 
     UINT16 Var1 = 0; 

     if (Data.log[i].Sequence == Var1) 
      AllLogsNotZero=FALSE; 
     else 
      AllLogsNotZero=TRUE; 

这个作品!

+0

使用'Var1'而不是简单地写'if(Data.log [i] .Sequence == 0)'有什么好处? –

+0

同意,我认为将变量作为16位数比较非常重要,所以我定义了它,但是您是正确的,它没有区别, – newb7777