题
我正在用 C 编写一个程序,并使用适用于 8051 架构设备的 SDCC 编译器。我正在尝试编写一个名为 GetName 的函数,该函数将从闪存读取 8 个字符并以某种形式返回字符数组。我知道在 C 中不可能返回数组,所以我尝试使用如下结构来实现:
//********************FLASH.h file*******************************
MyStruct GetName(int i); //Function prototype
#define NAME_SIZE 8
typedef struct
{
char Name[NAME_SIZE];
} MyStruct;
extern MyStruct GetName(int i);
// *****************FLASH.c file***********************************
#include "FLASH.h"
MyStruct GetName( int i)
{
MyStruct newNameStruct;
//...
// Fill the array by reading data from Flash
//...
return newNameStruct;
}
我还没有对此功能的任何引用,但是由于某种原因,我得到了一个编译器错误,上面写着“函数无法返回聚合”。这是否意味着我的编译器不支持返回结构的函数?或者我只是做错了什么?
解决方案
SDCC 尚不支持赋值和返回结构 (如果他们的 Wiki 是最新的):
尚未在 sdcc 中实现:
- 数据类型双精度。
- 结构体和联合体不能被赋值、作为函数参数或返回值传递。
- 在函数参数中注册存储类说明符。
也许你应该做一个
void GetName(MyStruct* ret_name, int i);
函数代替。
也就是说,你应该把函数原型 前 这 main
和 后 这 MyStruct
. 。如果没有原型,函数将被假定返回 int
.
MyStruct GetName(int i);
void main(void) { ...
(此外, main
函数应该是一个 int main(void)
或者 int main(int argc, char** argv)
. 。它不应该返回 void
.)
其他提示
所有后ANSI C89 / 90允许编译器返回结构对象。经典(迂腐)K&R C编译器没有。
然而,在任何情况下,必须首先声明的功能。即的前的你怎么称呼它。和你的结构里面char[8] Name
不是一个有效的声明。的有效形式为char Name[8]
。
您指针到阵列-返回函数被正确地声明。这是您要的尺寸宏地方不对头。应
#define NAME_SIZE 8
注意:没有=
字符
是,功能可以在返回C.结构上方的代码中有几个错误。有了一些变化,它编译正确下GCC(我没有安装SDCC来尝试,但请尝试以下代码。
struct MyStruct
{
char Name[8];
};
struct MyStruct GetName( int i)
{
struct MyStruct newNameStruct;
//...
// Fill the array by reading data from Flash
//...
return newNameStruct;
}
int main(void)
{
int NameIndex = 3;
struct MyStruct testStruct;
testStruct = GetName(NameIndex);
return 0;
}
我真的不希望使用C编译器,它没有实现结构调用和返回值,如KennyMT表明你没有。事实上,这样的编译器真的不应该被称为C编译器。如果编译器实现的结构在所有,通过返回值是不难实现。
无论如何,你的编译器工作,你会想是这样的:
typedef struct
{
char Name[NAME_SIZE];
} MyStruct;
void f( MyStruct * m ) {
strcpy( m->Name, "foo" );
}
int main() {
MyStruct ms;
f( & ms );
return 0;
}