Сравнение двух экземпляров структуры - PullRequest
0 голосов
/ 27 октября 2019

У меня есть свой собственный тип данных, поскольку 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

}

Используя операторы print, я вижу, что функция isSameRoom не работает. Он генерирует случайные комнаты просто отлично, но бывают случаи, когда я запускаю программу, когда получаю одну и ту же комнату для A и B. Есть идеи, почему? Спасибо! :)

1 Ответ

1 голос
/ 27 октября 2019

Прежде всего, вы используете передачу по значению для этих структур, что довольно неэффективно. Вы должны передать по ссылке.

Во-вторых, как уже упоминалось, нельзя сравнивать строки фиксированного размера с == в C;Вы должны использовать strncmp или какую-либо другую структуру.

Возможно, лучшей идеей было бы сделать полное сравнение всей структуры с memcmp?

return memcmp(&A, &B, sizeof(struct ROOM)) == 0;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...