c est mal d utiliser des goto en c++ ?

c est mal d utiliser des goto en c++ ? - Divers - Programmation

Marsh Posté le 24-07-2003 à 05:12:21    

je trouve ca bien utile, j en utilise quelque un dans mon programme, est ce recomende ?
 
je prefere demander avant de poster mon bout de code...
:hello:


---------------
jeunes con de la derniere averse, vieux con des neiges d'antant.
Reply

Marsh Posté le 24-07-2003 à 05:12:21   

Reply

Marsh Posté le 24-07-2003 à 06:25:36    

c'est très mal


---------------
Borland rulez: http://pages.infinit.net/borland
Reply

Marsh Posté le 24-07-2003 à 06:31:25    

pkoi ?
(si c etait serieux)

Reply

Marsh Posté le 24-07-2003 à 06:40:00    

xiluoc a écrit :

pkoi ?
(si c etait serieux)


d'un point de vue purement algorithmique, il n'y a rien de mieux que le goto pour destructurer un programme

Reply

Marsh Posté le 24-07-2003 à 07:58:08    

prettysmile a écrit :


d'un point de vue purement algorithmique, il n'y a rien de mieux que le goto pour destructurer un programme


 
le longjmp est peut etre encore un cran au dessus [:aloy]

Reply

Marsh Posté le 24-07-2003 à 08:12:22    

à mon avis c'est surtout inutile...et ca peut être dangereux si c'est mal utilisé! [:skeye]

Reply

Marsh Posté le 24-07-2003 à 09:00:24    

le goto est une rémininescence d'un style de programmation ancien qu'il faut absolument éviter aujourd'hui, dommage que l'instruction elle-même existe encore :/
 
Et en effet, un seul goto suffit à démolir la logique d'un algorithme (et éventuellement sa stabilité).

Reply

Marsh Posté le 24-07-2003 à 09:04:09    

drasche a écrit :


dommage que l'instruction elle-même existe encore :/


 
En java, le mot clef goto est dans les mots clefs du langage, mais il ne fait rien (enfin si, une erreur de compilation)


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 24-07-2003 à 09:04:13    

par ce qu'en C++ on a tous les outils nécessaires pour faire sans, ne pas casser le fils d'éxécution. en C on à pas les execptions ni les destructeurs, donc le traitement d'erreur est nettement plus long à effectuer, donc y utilise souvent le goto. mais en C+, jamais, ça n'est d'aucune utilité.

Reply

Marsh Posté le 24-07-2003 à 09:06:23    

ok merci je ferai autrement alors

Reply

Marsh Posté le 24-07-2003 à 09:06:23   

Reply

Marsh Posté le 24-07-2003 à 09:06:51    

Je rajouterai aussi que si tu penses à la personne qui va un jour relire ton programme... et bien je peux te garantir que si elle doit essayer de s'en sortir avec des goto elle est pas dans la merde...
 
Je faisais des goto à l'époque du basic. Avec les technologies actuelles, un goto est TOUJOURS remplacable.

Reply

Marsh Posté le 24-07-2003 à 09:09:05    

kadreg a écrit :

En java, le mot clef goto est dans les mots clefs du langage, mais il ne fait rien (enfin si, une erreur de compilation)


[:rofl]

Reply

Marsh Posté le 24-07-2003 à 09:58:22    

Le goto est parfois tentant, surtout pour sortir d'une série de boucles imbriquées (le break ne sort que de la boucle la + interne; certaines langaes comme Ada permettent de nommer le boucler ce qui est bien pratique mais pas le C :/).
Dans le but d'éviter le goto en C, j'ai déjà croisé çà :
 
on a ça :

Code :
  1. // traitement1
  2. if ( ok )
  3. {
  4.     // traitement2
  5.     if ( ok )
  6.     {
  7.         // traitement3
  8.         if ( ok )
  9.         {
  10.             // traitement4
  11.             if ( ok )
  12.             {
  13.             }
  14.         }
  15.     }
  16. }
  17. // fin traitements


 
sachant que ok peut dépendre d'une erreur ou non (pas besoin de faire les traitements 3 et 4 ...).
On est tenté de placer un goto :
 

Code :
  1. // traitement1
  2. if ( !ok ) { goto fin; }
  3. // traitement2
  4. if ( !ok ) { goto fin; }
  5. // traitement3
  6. if ( !ok ) { goto fin; }
  7. // traitement4
  8. fin:
  9. // fin traitements


 
Après tout, 5 ou 6 imbrications c'est pas tellement plus lisible qu'un goto, surtout un goto en avant.
Alors j'ai croisé cette alternative :
 

Code :
  1. do
  2. {
  3.     // traitement1
  4.     if ( !ok ) { break; }
  5.     // traitement2
  6.     if ( !ok ) { break; }
  7.     // traitement3
  8.     if ( !ok ) { break; }
  9.     // traitement4
  10. }
  11. while ( false );
  12. // fin traitements


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 24-07-2003 à 15:28:51    

mouef... je pense plutot à une simulation d'exception, traitement d'erreur: en fonction de la ou l'erreur se produit, on a un certain nombre de taches de nettoyage à effectuer. genre


acquisition de A
si erreur allez à point I
acquisition de B
si erreur allez à point II
acquisition de C
si erreur allez à point III
acquisition de D
si erreur allez à point IV
 
retournez le résultat
 
// traitement d'erreur
 
point IV:
libération de D
point III:
libération de C
point II:
libération de B
point I:
libération de A
 
retourner un code d'erreur


 
voilà le genre de structure qu'on trouve souvent en C par exemple
 
alros bien sur, on peut à chaque erreur, insérer le code qui convient, mais ça revient à dupliquer autant de fois qu'il y a de situation. avec le goto, on a quelque chose de centraliser, de tres clair et tres efficace

Reply

Marsh Posté le 24-07-2003 à 20:10:37    

Code :
  1. do
  2. {
  3.     // traitement1
  4.     if ( !ok ) { break; }
  5.     // traitement2
  6.     if ( !ok ) { break; }
  7.     // traitement3
  8.     if ( !ok ) { break; }
  9.     // traitement4
  10. }
  11. while ( false );
  12. // fin traitements


 
A mon avis c'est n'importe quoi parce que ton break
ne fait pas autre chose qu'un goto.. Sauf que dans ce cas c'est moins clair et on sait pas trop ce que le while(false) fait la a part pour faire beau (et éviter un goto !).
 
Perso j'ai utilisé de temps à autre des goto dans mes programmes en C++ et dans ce cas, la solution avec goto est plus simple et surtout plus claire. De plus contrairement au setjmp/longjmp
le goto est correct meme en C++ et il y a des règles évidentes à respecter (On ne saute pas à l'intérieur d'une boucle, etc..).
 
Je ne suis apparemment pas le seul à penser ça puisque dans toutes les boites ou j'ai bossé, j'ai croisé un ou deux goto dans les source codes. Ici c'est meme pire puisqu'on éxecute du code assemblé à la volée !
 
Bref pour répondre à ta question:
Non le goto n'est pas une erreur mais OUI si tu l'utilises à tire larigot dans toutes tes fonctions ou si ton programme n'est qu'un immense spaghetti avec que des goto alors tu as un probleme.
 
LeGreg

Reply

Marsh Posté le 25-07-2003 à 11:44:53    

Je précise juste que ce n'est pas "mon break" et que je n'ai jamais utilisé cette structure. Je l'ai croisée c'est tout, et c'est vrai que j'ai pas pigé de suite que le but était d'éviter un goto.
Je sais plus qui a écrit un article où il démontre l'utilité du goto. Si quelqu'un connaît cet article et a un lien ...
 
Pour l'exemple de Taz, moi j'ai plutôt croisé ce genre de chose :
 

Code :
  1. A = NULL;
  2. B = NULL;
  3. C = NULL;
  4. D = NULL;
  5. acquisition de A
  6. si erreur allez à erreur
  7. acquisition de B
  8. si erreur allez à erreur
  9. acquisition de C
  10. si erreur allez à erreur
  11. acquisition de D
  12. si erreur allez à erreur
  13. retournez le résultat
  14. // traitement d'erreur  
  15. erreur:
  16. si D != NULL
  17.     libération de D
  18. si C != NULL
  19.     libération de C
  20. si B != NULL
  21.     libération de B
  22. si A != NULL
  23.     libération de A
  24. retourner un code d'erreur


 
Maitenant, si tu déplaces dans une fonction Error() le code du goto (libération puis renvoie du code d'erreur), tu peux te passer du goto :

Code :
  1. acquisition de A
  2. si erreur retourner Error()
  3. acquisition de B
  4. si erreur retourner Error()
  5. acquisition de C
  6. si erreur retourner Error()
  7. acquisition de D
  8. si erreur retourner Error()
  9. retournez le résultat


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 25-07-2003 à 12:02:47    

HelloWorld a écrit :

...Je sais plus qui a écrit un article où il démontre l'utilité du goto. Si quelqu'un connaît cet article et a un lien ...


 
Il y a l'article classique Go To Statement Considered Harmful et une réponse 'Goto considered harmful? considered harmful. On peut trouver beaucoup de discussions sur le sujet notamment en faisant une recherche dans les newsgroups.
 
Pour ma part, j'ai un réel problème avec les gotos. Au point que j'en viens à utiliser des suites de ifs pour éviter d'en utiliser.
Mais bon, en C++ on a les exceptions qui remplacent les gotos
 
edit:
Trouvé un lien pour 'Goto considered harful' considered harmful.


Message édité par gatorette le 25-07-2003 à 12:13:29

---------------
each day I don't die is cheating
Reply

Marsh Posté le 25-07-2003 à 14:00:44    

le greg > tu te rends compte du nombre de paramètre à envoyer? cette solution est dans la pratique infaisable

Reply

Marsh Posté le 25-07-2003 à 14:45:14    

Je suis d'accord. Le goto, même quand il est justifié, ça fait quand même grincer des dents. C'est comme le char * en C++, des fois il a sa place, mais ça fait tiquer ...


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 02-08-2003 à 04:30:05    

Parfois un goto sera la meilleure solution à une structure de code complexe, mais c?est rare.
 
 

legreg a écrit :

A mon avis c'est n'importe quoi parce que ton break ne fait pas autre chose qu'un goto.. Sauf que dans ce cas c'est moins clair et on sait pas trop ce que le while(false) fait la a part pour faire beau (et éviter un goto !).

C?est bien un saut comme le goto? mais en beaucoup plus sûr :
-break/continue font obligatoirement référence la première boucle/switch englobante, alors que le goto pourrait aller n?importe ou dans la fonction.
-La fin de cette boucle ne peut être atteinte que naturellement ou par break, alors qu?une étiquette pourrait être une destination depuis n?importe où dans la fonction.
 
 
Bref, le code contenant des embranchements est isolé dans un bloc, c?est structuré et sans surprise.
Ajoutons que cela dispense de choisir un nom d?étiquette, et du risque de s?y tromper ou de mal la placer.
 
Et une fois qu?on sait cela et qu?on le pratique, ça devient aussi plus clair comme ça?


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le 02-08-2003 à 05:07:33    

xiluoc a écrit :

je trouve ca bien utile, j en utilise quelque un dans mon programme, est ce recomende ?
:hello:  


<mode humour="incompréhensible">
Nan, fait des appels avec continuation c'est mieux !
http://www.swiss.ai.mit.edu/projec [...] ode92.html
 
Ah bah oui mais en C on peu pas faire un appel sans faire grossir la pile !
</mode>


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 02-08-2003 à 05:14:23    

dans une fonction on peut utiliser return aussi qui est une sorte de goto et qui permet de sortir de tout...
 
 

Reply

Marsh Posté le 02-08-2003 à 05:18:39    

red faction a écrit :

dans une fonction on peut utiliser return aussi qui est une sorte de goto et qui permet de sortir de tout...

Oui, j'avais utilisé une extension pas standard pour faire ca une fois : les fonctions imbriquées de gcc (pour pas polluer l'espace de nom du fichier). C'est très utilisé en fonctionel impur.
 
c'était pour etre sur que dans tous les cas, un fichier ouvert soit fermé (un truc a la ensure: de smalltalk).


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 04-08-2003 à 21:13:58    

Personnellement, je décomposerais le programme en sous programme :
 

Code :
  1. void procedure_qui_contenait_les_traitements()
  2. {
  3.   // début des traitements
  4.   int resultat = traitements();
  5. }
  6. int traitements()
  7. {
  8.   // traitement1
  9.   //...
  10.   if ( !ok ) return CODE_ERREUR;
  11.   // traitement2
  12.   //...
  13.   if ( !ok ) return CODE_ERREUR;
  14.   // traitement3
  15.   //...
  16.   if ( !ok ) return CODE_ERREUR;
  17.   // traitement4
  18.   //...
  19.   if ( !ok ) return CODE_ERREUR;
  20.   return CODE_OK;
  21. }


 
Le seul problème, c'est si les traitements manipulent plein de données, il faudrait alors les passer en paramètres à la fonction traitements(...) mais si c'est du C++ et que tous les paramètres sont des éléments de la classe, y'a pas besoin de les passer en paramètre, ces 2 méthodes les connaîtront.


Message édité par xman le 04-08-2003 à 21:16:35
Reply

Marsh Posté le 05-08-2003 à 10:47:56    

Je pige pas trop l'utilité du truc ... si procedure_qui_contenait_les_traitements se contente d'appeler traitements, je vois pas à quoi elle sert. Mais le problème n'est pas là : il s'agit de libérer certaines ressources en fonction du moment ou a eu lieu l'erreur. Plus on avance, et plus il faut libérer des ressources. Et a chaque fois c'est le même code de libération. Pour éviter de dupliquer 5 fois le code, un goto est utilisé.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 05-08-2003 à 11:31:54    

Ben là, c'est qu'un exemple, dans la proc qui appelait les traitements, il peut y avoir d'autres trucs avant ou après (genre une initialisation avant traitement puis un affichage du résultat ou une gestion de l'erreur retournée). Au pire, ça peut être main() cette procédure.
 
M'enfin tout ça sert à sortir facilement avec des RETURN (propre) plutôt qu'avec des GOTO (sale) ou des BREAK (pas clair).


Message édité par xman le 05-08-2003 à 11:35:22
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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