gpt4 book ai didi

c - 二维数组未打印预期答案

转载 作者:太空宇宙 更新时间:2023-11-04 05:54:47 25 4
gpt4 key购买 nike

当我遍历二维数组元素以显示每个 int 时,我得到一串数字。我尝试了很多不同的方法来修复它,但我认为这是我忽略的一个小问题,它将把所有问题整合在一起。

无论如何,我们在 header.h 中创建

    typedef struct gol{
int **board;
size_t size;
}gol;

在 Main.c 中

void GOL_Opton1(){

printf(" This is running Game Of Life on a default board\n");

gol* mainGOL = (gol*)malloc(sizeof(gol));

mainGOL = create_default_gol();
print_gol(mainGOL);
}

gol* create_default_gol()
{
gol* defaultGol = (gol*)malloc(sizeof(gol));

int defaultArray[20][20];
defaultGol->board = defaultArray;

for (i = 0; i<20; i++){
for (j = 0; j<20; j++){
defaultGol->board[i,j] = 0;
}
}
return defaultGol;
}

void print_gol(gol* g){
printf(" ------------------------------------------------\n");
for (i = 0; i<20; i++){
for (j = 0; j<20; j++){
printf("%d \t",g->board[i,j] );
}printf("\n");
}
}

选项 1,从菜单调用,然后 gol 中的棋盘数组填充一组 0 作为起点。

最佳答案

这里有一些地方需要改进。首先,在您的标题中,处理二维数组的更简单方法是存储指向第一个数组元素的指针以及大小。 (您的代码假定所有板都是正方形的。我们现在就这样做。)

typedef struct { /* No need to name the struct if you typedef it */
int *board; /* We point to the first int, then calculate offsets manually */
size_t size;
} gol;

然后我们可以手动计算数组中的位置。假设我们按以下顺序存储数字:

012
345
678

现在,假设我们想要第 1 行第 2 列中的元素 - 从零开始,所以实际上是中间行和最后一列 - 我们知道每行有三列,所以rows * columns_per_row + columns 将是要查找的元素。

void GOL_Opton1(){
printf(" This is running Game Of Life on a default board\n");

create_default_gol() 已经为您调用了 malloc。如果您首先将 malloc 的返回分配给 mainGOL,您将请求该内存但永远不会使用它,因为您会立即将另一个地址存储在 mainGOL 中。这将导致内存泄漏。

    gol* mainGOL = create_default_gol();

print_gol(mainGOL);
}

为了避免“魔数(Magic Number)”,我会使用#define。默认板尺寸也可以通过这种方式轻松调整。

#define DEFAULT_GOL_SIZE 20

gol* create_default_gol()
{
gol* defaultGol = (gol*)malloc(sizeof(gol));

声明一个数组通常是在栈上分配它。但是,你希望 create_default_gol 返回一个可以被外部函数使用的 gol,所以你需要在堆上分配它。 否则这可能会导致各种奇怪的行为。

    defaultGol->board = malloc(sizeof(int) * DEFAULT_GOL_SIZE * DEFAULT_GOL_SIZE);
defaultGol->size = DEFAULT_GOL_SIZE; /* and store the size */

这里,memset函数是一种常用的快速将整个板子设置为0的方法。

    /* memset avoids an ugly for loop here */
memset(defaultGol->board, defaultGol->size * defaultGol->size, 0);

return defaultGol;
}

void print_gol(gol* g){
size_t row, col;
printf(" ------------------------------------------------\n");

您希望您的 print_gol 函数能够处理大小不同于 20 的棋盘,因此将其概括为使用 size 成员。

    for (row = 0; row < g->size; row++) {
for (col = 0; col < g->size; col++) {

这就是上面讨论的偏移量发挥作用的地方。您的原始代码有 [i, j]不会按照您的意思行事;对于普通的二维数组,您需要 [i][j],但在这种情况下,我们手动进行偏移计算以允许任意大小。

            printf("%d \t", g->board[col + row*g->size] );
}
printf("\n");
}
}

关于c - 二维数组未打印预期答案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30090890/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com