我正在用 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);

函数代替。


也就是说,你应该把函数原型 mainMyStruct. 。如果没有原型,函数将被假定返回 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;
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top