2010-06-02 81 views
2

我知道這很簡單,但我似乎無法完成這項工作。傳遞2d數組在C中運行?

我的功能,像這樣:

int GefMain(int array[][5]) 
{ 
     //do stuff 
     return 1; 
} 

在我的主:

int GefMain(int array[][5]); 

int main(void) 
{ 
     int array[1800][5]; 

     GefMain(array); 

     return 0; 
} 

我提到this有用的資源,但我仍然得到錯誤"warning: passing argument 1 of GefMain from incompatible pointer type."我在做什麼錯?

編輯:

該代碼是由兩個文件,由編譯器鏈接在一起。我沒有使用gcc。上面的代碼正是我所擁有的,除了函數在main中聲明爲「extern int」。謝謝大家的時間。

+0

適用於使用gcc的我。您確定數組聲明和GefMain參數的列數是5嗎? – user85509 2010-06-02 16:25:49

+1

您發佈的代碼將編譯時沒有任何錯誤或警告。您必須張貼虛假代碼。請發佈真實的。 – AnT 2010-06-02 16:34:45

+0

ahh ok你沒有使用gcc ...即使使用'-std = c99 -pedantic'選項,gcc也不會發出警告(沒有-std = c99抱怨//風格評論)...知道編譯器可以幫助誰擁有你的編譯器來幫助你! – ShinTakezou 2010-06-02 17:13:49

回答

2

代碼很好。在一個單獨的文件中,這個編譯適合我使用gcc。

int g(int arr[][5]) 
{ 
    return 1; 
} 

int main() 
{ 
    int array[1800][5]; 
    g(array); 
    return 0; 
} 

我的猜測是,你#include荷蘭國際集團的錯誤的文件 - 或許是一個有不同的聲明GefMain。或者你也許還沒有保存聲明GefMain的文件,所以它仍然有一個參數int [][3],例如,它會導致警告。

我建議你發佈整個代碼來重現問題(當然你會去掉所有不需要重現它的東西)。但是,在那個時候,你很可能會自己解決它。

+0

是的,他只是接到警告。問題是爲什麼? – Simon 2010-06-02 16:25:20

+0

我的代碼實際上有兩個文件。這會改變什麼嗎?代碼中的唯一區別是主文件中的聲明具有「extern int」而不是int。 – Evelyn 2010-06-02 16:51:56

+0

同樣的事情......即使使用'-pedantic'選項和extern int也可以編譯好。 – ShinTakezou 2010-06-02 17:11:35

0

gcc將擴展您所擁有的內容(以及其他人已經獲得的成果)。相反,嘗試一下,它會更容易移植到其他c編譯器:

int g(int (* arr)[5]) 
{ 
    return 1; 
} 

int main() 
{ 
    int array[1800][5]; 
    g(array); 
    return 0; 
} 

或更好;

int g(int (* arr)[5], int count) 
{ 
    return 1; 
} 

int main() 
{ 
    int array[1800][5]; 
    g(array, sizeof(array)/sizeof(* array)); 
    return 0; 
} 

你得到一個警告,因爲任何尺寸的陣列成爲當它作爲一個arguement傳遞指針,上面給出了編譯器的線索,它應該指望這樣。

+3

它不會「更便攜」。 OP的代碼儘可能標準和便攜。 – AnT 2010-06-02 16:35:48

+0

不幸的是,我仍然得到同樣的錯誤。 – Evelyn 2010-06-02 17:09:22

+1

,順便說一下,答案是不正確的,因爲你的代碼是從標準(和便攜性)的角度來看是完美的(它不使用任何gcc分機,而且你根本沒有使用gcc!)!告訴我們你正在使用的是哪個編譯器(和版本)。 – ShinTakezou 2010-06-02 17:18:53

1

即使使用-std=c99 -pedantic選項,它也可以正確編譯。無論如何它看起來不錯......它真的是你想要檢查的代碼嗎?你正在使用的編譯器...?