【问题标题】:C - Pass a pointer on bi-dimensional array to a functionC - 将二维数组上的指针传递给函数
【发布时间】:2014-07-12 00:20:05
【问题描述】:

我必须将一个二维整数数组(实际上是一个生活游戏网格)上的指针传递给一个函数。这个函数无法知道宽度和高度。函数原型应该是什么?
我试过了:

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

导致错误:“数组类型的元素类型不完整”
在不知道数组维度的情况下,我想不出任何其他方法。

(稍微解释一下:网格的宽高在main.c文件中是#define的,而我需要的函数原型在头文件中,所以无法访问这个#define。 ..)

谢谢

【问题讨论】:

标签: c arrays function pointers parameters


【解决方案1】:

除非您像我一样使用 MS Visual Studio 2013 Express,并且手头有符合 C99 标准的编译器,否则您可以执行以下操作:

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

您所需要的只是可变长度数组 (VLA) 功能,这是半兼容的 MSVC 所缺乏的。这是它的一个示例用法:http://ideone.com/J3y2oi

【讨论】:

  • 这行得通!但我从未听说过 VLA 功能,您有关于该主题的文档/参考资料吗?那太好了:)谢谢
  • 您可以到达页面顶部的搜索框并输入“[c] variable length array”。列表中的第一个问题实际上并不是非常相关(它详细说明了一个微小但重要的问题,作为关于sizeof() 的答案的一部分),但许多其他问题是相关的。页面右侧的“相关问题”列表中还列出了许多密切相关的问题(可能重复)。
【解决方案2】:

如果您有可用的 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;
}

这需要一个普通的指向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;
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-28
    • 1970-01-01
    • 2016-04-27
    • 2014-05-09
    • 2018-12-08
    • 1970-01-01
    • 1970-01-01
    • 2014-12-31
    相关资源
    最近更新 更多