我正在使用C语言编写程序,并将SDCC编译器用于8051架构设备。 我正在尝试编写一个名为GetName的函数,它将从Flash Memory中读取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;
}
我还没有对此函数的任何引用,但由于某种原因,我收到一个编译器错误,上面写着“函数无法返回聚合”。这是否意味着我的编译器不支持返回结构的函数?或者我只是做错了什么?
答案 0 :(得分:13)
SDCC doesn't support assignment and returning structs yet(如果他们的Wiki是最新的):
尚未在sdcc中实施:
- 数据类型为double。
- 无法分配结构和联合,作为函数参数传递或返回值。
- 在函数参数中注册存储类说明符。
也许你应该做一个
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
。)
答案 1 :(得分:6)
所有post-ANSI C89 / 90编译器都允许返回struct对象。经典(迂腐)K& R C编译器没有。
但是,无论如何你必须先声明这个函数。即之前你打电话给它。结构中的char[8] Name
不是有效的声明。有效表格为char Name[8]
。
正确声明了指向数组的指针返回函数。这是你的尺寸宏被打破了。应该是
#define NAME_SIZE 8
注意:没有=
个字符。
答案 2 :(得分:1)
是的,函数可以在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;
}
答案 3 :(得分: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;
}