Ожидаемый список спецификаторов-определителей перед 'комнатами' - PullRequest
1 голос
/ 05 марта 2012

Я работаю над DnD-Text-Based-Style C игрой, и у меня проблема с компиляцией моей структуры.Вот что у меня есть для структуры:

typedef struct stats {                  //
    int strength;               //
    int wisdom;                 //
    int agility;                //
} stats;

typedef struct rooms {
    int n_monsters;
    int visited;
    rooms nentry;
    rooms sentry;
    rooms wentry;
    rooms eentry;
    monster *monsters;
} rooms;

typedef struct monster {
    int difficulty;
    char *name;
    char *type;
    int hp;
} monster;

typedef struct dungeon {
    char *name;
    int n_rooms;
    rooms *rooms;
} dungeon;

typedef struct player {
    int maxhealth;
    int curhealth;
    int mana;
    char *class;
    char *condition;
    stats stats;
    rooms c_room;
} player;

typedef struct game_structure {
    player p1;
    dungeon d;
} game_structure;

Когда я ее скомпилирую, я получаю ошибку: structure.h: 21: error: спецификатор-спецификатор-список перед 'rooms'

Можете ли вы помочь мне понять, почему это так?Это потому, что я называю комнаты из структуры, которая содержит комнаты?Пожалуйста, помогите.

Ответы [ 3 ]

1 голос
/ 05 марта 2012

Есть много проблем с этим фрагментом кода. Во-первых, определение структуры должно знать, сколько памяти выделить, и не может этого сделать, если оно содержит тип, который не был полностью определен (вот почему люди рекомендуют использовать указатель, поскольку размер указателя равен известно во время компиляции).

Однако, и это важно, простое изменение указателей не решит проблему, поскольку первая комната * встречается до того, как соответствующий typedef завершится. Вам нужно написать что-то вроде:

struct rooms {
    int n_monsters;
    int visited;
    struct rooms *nentry;
    struct rooms *sentry;
    struct rooms *wentry;
    struct rooms *eentry;
    monster *monsters;
} rooms;

или выполнить предварительное объявление (typedef struct rooms rooms;). Вам также необходимо убедиться, что тип монстра определен или хотя бы имеет предварительное объявление.

0 голосов
/ 05 марта 2012
typedef struct rooms {
    int n_monsters;
    int visited;
    rooms nentry;
    rooms sentry;
    rooms wentry;
    rooms eentry;
    monster *monsters;
} rooms;

Похоже, rooms является рекурсивным типом, вы, конечно, хотели использовать вместо него указатели:

typedef struct rooms rooms;

struct rooms {
    int n_monsters;
    int visited;
    rooms *nentry;
    rooms *sentry;
    rooms *wentry;
    rooms *eentry;
    monster *monsters;
} rooms;
0 голосов
/ 05 марта 2012

Вы не можете иметь переменную с тем же именем, что и тип. Ваша структура dungeon имеет это поле:

rooms *rooms;

Измените это имя переменной (или, альтернативно, переименуйте тип) на другое. То, что у вас есть сейчас, аналогично:

int int;

Что явно не сработает!

...