Все ли компиляторы C позволяют функциям возвращать структуры?

StackOverflow https://stackoverflow.com/questions/2419763

  •  19-09-2019
  •  | 
  •  

Вопрос

Я работаю над программой на 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;
}

У меня пока нет ссылок на эту функцию, но по какой-то причине я получаю ошибку компилятора, которая гласит "Функция не может вернуть aggregate". Означает ли это, что мой компилятор не поддерживает функции, возвращающие структуры?Или я просто делаю что-то не так?

Это было полезно?

Решение

SDCC пока не поддерживает присваивание и возвращающие структуры (если их 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.)

Другие советы

Все компиляторы после ANSI C89/90 позволяют возвращать объекты struct.Классические (педантичные) компиляторы 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, ваш этого не делает.На самом деле, такой компилятор на самом деле не следует называть компилятором языка Си.Если компилятор вообще реализует структуры, возврат по значению реализовать несложно.

В любом случае, для работы с вашим компилятором вам понадобится что-то вроде:

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