CS50 绘制函数仅绘制零

CS50 draw function draws only zeros

这是我的第一个 Whosebug post。

我正在 edx 上学习 CS50 课程,目前我被困在问题集 3 上。我正在实施十五人游戏。 init() 函数初始化棋盘,绘图函数应该绘制它,但有一个问题。

draw 函数没有从 init() 函数中获取值。我对此进行了试验,在 init() 函数中,值是正确的,但在 draw 函数中,它们都是 0。

有什么问题?

/**
 * Initializes the game's board with tiles numbered 1 through d*d - 1
 * (i.e., fills 2D array with values but does not actually print them).  
 */
void init(void)
{
    //initializing the board
    int board[d][d];
    int x = (d*d) -1;
    //this loop goes trough each row
    for(int i = 0; i < d; i++){
        //this goes trough each column
        for(int j = 0; j < d ; j++){
            //this condition handles the case of swapping the 2 and 1 when the grid is even
            if( (d % 2) == 0 && (x == 2) ){
                //assigning the number 1
                board[i][j] = x-1;

                //going to the next column
                j++;

                //assigning the number 2
                board[i][j] = x;

                //setting the x = 0 so the loop can end
                x=0;
            }
            //this happens if the above conditions are not met
            else {
                //assigning the value to the grid
                board[i][j]= x;

                //decrementing the value
                x--;
            }
            //ending the loop
            if(x == 0){
                break;
            }
        }
        //ending the loop after the last tile is initialized
        if(x == 0){
            break;
        }
    }
}
/**
 * Prints the board in its current state.
 */
void draw(void)
{
    for(int i = 0; i < d; i++){
        for(int j = 0; j < d; j++){
            if(board[i][j] != 0){
                printf("%2i", board[i][j]);
            } else {
                printf("_");
            }
        }

    printf("\n");    

    }  

这可能对您有帮助:https://www.tutorialspoint.com/cprogramming/c_scope_rules.htm

基本上,您在 init 函数中所做的一切(变量名称和值)仅在该函数或块中有效。

要解决这个问题,您可以通过在主函数之上声明它来使 int board[d][d]; 成为一个全局变量(非常不鼓励!):

int board[d][d];

int main(int argc, char** argv){ ... }

或者您可以将变量 board[d][d] 作为函数 draw 的引用。 这可行但效率低下,因为将复制整个变量。

void draw(int board[][]){...}

或者您可以使用 c 命令 malloc 在堆上为 board[d][d] 分配内存,请参阅 man malloc。那么您的代码应该如下所示。

void *ptr = malloc(sizeof(board));    //you need to error check this. See man malloc

如果这样做,您只需将指针传递给函数中的数据。这样效率更高,因为数据保留在堆内存中。

您的 board[][] 是局部变量,因此只能在 init() 环境中工作。

我也在上CS50x课程,他们处理我们的fifteen.c文件实际上已经有一个board[][]在第27行声明的变量:int board[DIM_MAX][DIM_MAX];,这已经是全球。

所以您不需要创建另一个板,只需使用他们处理给我们的板即可。