2012-12-18 136 views
1

的價值觀,我有兩個數據結構:比較兩個數據結構

typedef struct{ 
    int a; 
    int b; 
    int c; 
}EVENTS; 

EVENTS typeone[20]; 
EVENTS typetwo[20]; 

這些已經排滿。 typeone已被填滿,直到typeone [5]和typetwo至typetwo [8]。

我只是想比較typeone和typetwo的前六個,看看是否有自己的所有成員平等的。

有沒有辦法做typeone[1] == typetwo[1] 基本上比較數據結構[1]內的所有值。 是否有一個簡短的方法來做到這一點,或者我將不得不通過每個成員循環,並分別進行比較?

謝謝

回答

1
typedef struct{ 
    int a; 
    int b; 
    int c; 
}EVENTS; 

#pragma pack(1) 
    EVENTS typeone[20]; 
    EVENTS typetwo[20]; 
#pragma pack() 

int equal(EVENTS* v1, EVENTS* v2) 
{ 
     return 0==memcmp(v1, v2, sizeof(*v1)); 
} 

備註#pragma pack(1)。它確保結構中沒有填充字節。這樣memcmp不會嘗試比較填充字節和比較比場逐場法路得更快,但在這種情況下,性能不會受到不利影響,採取:

 typedef struct{ 
     char a; 
     long b; 
    } somestruct; 

#pragma pack(1) 
    somestruct foo; 
#pragma pack() 

檢索foo.b將採取更多的機器代碼比在填充結構的情況下,因爲它會錯過它可以與單個32位指令被檢索字對齊的位置時,它必須具有四個字節讀拾取出來,然後組裝從這四個部分進入目標寄存器。因此,考慮性能影響。

此外,檢查,如果你的編譯器支持#pragma pack。大多數現代編譯器都這樣做,但例外情況可能仍會發生

3

這是一個comp.lang.c FAQ。簡而言之,不,C不支持與==運算符進行結構比較(常見問題中的答案說明了爲什麼在一般情況下這很困難的幾個原因)。你必須編寫自己的函數,並按成員比較成員。正如指出的那樣,是memcmp()訪問填充字節時由於未指定的行爲保證方式。

int eventsequal (const EVENTS *const a, const EVENTS *const b) 
{ 
    if (a->a != b->a) return 0; 
    if (a->b != b->b) return 0; 
    if (a->c != b->c) return 0; 
    return 1; 
} 

然後你的榜樣typeone[1] == typetwo[1]變得

if (eventsequal (typeone + 1, typetwo + 1)) { 
    /* They're equal. */ 
} 
+1

依我看,正確的說法是「未定值」爲填充,而不是「未定義行爲」。 –

+0

謝謝,我的意思是寫,但沒有,是「由於訪問填充字節時未定義的行爲。」我已更正了文字。 – Jens

+0

嗯,訪問填充字節不應該是未定義的行爲,這會抵觸「該值可能被複制到類型爲'unsigned char [n]'的對象中(例如'memcpy');所產生的一組字節被調用該值的對象表示。「,不是嗎?不,我的意思是「當一個值存儲在結構或聯合類型的對象中,包括成員對象中時,與任何填充字節對應的對象表示的字節都帶**未指定的值**。」 –

2

爲了避免填充的問題,你必須單獨比較的字段。這並不一定是所有的可怕:

#include <stdbool.h> 

bool EVENTS_equal(const EVENTS *e1, const EVENTS *e2) 
{ 
    return e1->a == e2->a && e1->b == e2->b && e1->c == e2->c; 
} 

然後就循環:

size_t i; 
bool equal = true; 

for(i = 0; i < 6; ++i) 
{ 
    if(!EVENTS_equal(typeone + i, typetwo + i)) 
    { 
    equal = 0; 
    break; 
    } 
} 

這不是那麼多的代碼真的,當然你可以平凡封裝在跨功能的循環-compares 2個EVENTS陣列的ñ第一時隙。