簡體   English   中英

“錯誤:下標值既不是數組,也不是指針,也不是矢量”,但是為什么呢?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM