retourner une structure dans une fonction

retourner une structure dans une fonction - C++ - Programmation

Marsh Posté le 03-05-2013 à 10:42:05    

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
Reply

Marsh Posté le 03-05-2013 à 10:42:05   

Reply

Marsh Posté le 03-05-2013 à 10:54:57    

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


Reply

Marsh Posté le 03-05-2013 à 11:03:28    

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.

Reply

Marsh Posté le 03-05-2013 à 11:14:41    

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

Reply

Marsh Posté le 03-05-2013 à 11:59:12    

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
Reply

Marsh Posté le 03-05-2013 à 12:19:59    

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
Reply

Marsh Posté le 03-05-2013 à 12:39:43    

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.

Reply

Marsh Posté le 03-05-2013 à 12:55:06    

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
Reply

Marsh Posté le 03-05-2013 à 13:23:40    

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é!  --
Reply

Marsh Posté le 03-05-2013 à 20:33:42    

gilou a écrit :

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


 
voila  :o

Reply

Marsh Posté le 03-05-2013 à 20:33:42   

Reply

Marsh Posté le 08-05-2013 à 18:58:46    

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 ?

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed