массив как параметр функции - PullRequest
1 голос
/ 14 ноября 2011

Существует множество структур.

    static field fields[xsize][ysize];

Я хочу изменить его в функции

    void MoveLeft(pacman *Pacman, field **fields,int **play)

Но когда я отправляю это так

     MoveLeft(&Pacman,fields,play);

У меня ошибка.

поле - структура

     typedef struct
     {
    blossom blossoms;
    wall walls;
     }field;

где цвести и стена - еще одна структура

Ответы [ 3 ]

2 голосов
/ 14 ноября 2011

Я предполагаю, что ошибка заключается в следующем: двумерный массив fields[xsize][ysize] - это массив фиксированного размера (xsize / ysize - это определения или значения), а в памяти это не похоже на field**, потому что это указатель на указатель на поле в то время как fields[xsize][ysize] внутренне только один размерный массив фиксированного размера, где компилятор обрабатывает двойное индексирование для вас.

Так что вам нужно просто определить поля как field** и распределить их динамически.

См. Рисунок для более подробного объяснения: enter image description here

2 голосов
/ 14 ноября 2011

Хотя массивы и указатели несколько взаимозаменяемы в C, они не совсем одинаковы.В частности, массив массивов и массив указателей по-разному размещаются в памяти.

Вот способ создать массив указателей, который ссылается на те же данные, что и существующий массив массивов:

field* field_rows[xsize];
for (unsigned int i=0; i<xsize; i++) {
    field_rows[i] = fields[i];
}

Затем указатель на этот массив field_rows может быть передан в MoveLeft:

MoveLeft(&Pacman,field_rows,play);

Другое решение может состоять в том, чтобы вместо этого изменить объявление MoveLeft, чтобы взять указательв массив массивов:

void MoveLeft(pacman *Pacman, field fields[xsize][ysize], int **play);

MoveLeft(&Pacman,fields,play);
0 голосов
/ 14 ноября 2011

Хотя я не использую Windows, я предполагаю, что ваша ошибка похожа на эту:

error: cannot convert ‘field (*)[xx]’ to ‘field**’ for argument ‘2’ to ‘void MoveLeft(pacman*, field**,int**)’

Решением этой проблемы является простое приведение параметра fields к типу, который требуется функции:

MoveLeft(&Pacman, (field **) fields, play);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...