retourner une structure dans une fonction - C++ - Programmation
Marsh Posté le 03-05-2013 à 10:54:57
kochfet a écrit : bonjour,
|
Essaye
Code :
|
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. |
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 :
|
On est pas en JAVA
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.
Marsh Posté le 03-05-2013 à 12:19:59
kochfet a écrit :
|
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
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.
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. |
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 ...)
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
Marsh Posté le 03-05-2013 à 20:33:42
ReplyMarsh Posté le 08-05-2013 à 18:58:46
kochfet a écrit :
|
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 ?
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:
j'implémente la fonction fct qui retourne un pointeur sur planExec dans C.cpp:
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 édité par kochfet le 03-05-2013 à 10:43:52