2012-02-18 41 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

所以很明显在这一点上你需要知道一个物体是多大的物体。