【发布时间】:2022-01-18 17:37:33
【问题描述】:
我在 C 中有两个二维数组。我们称它们为 a[row][col] 和 b[row][col]。我在数组 a 中生成了随机值。现在我想编写一个函数来计算值,返回二维数组,输出将分配给数组 b(这是一个生命的护航游戏)。
#include <stdio.h>
#include <stdlib.h>
int row, col = 0;
//creates row boundary
int create_row_line()
{
printf("\n");
for (int i = 0; i < col; i++)
{
printf(" -----");
}
printf("\n");
}
//returns the count of alive neighbours
int count_alive_neighbours(int a[row][col], int r, int c)
{
int i, j, count = 0;
for (i = r - 1; i <= r + 1; i++)
{
for (j = c - 1; j <= c + 1; j++)
{
if ((i < 0 || j < 0) || (i >= row || j >= col) || (i == r && j == c))
{
continue;
}
if (a[i][j] == 1)
{
count++;
}
}
}
return count;
}
int print_state(int x[row][col]){
create_row_line();
for (int i = 0; i < row; i++)
{
printf(":");
for (int j = 0; j < col; j++)
{
printf(" %d :", x[i][j]);
}
create_row_line();
}
}
int count_values(int x[row][col]){
int y[row][col];
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
int neighbours_alive = count_alive_neighbours(x, i, j);
// printf("%d" ,neighbours_alive);
if ((x[i][j] == 0) && (neighbours_alive == 3))
{
y[i][j] = 1;
}
else if ((x[i][j] == 1) && (neighbours_alive == 3 || neighbours_alive == 2))
{
y[i][j] = 1;
}
else
{
y[i][j] = 0;
}
}
}
return y;
}
int main()
{
//change row and column value to set the canvas size
printf("Enter number of rows: ");
scanf("%d", &row);
printf("Enter number of cols: ");
scanf("%d", &col);
int a[row][col], b[row][col];
int i, j, neighbours_alive;
// generate matrix
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
a[i][j] = rand() % 2;
}
}
// print initial state
printf("Initial state:");
print_state(a);
char quit;
do {
printf("Press enter to print next generation. To quit, enter 'q'.");
scanf("%c", &quit);
int** b = count_values(a);
print_state(b);
int** a = b;
} while(quit != 'q');
return 0;
}
但是有一个错误。我是一个糟糕的 C 程序员,不知道应该怎么做才能获得理想的效果。将函数的输出分配给数组 b 后,我想分配 a=b 并从中循环以生成下一代。
所以问题是如何将 C 中的一个二维数组的值分配给另一个数组,以及如何从函数返回二维数组并将结果分配给现有的二维数组。感谢您的帮助
【问题讨论】:
-
你写了“但是有一个错误。”。请edit您的问题并复制并粘贴错误消息。在复制所有值的意义上,分配整个数组是不可能的。 (除非数组是结构的成员。)
-
更好的方法是保留两个二维数组,然后交换哪个是当前数组。
-
“如何在 C 中使用函数返回二维数组?”.. 一种选择是将指向数组的指针作为函数参数及其维度传递。该函数可以修改数组的内容,当返回其指针时,调用者可以访问更新的内容。另一个选择当然是将函数原型化为支持返回指向数组的指针的类型。数组对象本身不能传递,或用C返回,只能是对象的指针。