0

我正在编写一个井字游戏程序,并且正在编写一个轮到玩家的函数。我以指针的形式传入井字棋盘(一个 3x3 数组)b。唯一的问题是在最后一行我得到了标题中的错误。

下标值既不是数组也不是指针也不是向量: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";
}
4

2 回答 2

0

您的参数b是一个指向整数的指针。这意味着它b[PlayerCoordsX]是一个整数,因此b[PlayerCoordsX][PlayerCoordsY]基本上是试图使用一个int(“下标值”)作为一个数组。

将二维数组传递给函数时,编译器需要知道数组中的列数。这是因为数组被布置为线性内存块,编译器需要计算该线性数组中的索引。

所以你需要通过

void PlayerTurn(int b[][2])
{
}

但这将是一个好主意#define,而不是使用“魔术”值2

于 2013-07-11T06:19:22.827 回答
0

因为b是一个指向 int 的指针,

b[PlayerCoordsX]

是整数,不能下标b[PlayerCoordsX]。您需要一个指向 int 的指针:

int **b;

然后你可以做双重间接。或者,如果您有一个平面数组,请计算一个索引而不是使用双索引:

b[PlayerCoordsY * numCols + PlayerCoordsX] = "x";

如果你像这样定义板子:

int board[3][3];

然后您可以将函数签名更改为:

void PlayerTurn(int b[][3])
于 2013-07-11T06:19:31.210 回答