2012-01-06 98 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]); 

在最後一行,我得到編譯器警告。我還沒有使用這個變量,所以我不知道這個警告是否是一個問題,但是我覺得我的語法或者我的方法可能在設置該變量時不正確。

+0

'(*阿尼姆)[I] .next'是一個指向一個'結構動畫'; '&((* anim)[* tmp])'是一個'animation'的地址,一個沒有標籤的'struct'。 – pmg 2012-01-06 10:04:23

回答

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

沒有標籤(typedef struct animation { /* ... */ } 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 2012-01-06 09:46:19

+0

我不會說typedef增加了混亂,因爲它的目的是在代碼的其餘部分去除混亂,但我認爲它們通常被過度使用。當使用struct關鍵字時,我發現代碼更容易閱讀,尤其是在編輯器中沒有針對自定義類型的智能語法高亮顯示。 – yak 2014-09-29 02:46:51

相關問題