Pregunta

Estoy trabajando en un programa en C y usando el compilador SDCC para un dispositivo 8051 de arquitectura. Estoy tratando de escribir una función llamada GetName que leerá 8 caracteres de la memoria flash y devolver el array de caracteres de alguna forma. Yo sé que no es posible devolver una matriz en C, así que estoy tratando de hacerlo usando una estructura 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;
}

No tengo ninguna referencia a esta función todavía, pero por alguna razón, me sale un error de compilación que dice "La función no puede volver agregado." ¿Quiere decir esto que mi compilador no admite funciones que devuelven estructuras? O solo estoy haciendo algo mal?

¿Fue útil?

Solución

SDCC

no permite la asignación y devolución estructuras aún (si su Wiki es de hasta al día):

  

No se ha implementado en SDCC:

     
      
  • Tipo de datos doble.
  •   
  • Estructuras y uniones no se pueden asignar, pasan como parámetros de la función o valores de retorno.
  •   
  • registrar especificador de clase de almacenamiento en los parámetros de función.
  •   

Tal vez deberías hacer un

void GetName(MyStruct* ret_name, int i);

función de su lugar.


Dicho esto, usted debe poner el prototipo de función antes el main y después de el MyStruct. Si no hay prototipos será asumido una función para devolver int.

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

(También, la función main debe ser un int main(void) o int main(int argc, char** argv). No debe volver void.)

Otros consejos

Todos C89 / 90 compiladores enviar-ANSI permiten devolver objetos Struct. Clásicos (pedante) compiladores K & R C no lo hacen.

Sin embargo, en cualquier caso, usted tiene que declarar la función en primer lugar. es decir, antes que lo llaman. Y char[8] Name dentro de su estructura no es una declaración válida. La forma válida es char Name[8].

Su función de puntero-a-matriz de regresar se declara correctamente. Es su macro tamaño que se ha roto. Debe ser

#define NAME_SIZE 8 

Nota:. Ningún carácter =

Sí, las funciones pueden devolver estructuras en C. El código anterior tiene varios errores. Con algunos cambios, que compila correctamente en gcc (no tengo sdcc instalado para tratar con, pero por favor trata el código de abajo.

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

Realmente no me gustaría utilizar un compilador de C que no implementar la llamada estructura y retorno por valor, como sugiere KennyMT suyo no lo hace. De hecho, un compilador tal no debería realmente ser llamado un compilador C. Si el compilador implementa estructuras en absoluto, regreso en el valor no es difícil de implementar.

De todos modos, para trabajar con su compilador que se desea 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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top