我必须将一个指针传递给一个二维整数数组(实际上是一个生命游戏网格)。此功能无法知道宽度和高度。什么应该是功能原型?我试过了:
int function(int (*grid)[][], int height, int width);
会导致错误:'数组类型的元素类型不完整'
在不知道数组维度的情况下,我无法找出任何其他方法。
(有点解释:网格的宽度和高度是main.c文件中的#define' d,我需要的函数原型是在头文件中,所以它不能#t; t访问此#define ...)
谢谢
答案 0 :(得分:2)
除非您像我一样使用MS Visual Studio 2013 Express,并且手中有一个符合C99
标准的编译器,否则您可以执行以下操作:
int function( int height, int width, int (*grid)[height][width] );
所有您需要的是可变长度数组(VLA)功能,这是半兼容的MSVC所缺乏的。以下是它的示例用法:http://ideone.com/J3y2oi
答案 1 :(得分:1)
如果您有可用的C99或C11编译器,则可以在数组参数之前将数组的两个维度作为参数传递,如ThoAppelsin' answer所示。
如果你坚持使用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;
}
这需要一个普通的指针 - 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;
}
这将以额外的存储和初始化为代价恢复功能中的符号方便性。