2013-07-11 4 views
0

Я пишу программу Tic-Tac-Toe и пишу функцию для поворота игрока. Я прохожу на доске Tic-Tac-Toe (массив 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"; 
} 
+1

объявить как этот ничтожной PlayerTurn (междунар ** б) б должен быть двойной указатель – Chinna

+0

Почему вы объявить массив 3х3 как 'Board [2] [2]'? Это всего лишь 2x2. – Barmar

+0

Вы не можете позвонить в своей основной функции, как вы делаете – Alexis

ответ

0

Поскольку b является указателем на Int,

b[PlayerCoordsX] 

представляет собой целое число, вы не можете индексировать b[PlayerCoordsX]. Вам нужен указатель на указатель на int:

int **b; 

то вы можете сделать двойное косвенное действие. Или, если у вас есть плоский массив, вычислить индекс вместо использования двойных индексов:

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

Если определить плату, как вы делаете:

int board[3][3]; 

, то вы можете изменить функцию подпись:

void PlayerTurn(int b[][3]) 
+0

Большое спасибо. Это решило! – Bluesroo

+0

Как компилятор может вычислить индекс в 2D массиве при передаче 'int ** b', как вы предлагаете? –

+0

Вам нужно выделить каждую строку отдельно для этого, для вашего случая вы можете использовать метод из этого ответа: http: // stackoverflow.com/a/17583872/390913 – perreal

0

Ваш аргумент b является указателем на целое число. Это означает, что b[PlayerCoordsX] является целым числом, и поэтому b[PlayerCoordsX][PlayerCoordsY] в основном пытается использовать int («индексированное значение») в виде массива.

Когда вы передаете 2D-массив функции, компилятор должен знать количество столбцов в массиве. Это связано с тем, что массив равен laid out as a linear block of memory, а компилятору необходимо вычислить индекс в этом линейном массиве.

Так что вам нужно пройти

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

Но это было бы хорошей идеей, чтобы #define размер, вместо того, чтобы использовать значение «магический» 2.

Смежные вопросы

 Смежные вопросы