3

我正在使用 C 语言编写程序,并将 SDCC 编译器用于 8051 架构设备。我正在尝试编写一个名为 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;
}

我还没有对这个函数的任何引用,但由于某种原因,我收到一个编译器错误,上面写着“函数无法返回聚合”。这是否意味着我的编译器不支持返回结构的函数?还是我只是做错了什么?

4

4 回答 4

14

SDCC 还不支持赋值和返回结构(如果他们的 Wiki 是最新的):

尚未在 sdcc 中实现:

  • 双数据类型。
  • 结构和联合不能作为函数参数或返回值进行赋值、传递。
  • 在函数参数中注册存储类说明符。

也许你应该做一个

void GetName(MyStruct* ret_name, int i);

代替功能。


也就是说,您应该将函数原型放在.之前main之后MyStruct如果没有原型,则假定函数返回int

MyStruct GetName(int i);
void main(void) { ...

(另外,main函数应该是int main(void)or int main(int argc, char** argv)。它不应该返回void。)

于 2010-03-10T19:12:33.090 回答
6

所有后 ANSI C89/90 编译器都允许返回结构对象。经典(迂腐)的 K&R C 编译器没有。

但是,无论如何,您必须先声明该函数。即你打电话之前。并且char[8] Name在您的结构内部不是有效的声明。有效的形式是char Name[8]

您的指向数组返回函数的声明正确。损坏的是您的尺寸宏。应该

#define NAME_SIZE 8 

注意:没有=字符。

于 2010-03-10T19:15:12.873 回答
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;  
 }
于 2010-03-10T19:19:38.813 回答
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;
}
于 2010-03-10T19:55:04.260 回答