Указатель на структуру внутри другой структуры. С - PullRequest
0 голосов
/ 16 марта 2012

В настоящее время я работаю над текстовой игрой на C, и у меня возникла проблема с изменением значений, когда происходят определенные события. Вот мой код структуры данных:

typedef struct player { 
        int maxhealth;
        int curhealth;
        int in_combat;
        monster c_enemy;
        char *class;
        char *condition;
        rooms c_room;
        inventory i;
        stats stats;
    } player;

Теперь, я думаю, моя проблема в том, что у меня в настоящее время есть c_room (текущая комната) в качестве комнат, а не указатель на комнаты. Это затронет меня позже, потому что мне нужно изменить такие вещи, как n_monsters внутри структурных комнат для текущей комнаты. Однако, когда я изменяю его, делая p.c_rooms.n_monsters - = 1; Я не уверен, что это изменяет фактическое значение n_monsters для комнаты, на которую я должен ссылаться. Я проверил это, оставив комнату, когда n_monsters равен 0, а затем вернулся и увидел, что он вернулся в 1, значение по умолчанию.

Так, да, как бы я указал в нужную комнату? Просто:

typedef struct player {         
        int maxhealth;
        int curhealth;
        int in_combat;
        monster c_enemy;
        char *class;
        char *condition;
        rooms *c_room; // Like this?
        inventory i;
        stats stats;
    } player;

// And then the assignment would look like:
c_room = *rooms[3]; <- an array of rooms for the dungeon in the game.

1 Ответ

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

Предполагая, что c_room является простой структурой, а не указателем, вы правы.

Если у вас есть

struct A {
  int v;
};

struct B {
  struct A a;
}

A a;
a.v = 3;

B b;
b.a = a;

Это фактически скопирует содержимое a внутри B.a, так как они назначены по значению. Это будут два разных A, любая модификация одного из них не будет отражена на другом.

В вашей ситуации я бы сделал что-то вроде:

struct Room {
  // whatever
}

struct Room rooms[MAX_ROOMS];

struct Player {
  struct Room *room;
}

Player p;
p.room = &rooms[index];

Теперь вы сможете правильно ссылаться на комнату по p->room, это будет просто указатель на фактическую комнату.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...