2

我正在通过实施康威的生命游戏来尝试 C 语言。

我正在尝试动态构建两个网格(int矩阵),一个用于当前网格,一个用于下一代网格,因此在确定下一代网格后,我只需交换指针即可。

起初我绝望地尝试定义指向网格的指针,如int * grid,你不能用第二组括号作为下标,[][]因为 - 显然 - 第一组括号返回一个 int。

我也尝试过类似的int * grid[HEIGHT][WIDTH]方法,但这会给将这样的一个指针分配给另一个指针时出现问题。(事实上​​,我不知道这在记忆中到底做了什么!)

在我天真的希望中,我认为在偶然发现双指针之后可以进行以下操作。程序编译,但在指示的行上运行时失败。(在 Windows 中,除了问题事件名称为 之外,我没有得到更多详细信息APPCRASH)。

免责声明:这不是实际的程序,只是问题的概念证明。

#include <stdio.h>
#include <stdlib.h>

int HEIGHT = 20;
int WIDTH = 20;

int ** curr_gen; // Current generation
int ** next_gen; // Next generation

/* Entry Point main */
int main(int argc, char** argv) {

    // Allocate memory for the grids
    curr_gen = malloc(sizeof (int) * WIDTH * HEIGHT);
    next_gen = malloc(sizeof (int) * WIDTH * HEIGHT);

    curr_gen[0][0] = 0; //<< PROGRAM FAILS HERE

    // Release heap resources
    free(curr_gen);
    free(next_gen);

    return 0;
}
4

3 回答 3

2

您可以简单地分配空间并将指针转换为定义 col 和 row 大小的类型。通过 [][] 查找指针很昂贵。并且以这种方式构建动态多维数组应该保留给 ragid 数组.. IE:仅在必要时使用它。

您可以定义一个类型:

typedef int MyArray[20][20];

然后将 malloc 指针转换为您想要的类型:

MyArray * curr_gen = (MyArray *) malloc(...);

但是,这假设您有一个常数,在编译时已知的高度和宽度。如果它必须是动态的,那么一定要使用索引到指针表的方法。但请记住,实际查找的指针必须在可能导致流水线停顿和潜在缓存未命中的最后一分钟加载。让它比通过 [row * 20 + col] 自己做数学要贵 100 倍。

所以你应该问自己的真正问题是“它需要快速运行,还是我希望代码看起来‘整洁’?”

于 2014-02-20T07:48:34.960 回答
0

http://c-faq.com/aryptr/dynmuldimary.html中描述了执行此操作的常用方法

于 2014-02-20T07:53:47.347 回答
0

您可以int*按照我的方式使用网格类型。

通过宏定义或函数将 2D 位置转换为 1D:

#define MATRIX2INDEX(x, y, width)  ((x) + (y) * (width))  // `width` is the max of x + 1 :)
int Matrix2Index(int x, int y, int width)
{
    return MATRIX2INDEX(x, y, width);
}

按 2D 位置访问数据int*

int* grid = (int*)malloc(sizeof(int) * WIDTH * HEIGHT);
grid[MATRIX2INDEX(0, 0, WIDTH)] = 0; // here: get the data you want by 2D position
free(grid); grid = NULL;
于 2014-02-20T08:17:40.550 回答