2012-01-26 10 views
0

私はこれを本当にかなり長い時間動かしていますが、どこがポブレムであるかはまだ分かりません。別のヘッダーファイルの1つのヘッダーファイルからの構造体

のは

#ifndef PLAYER_H_ 
#define PLAYER_H_ 
typedef struct player 
{ 
    char *name; 
    int gameId; 
    int socketfd; 
    int points; 
    int state; 
}player_struct; 
#endif /* PLAYER_H_ */ 

ヘッダファイルPlayer.h

てみましょうとの第二のヘッダファイルを持ってみましょうGame.h

#ifndef GAME_H_ 
#define GAME_H_ 

#include "Player.h" 

#define NUMBEROFPLAYERS 2 

typedef struct game 
{ 

//Here 

}game_struct; 

#endif /* GAME_H_ */ 

私のtypedefの目的は、このようなものを使用したタイプのplayer_structを持つことです。

これはソースファイルPlayer.cです。これは動作します。

#include "Player.h" 

player_struct *create_player 
{ 
    player_struct *player; 

    //body malloc .... 

    return player; 
} 

私はCとC++用のEclipseエディタを使用していますが、私はLinux GCCでコンパイルされたCプロジェクトを持っています。

ヘッダーファイルgame.hでPlayer.Cと同じ方法で、Player.hというヘッダーファイルをインクルードしても使用できないのはなぜですか?ヘッダファイルgame.h内の場所で

はできなかった

タイプ 'player_struct' ..私は

player_struct *players[NUMBEROFPLAYERS]; 

を使いたいが、それは貴婦人タイプは解決できなかったと書いているHERE // comented解決する

私は構造体とtypedefを書くために多くの方法を試しましたが、何も役立たなかった。 私は本当にそれを理解していないのですか?おかげさまで

EDITED: 私はplayer_struct(最初の行)を使用すると、問題がヘッダGame.hにあります。
最初

/* Player.h */ 
    #ifndef PLAYER_H_ 
    #define PLAYER_H_ 

    typedef struct player{ 
      char *name; // player name 
      int gameId; // what game 
      int points; //how money points 
      int socketfd; //socket descriptor of player 
      int state; 
     } player_struct; 


    //create player 
    player_struct *create_player(); 
    //delete player 
    void delete_player(player_struct *player); 


    #endif /* PLAYER_H_ */ 

/* Game.h */ 
    #ifndef GAME_H_ 
    #define GAME_H_ 
    #include "Player.h" 
    //#include "Card.h" 

    #define PLAYERSLEN 2 // number of players 
    #define GAMESLEN 10 //number of games 
    #define CARDSLEN 64 //cards in one game 


    typedef struct game{ 
     player_struct *players[PLAYERSLEN];//here is the problem 
     //card_struct *cards[CARDSLEN]; //her will be same problem 
     int active; 
     int playerOnTurn; 
     char *gameName; 
     int gameId; 

    }games_struct; 
    //typedef struct game game_struct; 

    //extern games_struct *games_array[GAMESLEN]; 

    void init_game(games_struct *game); 
    void run_game(games_struct *game); 
    void *end_game(games_struct *game); 



    #endif /* GAME_H_ */ 
+1

'* .c'コードファイルの*前処理された形式*を見てください。 Linuxでは、 'gcc -C -E Player.c> Player.i'でそれらを手に入れ、ポケベルやエディタを起動します。 'less Player.i'または' emacs Player.i' –

+0

ところで、あなたの関数 'create_player'は実際にプレーヤーを作成しません。無効なポインタを返します。 –

+0

この質問をチェックアウトhttp://stackoverflow.com/questions/228684/how-to-declare-a-structure-in-a-header-that-is-to-be-used-by-multiple-files-in -c –

答えて

0

のtypedefを使用せずにそれらを定義してください。

+0

私はそれが初心者のための悪いアドバイスだと思います。 'typedef'は本当に便利です... –

+0

私はそうは思わない。 typedefを作成すると、その名前はもはや使用できません。たとえば、 'struct foo foo'を実行できますが、' typedef something foo;はできません。 foo foo; '、つまり名前空間を汚染します。それは本当に多くを追加しません。 –

+0

多くの読みやすさが追加されています。例えばGtkがやっていることを見てください。 –

関連する問題