SDCC / GBDK, Передача массива структур в функцию - PullRequest
0 голосов
/ 29 января 2019

Я пытаюсь передать пару массивов структур функции в C.

Я должен использовать компилятор SDCC, так как я компилирую для Gameboy с использованием GBDK.

Когда я передаюВ массиве структур я получаю сообщение об ошибке, как показано ниже, однако, если я полностью вырежу определение функции и просто вырежу и вставлю все тело функции вместо вызова функции, то код компилируется и работает гладко.

Для краткости я включаю только соответствующий код.

// Struct definitions
struct point {
  UINT16 x, y;
  INT8 h;
  INT8 h_tot;
};

typedef struct point Point;

Point layer1[25];
Point layer2[49];

// Function declarations
void createMap2();
void updateLayers( Point layer2[], Point layer1[], UINT16 limLo, UINT16 limHi, UINT16 limLast, INT8 layer );

void createMap2(){
  UINT16 limLo   = 0;
  UINT16 limHi   = 7;
  UINT16 limLast = 5;
  INT8 layer = 2;

  updateLayers( layer2, layer1, limLo, limHi, limLast, layer );

  // do more stuff
}

void updateLayers( Point layer2[], Point layer1[], UINT16 limLo, UINT16 limHi, UINT16 limLast, INT8 layer ){
  // Do things within function
}

Когда я пытаюсь скомпилировать с использованием GBDK и компилятора SDCC, я получаю следующую ошибку:

C:\Users\terri\gbdk\testgame>..\bin\lcc -V -Wa-l -Wl-m -Wl-j -DUSE_SFR_FOR_REG -c -o testgame.o testgame.c
testgame.c(457):error *** Actual Argument type different from declaration 1

КогдаЯ удаляю вызов функции и просто вырезаю и вставляю полное тело функции вместо вызова функции, затем он плавно компилируется, и я получаю симпатичную небольшую рандомизированную карту тайлов геймбоя.

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

TestgameScreen

1 Ответ

0 голосов
/ 29 января 2019

Вам, вероятно, нужно передать Point * в функцию, а не Point [], и вам, вероятно, нужно будет передать длину массивов или завершить их с помощью некоторого дозорного значения.Старые компиляторы не принимают эту запись в скобках.Я даже не осознавал, что они примут это сейчас.

Вещи были добавлены в C на протяжении многих лет, но компиляторы часто не поддерживают их годами и годами.Я помню, как компиляторы жаловались на то, что int [5] и int [10] являются разными типами, особенно в отношении аргументов функции.Я почти всегда использую типы и длины указателей при передаче массива в переменную.В любом случае, я уверен, что это твоя проблема.

...