Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
780 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  retourner une structure dans une fonction

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

retourner une structure dans une fonction

n°2188713
kochfet
Posté le 03-05-2013 à 10:42:05  profilanswer
 

bonjour,
 
svp, comment retourner une structure dans une fonction?
 
J'ai la structure suivante dans la classe C.h:
 

Code :
  1. typedef struct planExecution
  2. {
  3. Graphe g; // Graphe est une classe
  4. float cout;
  5. }planExec;


 
j'implémente la fonction fct qui retourne un pointeur sur planExec dans C.cpp:
 

Code :
  1. #include C.H
  2. struct planExec;
  3. planExec* fct(Graphe g)
  4. {
  5. planExec* p=new planExec();
  6. //................
  7. return p;
  8. }
  9. }


 
 
Le compilateur génere l'erreur suivante : error C2556 :la fonction surchargée ne diffère que par le type de retour ...et  
error C2371: 'C::fct' : redéfinition ; types de base différents
 
Merci.

Message cité 1 fois
Message édité par kochfet le 03-05-2013 à 10:43:52
mood
Publicité
Posté le 03-05-2013 à 10:42:05  profilanswer
 

n°2188718
Anonymouse
Posté le 03-05-2013 à 10:54:57  profilanswer
 

kochfet a écrit :

bonjour,
 
svp, comment retourner une structure dans une fonction?
 
J'ai la structure suivante dans la classe C.h:
 

Code :
  1. typedef struct planExecution
  2. {
  3. Graphe g; // Graphe est une classe
  4. float cout;
  5. }planExec;


 
j'implémente la fonction fct qui retourne un pointeur sur planExec dans C.cpp:
 

Code :
  1. #include C.H
  2. struct planExec;
  3. planExec* fct(Graphe g)
  4. {
  5. planExec* p=new planExec();
  6. //................
  7. return p;
  8. }
  9. }


 
 
Le compilateur génere l'erreur suivante : error C2556 :la fonction surchargée ne diffère que par le type de retour ...et  
error C2371: 'C::fct' : redéfinition ; types de base différents
 
Merci.


 
Essaye  
 

Code :
  1. #include C.H
  2. planExec* fct(Graphe g)
  3. {
  4. planExec* p=new planExec();
  5. //................
  6. return p;
  7. }
  8. }


n°2188722
kochfet
Posté le 03-05-2013 à 11:03:28  profilanswer
 

Merci pour la réponse mais malheureusement meme si jenlève struct planExec les memes erreurs s'affichent. En mettant le curseur sur l'erreur, il me dit :

Citation :

type de valeur de retour ne correspond pas au type de fonction.

n°2188725
Joel F
Real men use unique_ptr
Posté le 03-05-2013 à 11:14:41  profilanswer
 

en c++  pas besoin de typedef struct, on est pas en C.
Ensuite, renvoyer votre struct par valeur au lieu de faire des new tout moche.
 

Code :
  1. struct planExecution
  2. {
  3.   Graphe g;
  4.   float cout;
  5. };
  6. planExecution fct(Graphe const& g)
  7. {
  8. planExexution p;;
  9. //................
  10. return p;


 
On est pas en JAVA

n°2188753
kochfet
Posté le 03-05-2013 à 11:59:12  profilanswer
 

Citation :

renvoyer votre struct par valeur au lieu de faire des new tout moche.


 
Je ne sais pas pourquoi vous trouvez l'utilisation des pointeurs est moche. En fait ça dépend de l'utilisation de la fonction. D'après ce que j'ai lu dans d'autres forums, renvoyer un pointeur sur structure est meilleur que la retourne par valeur surtout si la structure a une taille grande et la fonction va être utilisée plusieurs fois. De plus, je suis entrain d'implémenter un problème d'optimisation donc j'essaye toujours de coder avec les meilleurs choix.
 
Ma méthode avec une utilisation des pointeurs me parait pas fausse au moins de coté syntaxe. Donc, je voulais savoir d’où arrive l'erreur.
 
Et concernant votre proposition du renvoie par valeur, je lai essayé mais encore les mêmes problèmes persistent. Donc, je crois que ces erreurs ne sont pas liées au type du renvoie de ma structure.
 
En tout cas Merci pour vos réponse.

Message cité 2 fois
Message édité par kochfet le 03-05-2013 à 11:59:37
n°2188764
theshockwa​ve
I work at a firm named Koslow
Posté le 03-05-2013 à 12:19:59  profilanswer
 

kochfet a écrit :

Citation :

renvoyer votre struct par valeur au lieu de faire des new tout moche.


 
Je ne sais pas pourquoi vous trouvez l'utilisation des pointeurs est moche. En fait ça dépend de l'utilisation de la fonction. D'après ce que j'ai lu dans d'autres forums, renvoyer un pointeur sur structure est meilleur que la retourne par valeur surtout si la structure a une taille grande et la fonction va être utilisée plusieurs fois. De plus, je suis entrain d'implémenter un problème d'optimisation donc j'essaye toujours de coder avec les meilleurs choix.
 
Ma méthode avec une utilisation des pointeurs me parait pas fausse au moins de coté syntaxe. Donc, je voulais savoir d’où arrive l'erreur.
 
Et concernant votre proposition du renvoie par valeur, je lai essayé mais encore les mêmes problèmes persistent. Donc, je crois que ces erreurs ne sont pas liées au type du renvoie de ma structure.
 
En tout cas Merci pour vos réponse.


 
Ce que te dit ton compilo, c'est que la déclaration de ta fonction est différente de son implémentation. Ca peut être lié à ta forward déclaration (qui est fausse au passage) ou bien à une erreur dans ton header qu'on ne voit pas ici. Bref, vérifie les types que tu utilises autant pour la déclaration que l'implémentation de ta fonction?
 
Ta méthode avec des pointeurs n'est pas fausse, c'est juste mauvais. Faire une alloc dans une fonction pour la retourner, c'est une invitation à faire des fuites mémoires.
Si tu prévois d'aller dans cette direction, tu prends un pointeur sur la structure à remplir plutôt que de l'allouer toi-même. Le code qui fait l'appel à ta fonction sait probablement si cette structure doit vivre sur la pile ou dans le tas, au niveau de ta fonction, tu ne le sais pas.
 
Je ne sais même pas pourquoi ce post est dans la catégorie C++, ce que tu nous montre est du mauvais C  [:petrus75]


---------------
last.fm
n°2188773
kochfet
Posté le 03-05-2013 à 12:39:43  profilanswer
 

Je suis entrain de coder avec C++  et pas avec le C. OK, je vais vérifier le code et modifier si nécessaire.
 
Merci pour la rapidité de la réponse.

n°2188778
theshockwa​ve
I work at a firm named Koslow
Posté le 03-05-2013 à 12:55:06  profilanswer
 

kochfet a écrit :

Je suis entrain de coder avec C++  et pas avec le C. OK, je vais vérifier le code et modifier si nécessaire.
 
Merci pour la rapidité de la réponse.


 
Si tu fais du C++, dans ce cas, tu devrais jeter un oeil aux classes de pointeurs riches pour exprimer clairement la durée de vie de tes allocations (shared_ptr, unique_ptr ...)


---------------
last.fm
n°2188791
gilou
Modérateur
Modzilla
Posté le 03-05-2013 à 13:23:40  profilanswer
 

Citation :

Je sais pas vous trouvez l'utilisation des pointeurs est moche. En fait ça dépend de l'utilisation de la fonction. D'après ce que j'ai lu dans d'autres forums, renvoyer un pointeur sur structure est meilleur que la retourne par valeur surtout si la structure a une taille grande et la fonction va être utilisée plusieurs fois.

C'est bien mieux de retourner par valeur, s'il n'y a pas de raison particulière d'utiliser des pointeurs.
Un compilateur qui voit ce type de code va faire une optimisation nommée RVO (Return Value Optimisation) et va utiliser la zone mémoire de valeur de retour de la fonction pour allouer la variable locale à la fonction, ce qui fait qu'il n'y aura pas de copie inutile a la sortie de la fonction. Il y a des cas ou la RVO n'est pas possible, mais dans ton cas, c'est suffisamment simple pour que cela colle.
Dans les temps antédiluviens des compilateurs en silex taillé, oui, on évitait de faire des retour par valeur pour des grosses structures pour éviter les opérations de copie. Mais en en est plus à l'époque des ordinateurs a lampe...
 
A+,
 
PS Et puis de toute façon, sur le C++, JoelF a toujours raison

Message cité 1 fois
Message édité par gilou le 03-05-2013 à 13:26:13

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2188839
Joel F
Real men use unique_ptr
Posté le 03-05-2013 à 20:33:42  profilanswer
 

gilou a écrit :

Et puis de toute façon, sur le C++, JoelF a toujours raison


 
voila  :o

mood
Publicité
Posté le 03-05-2013 à 20:33:42  profilanswer
 

n°2189391
make insta​ll
Posté le 08-05-2013 à 18:58:46  profilanswer
 

kochfet a écrit :

Citation :

renvoyer votre struct par valeur au lieu de faire des new tout moche.


 
Je ne sais pas pourquoi vous trouvez l'utilisation des pointeurs est moche. En fait ça dépend de l'utilisation de la fonction. D'après ce que j'ai lu dans d'autres forums, renvoyer un pointeur sur structure est meilleur que la retourne par valeur surtout si la structure a une taille grande et la fonction va être utilisée plusieurs fois. De plus, je suis entrain d'implémenter un problème d'optimisation donc j'essaye toujours de coder avec les meilleurs choix.
 
Ma méthode avec une utilisation des pointeurs me parait pas fausse au moins de coté syntaxe. Donc, je voulais savoir d’où arrive l'erreur.


Heu non...
 
Quand on ne connait pas un langage aussi pointu que le C++ (ce qui semble être ton cas), on évite de faire des trucs bancals de ce genre pour "optimiser"... Surtout qu'en l'occurence, tu n'optimises rien du tout (comme dit plus haut, a propos du RVO).
Fais un code propre, fait confiance à l'optimiseur et ça ira déjà très bien.
 
Là avec tes économies de bout de chandelle,tu t'exposes à des leaks bien sales.
Personnellement, à part dans des petites classes très peu exposées, je ne retourne jamais de pointeurs "nus".
Soit tu retournes une copie (retour par valeur donc avec un ctor de copie) soit un pointeur enrobé dans un pointeur intelligent style auto_ptr.
 
C'est quoi tes nouvelles erreurs ?


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  retourner une structure dans une fonction

 

Sujets relatifs
Couper/coller ligne en fonction N° de commandetableau de pointeur sur structure dans une structure
Ecrire y et z en fonction de x[PHP]paramètre pas fonctionnel dans une fonction
Excel - Liaison en fonction de la valeur d'une celluleRecherche d'un zero de la fonction cosinus par dichotomie
Lancement d'un bat via la fonction system phpfonction parcourir des dossiers
Problème pour modifier une fonctionProbleme fonction non trouvée [R]
Plus de sujets relatifs à : retourner une structure dans une fonction


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR