[英]“error: subscripted value is neither array nor pointer nor vector”, but why?
我正在编写一个Tic-Tac-Toe程序,并且正在编写一个轮到玩家的功能。 我以指针b
的形式传递Tic-Tac-Toe板(3x3阵列)。 唯一的问题是,在最后一行中,标题出现错误。
下标值既不是数组,也不是指针,也不是矢量: b[PlayerCoordsX][PlayerCoordsY] = "x";
为了测试,我尝试了多个不同的=
值。 字符和数值均不能解决问题。
这是与(我希望的)相关位的缩写代码:
void PlayerTurn(int *b);
...
int main(void)
{
int Board[2][2];
int (*b)[2][2];
b = &Board;
...
void PlayerTurn(int *b);
...
return 0;
}
void PlayerTurn(int *b)
{
int PlayerCoordsX, PlayerCoordsY;
while ((PlayerCoordsX != 1 || PlayerCoordsX != 2 || PlayerCoordsX != 3) && (PlayerCoordsY != 1 || PlayerCoordsY != 2 || PlayerCoordsY != 3))
{
printf("Enter the X coordinate you would like to use:");
scanf("%i", &PlayerCoordsX);
PlayerCoordsX = PlayerCoordsX - 1;
printf("Enter the Y coordinate you would like to use:");
scanf("%i", &PlayerCoordsY);
PlayerCoordsX = PlayerCoordsY - 1;
}
b[PlayerCoordsX][PlayerCoordsY] = "x";
}
您的参数b
是指向整数的指针。 这意味着b[PlayerCoordsX]
是整数,因此b[PlayerCoordsX][PlayerCoordsY]
基本上试图使用int
(“下标值”)作为数组。
将2D数组传递给函数时,编译器需要知道数组中的列数。 这是因为将数组布置为线性内存块,并且编译器需要计算该线性数组中的索引。
所以你需要通过
void PlayerTurn(int b[][2])
{
}
但是#define
大小而不是使用'magic'值2
是一个好主意。
由于b
是指向int的指针,
b[PlayerCoordsX]
是整数,不能下标b[PlayerCoordsX]
。 您需要一个指向int的指针:
int **b;
那么您可以执行双重间接访问。 或者,如果您有一个平面数组,请计算索引而不是使用双索引:
b[PlayerCoordsY * numCols + PlayerCoordsX] = "x";
如果像这样定义董事会:
int board[3][3];
然后可以将函数签名更改为:
void PlayerTurn(int b[][3])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.