Domanda

Sto lavorando su un programma in C e usando il compilatore SDCC per un dispositivo 8051 architettura. Sto cercando di scrivere una funzione chiamata GetName che leggerà 8 personaggi di memoria Flash e restituire l'array di caratteri in una qualche forma. So che non è possibile restituire un array in C così sto cercando di farlo utilizzando una struttura come questa:

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

Non ho alcun riferimento a questa funzione ancora, ma per qualche ragione, ottengo un errore del compilatore che dice "funzione non può restituire aggregato." Questo significa che il mio compilatore non supporta funzioni che restituiscono le strutture? O sto solo facendo qualcosa di sbagliato?

È stato utile?

Soluzione

SDCC non supporta l'assegnazione e il ritorno struct ancora (se Wiki è il loro up-to-date):

  

Non ancora implementato in SDCC:

     
      
  • tipo di dati Double.
  •   
  • non possono essere assegnati Strutture e sindacati, passate come parametri delle funzioni o valori di ritorno.
  •   
  • classe di memorizzazione register specificatore nei parametri di funzione.
  •   

Forse si dovrebbe fare un

void GetName(MyStruct* ret_name, int i);

funzione invece.


Detto questo, si dovrebbe mettere il prototipo di funzione prima il main e dopo il MyStruct. Se non ci sono i prototipi di una funzione sarà assunta per tornare int.

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

(Inoltre, la funzione main dovrebbe essere un int main(void) o int main(int argc, char** argv). Non dovrebbe tornare void.)

Altri suggerimenti

Tutte C89 / 90 compilatori pubblicare-ANSI consentono il ritorno oggetti struct. Classic (pedanti) K & R compilatori C non lo fanno.

Tuttavia, in ogni caso, è necessario dichiarare la funzione prima. vale a dire prima si chiama. E char[8] Name all'interno della vostra struct non è una dichiarazione valida. La forma è valida char Name[8].

La vostra funzione puntatore-a-array-ritorno è dichiarato correttamente. E 'la macro dimensione che è rotto. Dovrebbe essere

#define NAME_SIZE 8 

. Nota: nessun personaggio =

Sì, le funzioni possono restituire le strutture in C. Il codice di cui sopra ha diversi errori. Con alcune modifiche, si compila correttamente in gcc (non ho installato SDCC da provare con, ma vi prego di provare il codice qui sotto.

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

Io davvero non vorrei usare un compilatore C che non ha attuato chiamata struttura e ritorno per valore, come suggerisce KennyMT vostro non. In realtà, tale compilatore non dovrebbe davvero essere chiamato un compilatore C. Se il compilatore implementa strutture a tutti, di ritorno dal valore non è difficile da attuare.

In ogni caso, per lavorare con il compilatore si vuole qualcosa di simile a:

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

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

int main() {
    MyStruct ms;
    f( & ms );
    return 0;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top