【发布时间】:2016-03-26 12:04:09
【问题描述】:
在给定的代码中,我有这些值(不可更改的代码):
#ifndef BOARD_H
#define BOARD_H
#define BOARD_WIDTH 10
#define BOARD_HEIGHT 10
typedef enum cell
{
EMPTY, //0
BLOCKED, //1
PLAYER //2
} Cell;
#define EMPTY_OUTPUT " "
Cell BOARD_1[BOARD_HEIGHT][BOARD_WIDTH];
Cell BOARD_2[BOARD_HEIGHT][BOARD_WIDTH];
void initialiseBoard(Cell board[BOARD_HEIGHT][BOARD_WIDTH]);
void displayBoard(Cell board[BOARD_HEIGHT][BOARD_WIDTH]);
我尝试过以多种方式编写 initialiseBoard(),例如:
void initialiseBoard(Cell board[BOARD_HEIGHT][BOARD_WIDTH])
{
int i, j;
int *temp = NULL;
for ( i = 0; i < 10; i++)
for (j = 0; j < 10; j++)
board[i][j] = EMPTY;
}
void initialiseBoard(Cell board[BOARD_HEIGHT][BOARD_WIDTH])
{
int i, j;
int *temp = NULL;
for ( i = 0; i < 10; i++)
for (j = 0; j < 10; j++)
{
if (i == 0 && j == 0)
{
*temp = EMPTY;
board[0][0] = temp;
}
else
board[i][j] = EMPTY;
}
}
因为我知道板子中 [0][0] 处的第一个单元格是一个指针,所以我尝试了很多方法来获取它的引用值,但它总是返回一个地址。请查看下面的代码并建议我一种方法。非常感谢!
void displayBoard(Cell board[BOARD_HEIGHT][BOARD_WIDTH])
{
int i, j;
for (i = 0; i <= 10; i++)
{
if (i == 0)
{
printf("\t|%s|", EMPTY_OUTPUT);
for (j = 0; j < 10; j++)
printf("%d|", j);
printf("\n");
}
else
{
for (j = 0; j <= 10; j++)
{
if (j == 0)
printf("\t|%d|", i - 1);
else
{
char* c;
/*unsigned *p = &board[0][0];
if (i == 1 && j == 1)
c = (*p == EMPTY) ? EMPTY_OUTPUT : "?";*/
if (i == 1 && j == 1)
c = (board[0][0] == EMPTY) ? EMPTY_OUTPUT : "?";
else
c = (board[i - 1][j - 1] == EMPTY) ? EMPTY_OUTPUT : "?";
printf("%s|", c);
}
}
printf("\n");
}
}
printf("\n%d\n", board[0][0]);
}
在 [0][0] 处,它总是返回一个地址。
【问题讨论】:
-
请构造一个minimal test-case。
-
指针是地址。你想打印这个指针指向的数据吗?就目前而言,您已将 tmp 指向的值设置为保存 0(空),然后将 [0][0] 的值设置为保存 tmp 的地址(指针,NOT 值 EMPTY) 位于。
-
第一个单元格与其他单元格没有区别,因此您无需以任何特定方式处理它。此外,您通过使用循环中的 0 来打印边界会使事情复杂化。只需在循环之外打印它们。您还没有展示如何调用这些函数。
-
请将编译器的警告/错误报告设置为合理的设置。您会立即收到@enhzflep 提到的问题的通知,因为您正在将
int*转换为int。 -
@SamiKuhmonen - 好建议,我没有想到这一点 - 我想我的评论对 Jay 回想起来有些无益。