6
votes

Structure de retour de la fonction (c)

Je dois créer une structure à l'intérieur d'une fonction (dynamiquement avec malloc) Ensuite, j'ai besoin de pouvoir l'envoyer à mon principal et l'utiliser là-bas. Je n'ai aucun problème à la créer, j'ai simplement besoin d'aide pour m'envoyer à mon principal, et je ne suis pas sûr de savoir comment y accéder une fois que je l'obtiens là-bas. XXX

C'est le code i Avoir jusqu'à présent.

Merci pour une aide. Faites-moi savoir si vous avez besoin de quelque chose clarifié.

EDIT:

OK Quelques éclaircissements sont nécessaires.

Ce que j'essaie d'atteindre, est la capacité de transmettre une structure à travers une fonction à mon principal. Dans la fonction, je dois déclarer des variables et attribuer des valeurs. Ensuite, dans la principale, je dois imprimer chaque variable de la structure à l'écran. Aucune variables globales ne peut être utilisée (et donc je n'assume donc aucune structure globale).

Espérons que cela clarifie les choses.

EDIT 2:

J'ai compris mon problème. Pour les personnes intéressées, je devais d'abord avoir le prototype de structure en dehors de mes fonctions. Ensuite, je pourrais passer st, puis l'accéder correctement. Merci à tous, et désolé pour la formulation médiocre.


1 commentaires

Les variables globales et les structures mondiales sont différentes. En faisant la structure def Global, vous ne définissez que non une variable. Si vous ne faites pas la structure def mondial, d'autres fonctions ne sauront rien à propos de ce nouveau type et votre PRG ne compilera pas.


6 Réponses :


0
votes

juste: retour st;


0 commentaires

4
votes

Vous obtiendrez des centaines de réponses à cette question. :)

  1. Vous pouvez retourner un pointeur directement. Par exemple. Retour St , votre fonction principale sera alors en mesure d'accéder aux membres de la structure comme dans st-> numéro . Assurez-vous que le point principal est le pointeur quand c'est fait.

  2. Ce n'est pas nécessairement un excellent modèle de conception. Votre callee (FN) est l'allocation de mémoire, mais votre appelant (principal) doit traiter de la suite. Vous pouvez également structurer cela avec principale allouant la mémoire (à l'aide de MALLOC ou sur la pile directement) et en passant dans le pointeur pour FN à utiliser. Ensuite, le malloc / libre se produit au même endroit. Sinon, vous voulez être sûr de nommer votre fonction Fn quelque chose de claire comme allocatemystructure il est donc clair que le retour doit être libéré. ​​

    P.s. Je ne suis pas sûr des règles de définition des structures à l'intérieur d'une fonction, mais vous ne devriez pas le faire ici. Déclarez STR STREST STRISTRE-STROND MAIN ET DE VOTRE FONCTION FN, ils peuvent donc "voir" le type déclaré.


1 commentaires

Je ne pense pas que ce soit un problème allouant de la mémoire dans une fonction, tant que le nom de la fonction en est clair (quelque chose comme Creeenewfoo () ou quelque chose). Sinon, je suis d'accord avec vous.



0
votes

Veuillez déclarer la structure dans un fichier d'en-tête commun et l'inclure dans votre fichier source, puis revenez ST de votre fonction actuelle. Cela devrait fonctionner.


0 commentaires

8
votes
// make the structure def global so that main() and fun() know about it.
struct retValue {
 int number;
};    

// function fn returns a pointer to the structure retValue
struct retValue * fn() {     

 struct retValue* st = malloc(sizeof(*st));

 // return the pointer to the newly allocated structure.
 return(st);   
}

int main() {

 // call fn() to create a new structure dynamically.
 struct retValue *st = fn();
}

0 commentaires

0
votes
struct retValue { int number; };

int main(...) {
  struct retValue *myval;

  myval = fn();
}

struct retValue *fn() {
  struct retValue* st = malloc(sizeof(*st));

  return st;
}

0 commentaires

1
votes

Une chose que je voudrais souligner ... puisque la structure est locale à la fonction, existe-t-il une structure globale qui correspond exactement à cela, sinon vous pourriez avoir des problèmes, comment principal () Code> Sachez ce qui est dans cette structure? Pouvez-vous clarifier?

edit: strong> Il semble que ma réponse a confirmé ce que je pensais. P>

struct retValue
{
    int number;
};

int main(int argc, char **argv){
   struct retValue *ptr;
   ptr = fn();
   /* do what you have to do... */
   ....
   return 0;
}

struct retValue * fn() {
   struct retValue* st = malloc(sizeof *st);

   /* do you work on the structure */
   st->number = 5;

   return st;   
}


0 commentaires