Frage

ich auf einem Programm in C arbeitete und mit Hilfe der SDCC Compiler für ein 8051-Architektur Gerät. Ich versuche, eine Funktion zu schreiben, GetName aufgerufen, die 8 Zeichen von Flash-Speicher gelesen wird und das Zeichenfeld in irgendeiner Form zurück. Ich weiß, dass es nicht möglich ist, ein Array in C zurückkehren, damit ich es zu tun, ich versuche, mit einer Struktur wie folgt aus:

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

Ich habe keine Verweise auf diese Funktion noch nicht, aber aus irgendeinem Grund habe ich einen Compiler-Fehler, der sagt „Funktion nicht Aggregat zurückkehren kann.“ Bedeutet dies, dass mein Compiler keine Funktionen nicht unterstützt, die structs zurückkehren? Oder bin ich nur etwas falsch zu machen?

War es hilfreich?

Lösung

SDCC unterstützt keine Zuordnung und structs noch Rückkehr (wenn ihr Wiki ist up-to-date):

  

Noch nicht in sdcc umgesetzt:

     
      
  • Datentyp double.
  •   
  • Strukturen und Gewerkschaften können nicht als Funktionsparameter oder Rückgabewerte zugeordnet, übergeben werden.
  •   
  • Speicherklassen-Bezeichner in Funktionsparameter registrieren.
  •   

Vielleicht sollten Sie eine machen

void GetName(MyStruct* ret_name, int i);

Funktion statt.


Das heißt, sollten Sie den Funktionsprototyp setzen vor die main und nach die MyStruct. Wenn es keine Prototypen ist eine Funktion davon ausgegangen werden int zurückzukehren.

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

(Auch sollte die main Funktion ein int main(void) oder int main(int argc, char** argv) sein. Es ist nicht void zurückkehren.)

Andere Tipps

Alle Post-ANSI C89 / 90 Compiler struct Objekte erlauben Rückkehr. Classic (pedantisch) K & R C-Compiler nicht.

jedoch in jedem Fall müssen Sie zuerst die Funktion erklären. d vor Sie es nennen. Und char[8] Name in Ihrer Struktur ist keine gültige Erklärung. Die gültige Form ist char Name[8].

Ihre Zeiger-to-Array-Rückkehr-Funktion wird korrekt deklariert. Es ist Ihre Größe Makro, das kaputt ist. Sollte

#define NAME_SIZE 8 

. Hinweis: kein = Zeichen

Ja, Sie können Funktionen geben structs in C über Ihren Code mehrere Fehler hat. Mit einigen Änderungen kompiliert, es richtig unter gcc (ich weiß nicht sdcc mit versuchen installiert haben, aber bitte den Code unten versuchen.

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

Ich möchte wirklich nicht einen C-Compiler verwenden, die nicht Struktur Aufruf umgesetzt haben und als Wert zurückgeben, wie KennyMT schlägt Ihnen nicht der Fall. In der Tat, eine solche Compiler nicht wirklich ein C-Compiler aufgerufen werden soll. Wenn der Compiler Strukturen überhaupt implementiert, Rückgabe von Wert ist nicht schwer zu implementieren.

Wie auch immer, mit dem Compiler arbeiten Sie wie etwas wollen:

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

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

int main() {
    MyStruct ms;
    f( & ms );
    return 0;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top