繁体   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