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

  FORUM HardWare.fr
  Programmation
  Divers

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°466371
xiluoc
un pc pour les unirs ....
Posté le 24-07-2003 à 05:12:21  profilanswer
 

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.
mood
Publicité
Posté le 24-07-2003 à 05:12:21  profilanswer
 

n°466374
os2
Posté le 24-07-2003 à 06:25:36  profilanswer
 

c'est très mal


---------------
Borland rulez: http://pages.infinit.net/borland
n°466375
xiluoc
un pc pour les unirs ....
Posté le 24-07-2003 à 06:31:25  profilanswer
 

pkoi ?
(si c etait serieux)

n°466376
prettysmil​e
Sourire est un devoir social
Posté le 24-07-2003 à 06:40:00  profilanswer
 

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

n°466381
chrisbk
-
Posté le 24-07-2003 à 07:58:08  profilanswer
 

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]

n°466387
skeye
Posté le 24-07-2003 à 08:12:22  profilanswer
 

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

n°466407
drasche
Posté le 24-07-2003 à 09:00:24  profilanswer
 

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é).

n°466409
kadreg
profil: Utilisateur
Posté le 24-07-2003 à 09:04:09  profilanswer
 

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 !
n°466410
Taz
bisounours-codeur
Posté le 24-07-2003 à 09:04:13  profilanswer
 

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

n°466414
xiluoc
un pc pour les unirs ....
Posté le 24-07-2003 à 09:06:23  profilanswer
 

ok merci je ferai autrement alors

mood
Publicité
Posté le 24-07-2003 à 09:06:23  profilanswer
 

n°466417
Egut
Posté le 24-07-2003 à 09:06:51  profilanswer
 

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.

n°466418
drasche
Posté le 24-07-2003 à 09:09:05  profilanswer
 

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]

n°466452
HelloWorld
Salut tout le monde!
Posté le 24-07-2003 à 09:58:22  profilanswer
 

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
n°466962
Taz
bisounours-codeur
Posté le 24-07-2003 à 15:28:51  profilanswer
 

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

n°467210
LeGreg
Posté le 24-07-2003 à 20:10:37  profilanswer
 

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

n°467595
HelloWorld
Salut tout le monde!
Posté le 25-07-2003 à 11:44:53  profilanswer
 

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
n°467616
gatorette
Posté le 25-07-2003 à 12:02:47  profilanswer
 

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
n°467684
Taz
bisounours-codeur
Posté le 25-07-2003 à 14:00:44  profilanswer
 

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

n°467736
HelloWorld
Salut tout le monde!
Posté le 25-07-2003 à 14:45:14  profilanswer
 

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
n°475682
Musaran
Cerveaulté
Posté le 02-08-2003 à 04:30:05  profilanswer
 

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
n°475683
nraynaud
lol
Posté le 02-08-2003 à 05:07:33  profilanswer
 

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
n°475684
red factio​n
Posté le 02-08-2003 à 05:14:23  profilanswer
 

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

n°475685
nraynaud
lol
Posté le 02-08-2003 à 05:18:39  profilanswer
 

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
n°477507
xman
branleur
Posté le 04-08-2003 à 21:13:58  profilanswer
 

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
n°477796
HelloWorld
Salut tout le monde!
Posté le 05-08-2003 à 10:47:56  profilanswer
 

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
n°477860
xman
branleur
Posté le 05-08-2003 à 11:31:54  profilanswer
 

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
mood
Publicité
Posté le   profilanswer
 


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

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

 

Sujets relatifs
recuperer une valeur d une requete sql pour l utiliser ds un cheminASP : L'opération doit utiliser une requête qui peut être mise à jour
utiliser jarsignerUtiliser un ".lib" généré par VC++ en C# ????
utiliser un schéma comme modèle xml ?Utiliser un proxy en PHP
Utiliser une ListView sous VB5 est-ce possible ???[100% Newbie] Utiliser Intel C++ Compiler 7
[PHP] Pré-requis pour utiliser la fonction mail()Utiliser une DataGrid sans passer par un controle data?
Plus de sujets relatifs à : c est mal d utiliser des goto en c++ ?


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