atb
atb

Reputation: 973

Pointer to struct within different struct. C

I am currently working on a text based game in C and I'm having a problem altering values when certain events happen. Here is some of my data structure code:

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;

Now, I think my problem is that I currently have c_room (Current Room) as a rooms, instead of a pointer to a rooms. This affects me later because I need to alter things like n_monsters within the struct rooms for the current room. However, when I modify it by doing p.c_rooms.n_monsters -= 1; I'm not sure it alters the actual value of n_monsters for the room that I should be referring to. I've tested this by leaving a room when n_monsters is 0, and then coming back to see that it's back at 1, the default value.

So yea, how would I point to right room? Just:

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.

Upvotes: 0

Views: 1942

Answers (1)

Jack
Jack

Reputation: 133669

Assuming that c_room is a plain struct and not a pointer then you are right.

If you have

struct A {
  int v;
};

struct B {
  struct A a;
}

A a;
a.v = 3;

B b;
b.a = a;

This will actually copy the content of a inside B.a since they are assigned by value. They will be two different A, any modification to one of them won't be reflected on the other.

In your situation I would do something like:

struct Room {
  // whatever
}

struct Room rooms[MAX_ROOMS];

struct Player {
  struct Room *room;
}

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

Now you will be able to correctly reference to room by p->room, it will be just a pointer to the actual room.

Upvotes: 1

Related Questions