如何通过将其等同于具有 void 参数的函数来填充二维数组?

How to fill in a 2D array by equating it to a function with void parameters?

我正在使用二维数组制作一个小游戏。我尝试制作一个函数,让你从一个干净的板开始,并希望它以这样一种方式出现,即如果有意义的话,cleanboard 函数是一个右值。

#include <stdio.h>
#include <stdlib.h>
#define MAX 8
#define EMPTY 0
#define BLACK 1
#define WHITE -1


//Fills the 2D array with 0s and places the 4 starting pieces in the middle
int **cleanboard(void){
    int newboard[MAX][MAX];
    (*newboard)[MAX] = malloc(sizeof*newboard*MAX);

    for(int row=0; row<MAX; row++){
        for(int col=0; col<MAX; col++){
            newboard[row][col] = EMPTY;
        }
    }

    newboard[3][3] = WHITE, newboard[4][4] = WHITE;
    newboard[4][3] = BLACK, newboard[3][4] = BLACK;

    return newboard;
}


//Displays the board
void printboard(int arr[][MAX]){
    printf("   1 2 3 4 5 6 7 8\n");               //Top numbers

    for(int i=0; i<MAX; i++){
        for(int j=0; j<MAX; j++){
            if(j==0){printf("%d ", i+1);}        //Side numbers
            switch(arr[i][j]){                   //Print piece
            case 0: printf(" .");
                    break;
            case 1: printf(" b");
                    break;
            case -1: printf(" w");
                    break;
            }
        }
     printf("\n");
    }
}


int main(){
    int **board;
    board = cleanboard();
    printboard(board);
    return 0;
}

使用给定的代码,输出:

   1 2 3 4 5 6 7 8
1

然而,这个例子是板子的样子:

//Example 2D array:

int grid[MAX][MAX] = {{-1, 1, -1, 1, 0, -1, 1, 0},
                      {1, -1, -1, 1, 0, -1, -1, 1},
                      {1, 1, -1, 1, -1, 1, 1, 1},
                      {-1, 0, -1, -1, -1, 1, 1, -1},
                      {1, -1, 0, 1, 0, 1, 0, 0},
                      {0, 1, -1, 1, -1, -1, 1, -1},
                      {1, 1, 1, -1, 0, -1, -1, -1},
                      {0, -1, -1, -1, -1, 1, -1, 0}};

printboard(grid);

输出:

   1 2 3 4 5 6 7 8
1  w b w b . w b .
2  b w w b . w w b
3  b b w b w b b b
4  w . w w w b b w
5  b w . b . b . .
6  . b w b w w b w
7  b b b w . w w w
8  . w w w w b w .

cleanboard 函数未存储值或其他导致 printboard 函数停止的内容。 感谢任何帮助。

printboard的参数类型是你想要的。但是,数组到指针的转换只发生在多维数组的第一个维度上。您正试图在 int (*)[MAX]int ** 之间进行转换,这不是一回事。

cleanboard中,需要定义newboard为:

int (*newboard)[MAX] = malloc(sizeof*newboard*MAX);

那么函数本身应该定义为:

int (*cleanboard(void))[MAX] {

main中的board应该定义为:

int (*board)[MAX];

此外,您需要在内循环运行后在 printboard 中打印换行符。

以下建议代码:

  1. 创建看板
  2. 初始化板

现在,建议的代码:

#include <stdio.h>
#include <stdlib.h>
#define MAX 8
#define EMPTY 0
#define BLACK 1
#define WHITE -1


//Fills the 2D array with 0s and places the 4 starting pieces in the middle
int **cleanboard(void)
{
    int **newboard = malloc( MAX * sizeof( int ) );;

    for(int row=0; row<MAX; row++)
    { 
         newboard[row] = malloc( MAX * sizeof( int ) );
    }
    
    for(int row=0; row<MAX; row++)
    {
        for(int col=0; col<MAX; col++)
        {
            newboard[row][col] = EMPTY;
        }
    }

    newboard[3][3] = WHITE;
    newboard[4][4] = WHITE;
    newboard[4][3] = BLACK;
    newboard[3][4] = BLACK;

    return newboard;
}