Предупреждение при прохождении 2d массива - PullRequest
1 голос
/ 08 мая 2009

У меня есть следующая функция

void initBoard(int * board[BOARD_ROWS][BOARD_COLS]){
  int z = 0;
  for( z = 0; z<10; z+=1){
     int l;
     for( l = 0; l<10; l+=1){
        board[z][l] = 0;
     }
  }
}

и из основного я называю это как

  int plBoard[10][10];
  initBoard(&pcBoard);

при компиляции работает, но я получаю предупреждение: предупреждение: передача аргумента 1 'initBoard' из несовместимого типа указателя массив - это целое число, и функция ожидает указатель типа int, которому я передаю адрес типа int. Что с ним не так?

Ответы [ 4 ]

12 голосов
/ 08 мая 2009

Помимо очевидной опечатки в вашем вопросе (определение plBoard, но использование pcBoard), вам не нужно передавать массивы с оператором address-of (&), так как они ' автоматически преобразуется в адреса.

Но ваша incompatible type проблема вызвана использованием:

int * board[BOARD_COLS][BOARD_ROWS]

, который на самом деле является двумерным массивом int указателей (технически массив массивов указателей на int), а не целых чисел, как вы ожидали.

Вы должны использовать:

void initBoard(int board[BOARD_COLS][BOARD_ROWS]) {  // <-- remove "*"
: : :
}
int plBoard[10][10];
initBoard(plBoard);                                  // <-- remove "&"
1 голос
/ 08 мая 2009

Я не совсем уверен, но я верю, что это потому что:

initBoard ожидает массив массивов , указывающих на целое число s.

Однако plBoard является указателем на массив массива целых чисел s

0 голосов
/ 08 мая 2009

Просто чтобы быть на той же странице .. Я полностью согласен с Пакс ..

Blockquote int pcBoard [10] [10]; Цитата initBoard (& pcBoard);

Теперь предположим, что pcBoard [0] [0] указывает на 101-ю позицию (32-битный адрес) и так далее и так далее ... То, что вы передаете по значению, & pcBoard - это 32-битный адрес pcBoard [0] [0]. Так что когда функция

Цитата void initBoard (int * board [BOARD_ROWS] [BOARD_COLS]) {

Использует это .. отображает ошибку о том, что он ожидает двухмерный массив, тогда как то, что он получает в 32-битном адресе, который составляет 4 байта (int).

Просто подсказка, вам не нужно указывать обе доски [BOARD_ROWS] [BOARD_COLS] при прохождении .. вы можете легко исключить BOARD_ROWS и просто указать BOARD_COLS.

0 голосов
/ 08 мая 2009

Технически вы отправляете адрес памяти указателя в initBoard (). Когда вы объявляете массив (в данном случае plBoard), он указывает на адрес памяти, где непрерывная память хранит ваши элементы данных ... так что излишне говорить это ...

int plBoard[10][10];  initBoard(&pcBoard);

У Пакс есть твой ответ, я просто плакал, потому что ты еще не пометил его как ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...