2012-03-16 49 views
0

現在、C言語のテキストベースのゲームで作業していますが、特定のイベントが発生したときに値を変更する際に問題が発生しています。ここに私のデータ構造のコードの一部です:異なる構造体内の構造体へのポインタ。 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に戻ることを確認するために戻ってきて、これをテストしました。

だから、私はどのように正しい部屋を指していますか? ジャスト:c_roomは、あなたが正しいプレーン構造体ではなくポインタであると仮定すると

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. 
+0

「部屋」が何であるか教えてください。それは 'typedef'-ed' struct'ですか? –

+1

は妥当です。何かがあなたにこれが働いていないと思うのですか? – mfrankli

+0

あなたはc_room =&(room [3])が必要だと思います。あなたが部屋を持っている場合は// 4部屋を指し示す* c_room; – Glenn

答えて

1

あなたがそれらが値によって割り当てられているので、実際にB.aaの内容をコピーします

struct A { 
    int v; 
}; 

struct B { 
    struct A a; 
} 

A a; 
a.v = 3; 

B b; 
b.a = a; 

これを持っている場合。彼らは2つの異なったAになります、それらのいずれかへの変更は、他に反映されません。私のようなものだろうあなたの状況では

:あなたは正しくp->roomで部屋に参照することができるようになります今

struct Room { 
    // whatever 
} 

struct Room rooms[MAX_ROOMS]; 

struct Player { 
    struct Room *room; 
} 

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

を、それが実際の部屋への単なるポインタになります。

+0

これは本当に役に立ちました。そうです、私は " - " "のためにすべての"。 "を変更して変更するのは非常に厄介でしたが、今は完全に動作します!ありがとうございました。 – atb

+0

'valgrind'を使ってメモリリークがないことを確認するのを忘れないでください。 –

関連する問題