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];
,这已经是全球。
所以您不需要创建另一个板,只需使用他们处理给我们的板即可。
这是我的第一个 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];
,这已经是全球。
所以您不需要创建另一个板,只需使用他们处理给我们的板即可。