传递 'a function' 的参数 1 从整数生成指针而不进行强制转换
passing argument 1 of 'a function' makes pointer from integer without a cast
可能是一个非常简单的问题,但我正在尝试制作一个井字游戏引擎,这是代码(稍后再放,因为尽管我关闭了三重坟墓,但如果低于出于某种原因)
我收到以下警告:
[警告] 传递 'resetboard' 的参数 1 使指针来自整数而不进行强制转换
[警告] 传递 'getnewboardO' 的参数 1 使指针来自没有转换的整数
[警告] 传递 'printboard' 的参数 1 使指针来自没有转换的整数
我是初学者,但我在另一个项目中以几乎相同的方式使用 2d bool 数组,所以我很困惑我做错了什么。
void getnewboardO(char board[3][3])
{
char inputrow;
int inputcoloumn;
scanf("%c%d", &inputrow, &inputcoloumn);
inputcoloumn--;
if(inputrow=='A')
board[0][inputcoloumn]='O';
if(inputrow=='B')
board[1][inputcoloumn]='O';
if(inputrow=='C')
board[2][inputcoloumn]='O';
}
void resetboard(char board[3][3])
{
int i, j;
for (i=0;i<2;i++)
for (j=0;j<3;j++)
board[i][j]='_';
for (j=0;j<3;j++)
board[2][j]=' ';
}
void printboard(char board[3][3])
{
printf("%c|%c|%c\n%c|%c|%c\n%c|%c|%c",board[0][0], board[0][1], board[0][2], board[1][0], board[1][1], board[1][2], board[2][0], board[2][1], board[2][2]);
}
main()
{
char board[3][3];
resetboard(board[3][3]);
printf("_|_|_\n_|_|_\n | |");
getnewboardO(board[3][3]);
printboard(board[3][3]);
}
让我们以这个函数声明为例。
void getnewboardO(char board[3][3]);
编译器会将数组类型的参数调整为指向数组元素类型的指针。
也就是这个函数声明等同于
void getnewboardO(char ( *board )[3]);
你甚至可以像这样声明函数
void getnewboardO(char board[100][3]);
或
void getnewboardO(char board[10][3]);
在任何情况下,编译器都会将两个函数声明调整为函数
void getnewboardO(char ( *board )[3]);
但是在函数调用中
getnewboardO(board[3][3]);
您正在使用 char
类型的阵列板中不存在的元素,因为两个索引的有效范围是 [0, 3)
.
就是这个表达式用作参数
board[3][3]
不表示声明的数组board
。它表示一个 char
类型的不存在的标量对象,由于整数提升又被转换为 int
.
类型
您需要将整个数组传递给函数。那就是你需要写的是
getnewboardO(board);
在这种情况下,数组指示符将被转换为指向其第一个元素的指针,类型为 char ( * )[3]
作为函数参数的类型。
可能是一个非常简单的问题,但我正在尝试制作一个井字游戏引擎,这是代码(稍后再放,因为尽管我关闭了三重坟墓,但如果低于出于某种原因)
我收到以下警告: [警告] 传递 'resetboard' 的参数 1 使指针来自整数而不进行强制转换
[警告] 传递 'getnewboardO' 的参数 1 使指针来自没有转换的整数
[警告] 传递 'printboard' 的参数 1 使指针来自没有转换的整数
我是初学者,但我在另一个项目中以几乎相同的方式使用 2d bool 数组,所以我很困惑我做错了什么。
void getnewboardO(char board[3][3])
{
char inputrow;
int inputcoloumn;
scanf("%c%d", &inputrow, &inputcoloumn);
inputcoloumn--;
if(inputrow=='A')
board[0][inputcoloumn]='O';
if(inputrow=='B')
board[1][inputcoloumn]='O';
if(inputrow=='C')
board[2][inputcoloumn]='O';
}
void resetboard(char board[3][3])
{
int i, j;
for (i=0;i<2;i++)
for (j=0;j<3;j++)
board[i][j]='_';
for (j=0;j<3;j++)
board[2][j]=' ';
}
void printboard(char board[3][3])
{
printf("%c|%c|%c\n%c|%c|%c\n%c|%c|%c",board[0][0], board[0][1], board[0][2], board[1][0], board[1][1], board[1][2], board[2][0], board[2][1], board[2][2]);
}
main()
{
char board[3][3];
resetboard(board[3][3]);
printf("_|_|_\n_|_|_\n | |");
getnewboardO(board[3][3]);
printboard(board[3][3]);
}
让我们以这个函数声明为例。
void getnewboardO(char board[3][3]);
编译器会将数组类型的参数调整为指向数组元素类型的指针。
也就是这个函数声明等同于
void getnewboardO(char ( *board )[3]);
你甚至可以像这样声明函数
void getnewboardO(char board[100][3]);
或
void getnewboardO(char board[10][3]);
在任何情况下,编译器都会将两个函数声明调整为函数
void getnewboardO(char ( *board )[3]);
但是在函数调用中
getnewboardO(board[3][3]);
您正在使用 char
类型的阵列板中不存在的元素,因为两个索引的有效范围是 [0, 3)
.
就是这个表达式用作参数
board[3][3]
不表示声明的数组board
。它表示一个 char
类型的不存在的标量对象,由于整数提升又被转换为 int
.
您需要将整个数组传递给函数。那就是你需要写的是
getnewboardO(board);
在这种情况下,数组指示符将被转换为指向其第一个元素的指针,类型为 char ( * )[3]
作为函数参数的类型。