我在 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 中一個二維陣列的值分配給另一個,以及如何從函式回傳二維陣列并將結果分配給現有的二維陣列。感謝您的任何幫助
uj5u.com熱心網友回復:
陣列是“不可修改的左值”,因此不能是賦值運算子的左引數。要復制陣列,只需使用memcpy(). 例如:
int a[row][col], b[row][col];
memcpy(a, b, sizeof(int[row][col]));
回傳陣列是一個棘手的話題,尤其是在您的情況下使用可變長度陣列時。它在執行緒中討論。
您必須回傳指向陣列的指標,void*或者在二維陣列的情況下,您可以回傳指向未定義大小陣列的不完整型別的指標int(*)[]。
此外,必須動態分配陣列以將其生命周期延長到分配函式結束之后。不再使用時記得釋放記憶體。
void* count_values(int x[row][col]){
int (*y)[col] = malloc(sizeof(int[row][col]));
...
return y;
}
int main() {
...
int (*b)[col] = count_values(a);
...
free(b);
}
uj5u.com熱心網友回復:
陣列物件不能分配給函式,不能從函式回傳,也不能作為函式呼叫的引數傳遞。在后一種情況下,函式呼叫引數被轉換為指向第一個元素的指標,并且宣告為 T 型別陣列的函式引數被“調整”為指向型別 T 的指標(例如void foo(int a[6])調整void foo(int *a)為 )。
由于main已經有兩個陣列a,b您可以將它們都傳遞給count_values,更改count_values為接受兩個陣列,如下所示:
void count_values(const int x[row][col], int y[row][col])
{
for (int i = 0; i < row; i )
{
for (int j = 0; j < col; j )
{
/* put next generation in y[i][j] here */
}
}
}
main并按如下方式呼叫它:
count_values(a, b);
print_state(b);
memcpy(b, a, sizeof(a));
(注:memcpy由 宣告#include <string.h>。)
您可以擁有一個 3-D 陣列并為每一代翻轉 和 的用法,而不是每次都復制a到:bint a[2][row][col];a[0]a[1]
int flip = 0;
int a[2][row][col];
int i, j, neighbours_alive;
// generate matrix
for (i = 0; i < row; i )
{
for (j = 0; j < col; j )
{
a[flip][i][j] = rand() % 2;
}
}
// print initial state
printf("Initial state:");
print_state(a[flip]);
char quit;
do {
printf("Press enter to print next generation. To quit, enter 'q'.");
scanf("%c", &quit);
// a[flip] contains the current generation,
// a[1-flip] will contain the next generation.
b = count_values(a[flip], a[1-flip]);
// flip the usage of a[0] and a[1]
flip = 1 - flip;
// a[1-flip] now contains the previous generation
// a[flip] now contains the new current generation
print_state(a[flip]);
} while(quit != 'q');
一個可能的改進是將行數和列數作為函式引數傳遞,而不是使用全域變數:
void create_row_line(int col)
{
/* print stuff */
}
int count_alive_neighbours(int row, int col, const int a[row][col], int r, int c)
{
int count = 0;
/* count neighbours */
return count;
}
void print_state(int row, int col, const int x[row][col])
{
/* print state */
}
void count_values(int row, int col, const int x[row][col], int y[row][col])
{
/* put next generation in y */
}
對應的函式呼叫:
create_row_line(col);
int neighbours_alive = count_alive_neighbours(row, col, x, i, j);
print_state(row, col, a[flip]);
count_values(row, col, a[flip], a[1-flip]);
uj5u.com熱心網友回復:
你提到的錯誤應該包括一些非致命的運行時錯誤,發生是因為函式被定義為回傳一個值,但沒有回傳陳述句......
int create_row_line()
{
printf("\n");
for (int i = 0; i < col; i )
{
printf(" -----");
}
printf("\n");
return 0;//added
}
要么制作函式原型void create_row_line(),要么return在底部添加一條陳述句。除了這些觀察到的行為,并且沒有你在帖子中進一步解釋,其他錯誤并不明顯,所以我將一般性地解決標題問題......
“如何用函式回傳C 中的二維陣列”
方法 1:此方法將說明如何創建和回傳一個二維陣列,該陣列由函式分配的單個連續記憶體塊組成。
//prtotype;
void * arr_2d_alloc (size_t x, size_t y);//implemented
void * arr_fill_2 (size_t x, size_t y, int array[x][y]);//implemented
void arr_print_2 (size_t x, size_t y, int array[x][y]);//left to do
int main(void)
{
int x=3, y=4;
//Create 2D array, return from function
int (*arr)[x] = arr_2d_alloc (x, y);
if(arr)
{ //pass 2D array in, return populated array out
(*aptr_2)[y] = *(int *)arr_fill_2(x,y,aptr_2);//filling array
//write routine output a 2D array, (see prototype above)
}
free(aptr_2);
return 0;
}
void * arr_2d_alloc (size_t x, size_t y)
{
int (*aptr_2)[x] = malloc( sizeof **aptr_2 ); // allocate a true 3D array
if(aptr_2)
{
memset(aptr_2, 0, sizeof **aptr_2);//zero array
}
return aptr_2;
}
void * arr_fill_2 (size_t x, size_t y, int array[x][y])
{
for(size_t i=0; i<x; i )
{
for(size_t j=0; j<y; j )
{
array[i][j] = 1 i*j;//some generic content
}
}
return array;
}
方法 2:
另一種方法是使用 VLA 排列將VLA陣列作為引數傳遞。這將允許更改函式中的值,然后回傳更新后的陣列。下面是一個通用的例子來說明。
請注意陣列大小在陣列本身之前的位置:
void populate2D(int x, int y, int (*arr)[x][y]);
int main(void)
{
int x=3, y=4;
int arr[x][y];
memset(arr, 0, sizeof arr);//initialize array
populate2D(x, y, &arr);//passing array sizes, and pointer to array
return 0;
}
void populate2D(int x, int y, int (*arr)[x][y])
{
for(int i=0;i<x;i )
{
for(int j = 0;j<y;j )
{
(*arr)[i][j] = i*j;
}
}
}
如果兩個陣列的陣列維度相同,例如在您的示例中,則可以創建一個類似的原型來滿足您的特定需求:
void update_2D_arrays(int x, int y, int (*arr1)[x][y], int (*arr2)[x][y])
{
// Do work using arr1 and arr2
}
uj5u.com熱心網友回復:
一種簡單但效率不高的方法是您可以定義一個結構來保存二維陣列。然后你可以簡單地從函式回傳 struct 物件并相互分配。
typedef struct {
int array[row][col];
} S2dArray;
S2dArray count_values(S2dArray x){
S2dArray y;
....
return y;
}
int main() {
S2dArray a, b;
....
b = count_values(a);
print_state(b);
a = b;
....
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/387368.html
下一篇:如何將兩張圖片放入一張圖片中
