簡體   English   中英

比較結構的兩個實例

[英]Comparing two instances of a struct

我有自己的數據類型,因為 C89 不允許 bool 類型。 可悲的是我不能使用C99。

我已經測試了下面的代碼,我的程序甚至沒有識別出名稱不同。 這些名字工作得很好。 我將它們加載到結構的實例中。

struct ROOM roomList [MAX_ROOMS_COUNT]; 

我使用 memset 和 strcpy 從房間數組中復制房間列表。 測試這個給了我我想要的結果......

printf("%s", roomList[1].name)
printf("%s", roomList[2].name)
...
printf("%s", roomList[7].name)

rooms 數組有 7 個值。

#define MAX_ROOMS_COUNT 7

typedef enum {
  true = 1, 
  false = 0
} boolean;

struct ROOM {
  char name[8];
  char* type;
  int numConnections; 
  char* connections [MAX_CONNECTIONS_COUNT];
};

boolean isSameRoom(struct ROOM x, struct ROOM y) {
  //printf("Is Same Room, 1:%s, 2:%s\n", x.name, y.name);

  if (x.name == y.name) {
    //printf("ROOM IS SAME!"); 
    return true;
  }
  else {
    return false;         
  }
}

struct ROOM getRandomRoom() {
  int random = rand() % MAX_ROOMS_COUNT;
  return roomList[random]; 
}

void addRandomConnection() {     

  struct ROOM A;
  struct ROOM B;

  A = getRandomRoom();

  do {
    B = getRandomRoom(); 
  }while(isSameRoom(A, B) == true);

  //printf("Add Random Connection, 1:%s, 2:%s\n", A.name, B.name);   //for testing purposes

}

使用打印語句,我可以看到 isSameRoom function 不起作用。 它可以很好地生成隨機房間,但是當我運行程序時,我會為 A 和 B 獲得相同的房間。知道為什么嗎? 謝謝: :)

首先,您對這些結構使用按值傳遞,這是非常低效的。 你應該通過引用傳遞。

其次,正如其他人提到的,您不能在 C 中將固定大小的字符串與==進行比較; 您必須使用strncmp或其他一些結構。

也許更好的主意是將整個結構與memcmp進行整體比較?

return memcmp(&A, &B, sizeof(struct ROOM)) == 0;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM