【问题标题】:SDCC / GBDK, Passing array of structs to functionSDCC / GBDK,将结构数组传递给函数
【发布时间】:2019-06-22 01:10:32
【问题描述】:

我正在尝试将一对结构数组传递给 C 中的函数。

我必须使用 SDCC 编译器,因为我正在使用 GBDK 为 Gameboy 进行编译。

当我传递结构数组时,出现如下所示的错误,但是,如果我将函数定义完全取出并剪切并粘贴整个函数体来代替函数调用,那么代码将编译并运行顺利。

为简洁起见,我只包括相关的代码。

// 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

【问题讨论】:

  • 如果将 VLA Point layer2[] 替换为纯指针 Point *layer2 会怎样?除此之外,我认为错误出在您没有显示的代码中。
  • your testgame.c 文件的第 457 行究竟是什么?

标签: c sdcc gbdk


【解决方案1】:

您可能需要将 Point* 传递给函数而不是 Point[],并且您可能需要传递数组的长度或使用一些标记值终止它们。较旧的编译器不接受带有括号的表示法。我什至没有意识到他们现在会接受。

多年来,C 中已经添加了一些东西,但编译器通常多年不支持它们。我记得编译器抱怨 int[5] 和 int[10] 是不同的类型,特别是在函数参数方面。在将数组传递给变量时,我几乎总是使用指针类型和长度。无论如何,我很确定这是你的问题。

【讨论】:

  • 感谢 Kamil 的快速建议和 Bob 的更详细答案。将函数调用更改为:void updateLayers( Point* layerA, Point* layerB, UINT16 limLo, UINT16 limHi, UINT16 limLast, INT8 layer ) 确实允许编译代码。还有一些其他问题,但它们与这个问题无关。奇怪,正如其他答案所说,struct myStruct stArray[] 对 C 有效。虽然它是小型设备 C 编译器,所以它可能是 C 的一个较小子集。
  • 对当前版本的C标准有效,相信是在标准的C99版本中添加的。由于您正在编程的设备至少早于 10 年,因此编译器或 SDK 可能需要您使用较旧的 ANSI C 标准来编译。如果您可以准确确定需要遵循的 C 标准并查看此处引用和描述的差异,它可能会为您省去一些麻烦:en.wikipedia.org/wiki/ANSI_C#C89
  • 众所周知,SDCC 不支持很多 C 功能。您需要查看 GBDK/SDCC 文档。你甚至不能将结构体作为函数参数传递。
猜你喜欢
  • 2015-02-24
  • 1970-01-01
  • 2011-04-06
  • 1970-01-01
  • 1970-01-01
  • 2021-11-02
  • 2019-05-03
相关资源
最近更新 更多