[英]“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.