2017-06-12 81 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