2014-07-12 168 views
1

我必须将一个二维整数数组(其实是一个Life游戏网格)上的指针传递给一个函数。此功能无法知道宽度和高度。函数原型应该是什么?
我尝试:C - 将二维数组上的指针传递给函数

int function(int (*grid)[][], int height, int width); 

这导致错误:数组类型具有不完整的元素类型“
我无法找出任何其他的方法来做到这知道内部消除阵列的尺寸。 (有点解释:网格的宽度和高度在main.c文件中是#define'd,我需要的函数原型是在头文件中,所以它不能访问这个#define ...)

谢谢

+0

Here:http://stackoverflow.com/questions/8767166/passing-2d-array-to-function –

回答

2

除非你使用MS Visual Studio的2013 Express作为我做的,以及在你的手中一C99符合标准的编译器,你可以做到以下几点:

int function(int height, int width, int (*grid)[height][width]); 

所有你需要的是可变长度数组(VLA)函数这是半合规MSVC所缺乏的。下面是其一个例子用法:http://ideone.com/J3y2oi

+0

这工程!但是我从来没有听说过有关VLA的功能,您是否有关于该主题的文档/参考资料?这将是伟大的:)谢谢 – Magix

+0

你可以到达页面顶部的搜索框并键入''[c]可变长度数组''。列表中的第一个问题实际上并不是非常相关的(它将细节作为关于'sizeof()'的答案的一部分来详细说明,但其他许多问题都是相关的。还有很多密切相关的问题 - 可能出现的重复 - 在页面的RHS的“相关问题”列表中列出。 –

1

如果你有C99或C11编译器可用的,那么就可以在阵列参数之前传递数组作为参数的这两个方面,如图ThoAppelsinanswer

如果您遇到了C89编译器,那么您必须更加努力地努力—。到目前为止,最简单的解决方案是使标题中的#define尺寸可用;那么你可以这样写:

int function(grid[HEIGHT][WIDTH]) { ... } 
int function(grid[][WIDTH]) { ... } 

如果你不能做到这一点,那么你就必须考虑修改在函数的代码或main.c的数据结构。

修改功能是指:

int function(int height, int width, int *grid) 
{ 
    int i, j; 
    for (i = 0; i < height; i++) 
     for (j = 0; j < width; j++) 
      grid[i*width + j] = 0; 
    return j; 
} 

这需要一个普通的指针-TO-int并执行指数计算明确,而不是简单地写两个标。你的主要代码可能有:

int grid[HEIGHT][WIDTH]; 

i = function(HEIGHT, WIDTH, &grid[0][0]); 

另一种方法就是创建一个二级结构,一组指针的指针,在main()

int grid_rows[HEIGHT]; 
for (i = 0; i < HEIGHT; i++) 
    grid_row[i] = grid[i]; 

i = function(HEIGHT, WIDTH, grid_rows); 

现在的定义是:

int function(int height, int width, int **grid) 
{ 
    int i, j; 
    for (i = 0; i < height; i++) 
     for (j = 0; j < width; j++) 
      grid[i][j] = 0; 
    return j; 
} 

这会以额外存储和初始化为代价恢复函数中的符号便利性。