2012-02-18 62 views
2

我有這個貌似無辜的一段代碼:奇怪兼容的指針類型錯誤

void generate_heightmap(float **terrain) { 

} 

int main(int argc, char **argv) { 
    float terrain[1500][1500]; 

    generate_heightmap(terrain); 

    return 0; 
} 

但是,當我嘗試編譯它,我獲得這些奇怪的錯誤,這可能是這個原因嗎?

test.c||In function ‘main’:| 
test.c|8|warning: passing argument 1 of ‘generate_heightmap’ from incompatible pointer type [enabled by default]| 
test.c|1|note: expected ‘float **’ but argument is of type ‘float (*)[1500]’| 
||=== Build finished: 1 errors, 1 warnings ===| 

我有GCC 4.6.1和Ubuntu 11.11 64bit。

回答

5

二維數組與雙指針不兼容(考慮二維數組如何在內存中佈局,以及如何索引到二維數組需要知道其中一個維)。

這個確切的主題是在C FAQ的Question 6.18處理。

3

嘗試這樣:

void generate_heightmap(float terrain[][1500]) 

還有關於這個問題的C FAQ。基本上你可以將數組作爲指針傳遞給函數,因爲它們衰減爲指針。但它們不會遞歸衰減。

如果你認爲terrain[2]意味着什麼,這是有道理的。這意味着地形的第三個元素:獲取地址:terrain_addr + 2 * element_size

所以很明顯在這一點上你需要知道一個物體是多大的物體。