Pergunta

Eu estou trabalhando em um programa em C e usando o compilador SDCC para um dispositivo de 8051 arquitetura. Eu estou tentando escrever uma função chamada GetName que irá ler 8 caracteres de memória flash e retornar o array de caracteres de alguma forma. Eu sei que não é possível retornar um array em C, então eu estou tentando fazê-lo usando uma estrutura como esta:

//********************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;
}

Eu não tenho qualquer referência a esta função ainda, mas por alguma razão, eu recebo um erro do compilador que diz "Função não pode retornar agregado." Quer isto dizer que meu compilador não suporta funções que estruturas de retorno? Ou estou apenas fazendo algo errado?

Foi útil?

Solução

SDCC não suporta atribuição e retornando estruturas ainda (se sua Wiki é up-to-date):

Ainda não implementado em sdcc:

  • Tipo de dados duplo.
  • Estruturas e sindicatos não pode ser atribuído, passados ??como parâmetros de função ou valores de retorno.
  • registar classe de armazenamento especificador nos parâmetros de função.

Talvez você deve fazer um

void GetName(MyStruct* ret_name, int i);

função em vez.


Dito isso, você deve colocar o protótipo da função antes o main e após o MyStruct. Se não há protótipos função será assumida int retorno.

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

(Além disso, a função main deve ser um int main(void) ou int main(int argc, char** argv). Ele não deve retornar void.)

Outras dicas

Todos struct pós-ANSI C89 / 90 compiladores permitem retornar objetos. Clássico compiladores (pedante) K & R C não.

No entanto, em qualquer caso, você tem que declarar a função em primeiro lugar. ou seja, antes você chamá-lo. E char[8] Name dentro de sua estrutura não é uma declaração válida. A forma válida é char Name[8].

O ponteiro-se matriz retornando função é declarada corretamente. É sua macro tamanho que está quebrado. Deve ser

#define NAME_SIZE 8 

Nota:. Nenhum personagem =

Sim, as funções podem retornar estruturas em C. O código acima tem vários erros. Com algumas mudanças, Ele compila corretamente no gcc (Eu não tenho sdcc instalado para tentar com, mas tente o código abaixo.

 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;  
 }

Eu realmente não gostaria de usar um compilador C que não implementar chamada estrutura e retorno por valor, como KennyMT sugere o seu não. Na verdade, tal compilador não deve realmente ser chamado um compilador C. Se as estruturas implementos compilador em tudo, retorno por valor não é difícil de implementar.

De qualquer forma, para trabalhar com o seu compilador você vai querer algo como:

typedef struct
{
    char Name[NAME_SIZE];
} MyStruct;

void f( MyStruct * m ) {
   strcpy( m->Name, "foo" );
}

int main() {
    MyStruct ms;
    f( & ms );
    return 0;
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top