2013-04-21 38 views
0

我寫了下面的代碼:警告:投以指針不同大小的整數

struct DVDARRAY 
{ 
    int length; 
    pDVD* dvds; 
}; 

typedef struct DVDARRAY DVDARRAY_t; 

//... 
int main() 
{ 
    int i; 
    char c; 
    DVDARRAY_t* dvds; 
    poDAOproperties props; 
    props = get_dao_properties(); 
    dvds = (DVDARRAY_t*) DVDDAO_read_raw_filter(props, "id = 1"); 
    printf("title->: %s", dvds->dvds[0]->title); 
} 

,並在另一個文件中的以下定義:

DVDARRAY_t* DVDDAO_read_raw_filter(poDAOproperties properties, char* filter) 
{ 
    DVDARRAY_t *dvds; 
    // ...some code... 
    dvds = malloc(sizeof(DVDARRAY_t)); 
    // ...some code... 
    return dvds; 
} 

現在我的問題:當我嘗試編譯這些文件我得到以下警告:

src/main.c: In Funktion »main«: 
src/main.c:80:9: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] 

main.c中的80號線正是行:

dvds = (DVDARRAY_t*) DVDDAO_read_raw_filter(props, "id = 1"); 

我該怎麼辦?

+0

我不會說德語。您能否將錯誤信息翻譯成英文,法文,拉丁文或匈牙利文? – 2013-04-21 19:12:57

+0

幫我們忙,在張貼到SO時使用'LANG = C gcc' – sehe 2013-04-21 19:12:59

+2

這兩個文件中是否定義了struct DVDARRAY_t? – Bort 2013-04-21 19:15:51

回答

2

您沒有列出上面的文件名,所以我只會將它們稱爲main.cdvd.c

main.c中,您撥打了另外未申報的功能DVDDAO_read_raw_filter。這告訴編譯器假定該函數存在,具有未知(但是固定的)參數集,並且返回值類型爲int

dvd.c中,您定義了具有固定(和已知)參數的函數DVDDAO_read_raw_filter,返回類型爲DVDARRAY_t*。 (想必你必須先重複DVDARRAY_t的定義。)

注意main.c相信的東西不真實約DVDDAO_read_raw_filter,即它具有返回類型int。這會導致您的編譯時診斷。通過運氣(你可以自己決定這是好還是壞運氣:-))儘管有這種不正確的信念,但程序仍能成功運行。

要解決該問題,請在調用它之前告訴main.c該函數,即聲明該函數。你也可以通過在編譯時標誌中添加-Wimplicit-function-declaration來得到gcc更明確的警告。

在一般情況下,它是把struct定義,typedef S,和函數聲明成一個頭文件是一個好主意(例如,dvd.h),然後#include,在各種C源文件,它們使用的定義和聲明的頭。這樣編譯器就可以將函數聲明與函數定義進行比較,並且不需要重複struct s的內容和的多個.c文件中的名稱。

+0

我在許多地方切割了main.c文件。所以你不能看到main.c已經包含DVDDAO.c(那是我的名字;-)) – schaeferpp 2013-04-22 16:02:08

+0

你真的是對的。我包含了「DVD.h」,其中struct DVD被定義,但沒有文件「DVDDAO.h」,謝謝你的回答! – schaeferpp 2013-04-22 18:37:07

相關問題