Est-ce que tous les compilateurs C permettent des fonctions de revenir structures?

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

  •  19-09-2019
  •  | 
  •  

Question

Je travaille sur un programme en C et en utilisant le compilateur SDCC pour un dispositif d'architecture 8051. Je suis en train d'écrire une fonction appelée GetName qui lira 8 caractères de mémoire flash et retourner le tableau de caractères sous une certaine forme. Je sais qu'il est impossible de retourner un tableau en C, donc je suis en train de le faire en utilisant une struct comme ceci:

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

Je n'ai aucune référence à cette fonction encore, mais pour une raison quelconque, je reçois une erreur de compilation qui dit: « La fonction ne peut retourner ensemble. » Est-ce que cela veut dire que mon compilateur ne prend pas en charge les fonctions qui reviennent struct? Ou suis-je en train de faire quelque chose de mal?

Était-ce utile?

La solution

SDCC ne prend pas en charge l'affectation et le retour struct encore (si leur Wiki est mise à jour):

  

Pas encore mis en œuvre sdcc:

     
      
  • Type de données double.
  •   
  • Les structures et les syndicats ne peuvent pas être attribués, passés comme paramètres de fonction ou renvoient des valeurs.
  •   
  • registre spécificateur de classe de stockage dans les paramètres de la fonction.
  •   

Peut-être que vous devriez faire un

void GetName(MyStruct* ret_name, int i);

fonction à la place.


Cela dit, vous devez mettre le prototype de fonction avant main et après MyStruct. S'il n'y a aucun prototype fonction sera supposé revenir int.

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

(En outre, la fonction main doit être un int main(void) ou int main(int argc, char** argv). Il ne faut pas revenir void.)

Autres conseils

Tous les C89 / 90 compilateurs post-ANSI permettent le retour des objets struct. Classique (pédants) compilateurs K & R C ne le font pas.

Cependant, dans tous les cas, vous devez déclarer la fonction première. dire avant vous l'appelez. Et char[8] Name l'intérieur de votre struct n'est pas une déclaration valide. La forme est valide char Name[8].

Votre fonction pointeur retour à tableau est déclaré correctement. Il est votre macro de taille qui est cassé. Devrait être

#define NAME_SIZE 8 

Note:. Aucun caractère =

Oui, les fonctions peuvent retourner struct en C. Votre code ci-dessus a plusieurs erreurs. Avec quelques changements, il compile correctement sous gcc (je n'ai pas sdcc installé pour essayer avec, mais s'il vous plaît essayer le code ci-dessous.

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

Je ne voudrais pas utiliser un compilateur C qui n'a pas mettre en œuvre l'appel de la structure et de retour en valeur, comme KennyMT suggère vôtre ne fonctionne pas. En fait, un tel compilateur ne devrait pas vraiment être appelé un compilateur C. Si le compilateur met en œuvre des structures du tout, le retour par valeur est difficile à mettre en œuvre.

Quoi qu'il en soit, pour travailler avec votre compilateur vous voulez quelque chose comme:

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

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

int main() {
    MyStruct ms;
    f( & ms );
    return 0;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top