全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:4709
推到 Plurk!
推到 Facebook!

請問如何判斷兩個struct是否相等?

答題得分者是:maomfh
tsostony
一般會員


發表:2
回覆:1
積分:0
註冊:2008-07-16

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-04-04 17:54:34 IP:125.224.xxx.xxx 訂閱
小弟想請教是否有方法

直接判斷兩個struct是否相等

因為struct裡面的參數太多

所以判斷起來 程式會變非常龐大以及不好維護


所以在這誠心 請教各位前輩

謝謝指教
boss.tw
高階會員


發表:15
回覆:109
積分:194
註冊:2005-05-17

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-04-05 11:11:52 IP:122.116.xxx.xxx 訂閱
好像沒辦法這樣直接比較
寫個副程式專門去比較struct裡的值如何
bool Struct1EStruct2( Struct1, Struct2);
一樣回 true,不一樣回 false
maomfh
初階會員


發表:3
回覆:10
積分:27
註冊:2008-01-05

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-04-05 23:50:03 IP:218.163.xxx.xxx 訂閱
可以使用memcmp 比較兩個struct 的內容即可.
typedef _MyStruct {
int id;
char name[8];
} MyStruct;

MyStruct Struct1, Struct2;

// do sometime

// compare Struct1 and Struct2
if ( memcpy ( &Struct1, &Struct2 , sizeof(struct1)) {
// Stuct1 != Sturct2
}
else {
// Struct1 == Struct2
}
------
Maomfh
tsostony
一般會員


發表:2
回覆:1
積分:0
註冊:2008-07-16

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-04-06 00:41:42 IP:125.224.xxx.xxx 訂閱
真是謝謝你們提供的方法 

讓我收穫不少


結案得分 我給 maomfh


boss.tw 感謝你的方法喔 ^^
編輯記錄
tsostony 重新編輯於 2009-04-06 00:44:10, 註解 無‧
boss.tw
高階會員


發表:15
回覆:109
積分:194
註冊:2005-05-17

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-04-06 01:14:31 IP:122.116.xxx.xxx 訂閱
好像不可行
[code cpp]
struct MyStruct {
int id;
char *name;
} ;

MyStruct Struct1={0}, Struct2={0};
Struct1.id =1;
Struct1.name = "test1";
Struct2.id =2;
Struct2.name = "test2";
if ( memcpy ( &Struct1, &Struct2 , sizeof(Struct1) ) ){
int ttt =0; //不管 struct1 id and name 是否跟 struct2 一樣,看起來永遠進這裡
// Stuct1 != Sturct2
}
else {
int ttt =0;
// Struct1 == Struct2
}
[/code]
編輯記錄
boss.tw 重新編輯於 2009-04-06 01:15:38, 註解 無‧
ikk
尊榮會員


發表:4
回覆:413
積分:768
註冊:2003-06-30

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-04-06 09:41:34 IP:163.28.xxx.xxx 訂閱
memcpy --> memcmp
------
FPGA驗證, FPGA開發平台, http://smims.com
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#7 引用回覆 回覆 發表時間:2009-04-06 09:58:40 IP:60.249.xxx.xxx 未訂閱
當然不行。
要用這招之前,你要有良好的程式習慣。
就是要自己在取得空間後,要去把它 init
否則。對於字串來說是以 '\0' 就結束了。
但是以空間來說。是以 array size 為結束。
比對結果,自然就會不一樣了。
===================引 用 boss.tw 文 章===================
好像不可行
[code cpp]
struct MyStruct {
int id;
char *name;
} ;

MyStruct Struct1={0}, Struct2={0};
Struct1.id =1;
Struct1.name = "test1";
Struct2.id =2;
Struct2.name = "test2";
if ( memcpy ( &Struct1, &Struct2 , sizeof(Struct1) ) ){
int ttt =0; //不管 struct1 id and name 是否跟 struct2 一樣,看起來永遠進這裡
// Stuct1 != Sturct2
}
else {
int ttt =0;
// Struct1 == Struct2
}
[/code]
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#8 引用回覆 回覆 發表時間:2009-04-06 12:07:27 IP:116.59.xxx.xxx 訂閱
忍不住也要來插花了!!  除了memcpy 是筆誤外(應該是memcmp),還有一個超大的重點:
你的struct裡放的是一個指標,是放記憶體的位址,怎可能二個位址是會一樣呢??

所以,永遠都不會等於的啦!!! 若要比較字串裡的內容,就乖乖的取值出來比對吧!! 除非你改成 char name[256] 之類的!

了不??

補充一下: 暗黑說的應該是指當struct內宣告char name[256]之類的情形,這樣是可以比,但要注意256bytes要先init,才不易出錯!



===================引 用 boss.tw 文 章===================
好像不可行
[code cpp]
struct MyStruct {
int id;
char *name;
} ;

MyStruct Struct1={0}, Struct2={0};
Struct1.id =1;
Struct1.name = "test1";
Struct2.id =2;
Struct2.name = "test2";
if ( memcpy ( &Struct1, &Struct2 , sizeof(Struct1) ) ){
int ttt =0; //不管 struct1 id and name 是否跟 struct2 一樣,看起來永遠進這裡
// Stuct1 != Sturct2
}
else {
int ttt =0;
// Struct1 == Struct2
}
[/code]
------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
編輯記錄
aftcast 重新編輯於 2009-04-06 13:20:58, 註解 無‧
boss.tw
高階會員


發表:15
回覆:109
積分:194
註冊:2005-05-17

發送簡訊給我
#9 引用回覆 回覆 發表時間:2009-04-06 13:03:12 IP:60.250.xxx.xxx 訂閱
小弟不才,感謝賜教
問題出在 aftcast 說的地方,非 init
[code cpp]
MyStruct Struct1={0}, Struct2={0};
Struct1.id =2;
strcpy(Struct1.name, "test2");
//Struct1.name = "test2\0";
Struct2.id =2;
strcpy(Struct2.name, "test2");
//Struct2.name = "test2\0";
if ( memcmp ( &Struct1, &Struct2 , sizeof(Struct1) ) ){
int ttt =0;
// Stuct1 != Sturct2
}
else {
int ttt =0;
// Struct1 == Struct2
}
[/code]
編輯記錄
boss.tw 重新編輯於 2009-04-06 13:08:03, 註解 無‧
系統時間:2024-11-23 5:42:28
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!