2012-01-06 37 views
1

テクスチャとアニメーションデータを含むファイルを解析し、宣言したグローバル構造体にロードする関数を作成しています。特定の行でコンパイラーが "互換性のないポインタータイプからの割り当て"という警告を受け取りました。コードはたくさんあるので、ここで重要な部分を投稿するつもりです。次のように"互換性のないポインタ型からの代入"警告

まず、私は、私のアニメーションルーチン用構造体のデータ型を持っている:あなたが見ることができるように

typedef struct { 
     unsigned int frames; 
     GLuint *tex; 
     float *time; 
     struct animation *next; 
    } animation; 

は、構造体の最後の変数は、アニメーションがあるときにデフォルトに別のアニメーションへのポインタであります完了しました。ここ

は、ローディング関数の宣言である:

void LoadTexturePalette(GLuint **texture, animation **anim, const char *filename) 

関数は、従ってアニメーションの配列、二重ポインタに情報をロードします。各アニメーションのロードの最後に

は、整数は「次の」ポインタが指し示す先となる(ロードされているもののうち)どのアニメーションを表すファイルから引き出されます。

fread(tmp, 1, 4, file); 
    (*anim)[i].next = &((*anim)[*tmp]); 

最後の行でコンパイラの警告が表示されます。私はまだその変数を使用していないので、警告が問題であるかどうかはわかりませんが、その変数を設定する際に構文や方法が正しくない可能性があります。タグ(typedef struct animation { /* ... */ } animation;)なし

+0

'(*アニメーション)[i]は.next'はへのポインタであります'structアニメーション'; '&((* anim)[* tmp])'は 'アニメーション'のアドレスで、 'struct'はタグなしです。 – pmg

答えて

9
typedef struct { /* no tag in definition */ 
     unsigned int frames; 
     GLuint *tex; 
     float *time; 
     struct animation *next; /* pointer to an undefined structure */ 
    } animation; 

構造体の定義内の「構造体アニメーション」への言及は、まだとして、未定義の構造への参照です。その未定義の構造体へのポインタしか使用しないので、コンパイラは気にしません。だから、

、タグを追加---多分typedefを取り除く:それは唯一の混乱を追加します:)

typedef struct animation { /* tag used in definition */ 
     unsigned int frames; 
     GLuint *tex; 
     float *time; 
     struct animation *next; /* pointer to another of this structure */ 
    } animation; 
+0

どのような完璧な説明!これですぐに問題が解決しました!ありがとうございました! – eyebrowsoffire

+0

typedefがクラッタを追加するとは必ずしも言いませんが、その目的はコードの残りの部分を取り除くことですが、通常は過度に使用されていると思います。 structキーワードを使用すると、特にカスタム定義型のインテリジェントな構文強調がないエディタでは、コードを読みやすくなります。 – yak

関連する問題