Sortir de boucles inbriquées en C++
Fermé
silentData
Messages postés
183
Date d'inscription
jeudi 22 janvier 2009
Statut
Membre
Dernière intervention
18 octobre 2013
-
4 mars 2010 à 18:15
le père - 5 mars 2010 à 11:58
le père - 5 mars 2010 à 11:58
A voir également:
- Sortir de boucles inbriquées en C++
- Aucun son ne sort de mon pc - Guide
- Comment sortir du mode sans echec ps4 - Guide
- Airpods 3 date de sortie - Guide
8 réponses
Bonjour
Le "break" ne fait sortir que d'une boucle à a fois. Mais on peut s'en servir avec un flag ( pas pratique du tout )
Sinon, si je réponds goto, je vais me faire lyncher ?
Le "break" ne fait sortir que d'une boucle à a fois. Mais on peut s'en servir avec un flag ( pas pratique du tout )
Sinon, si je réponds goto, je vais me faire lyncher ?
silentData
Messages postés
183
Date d'inscription
jeudi 22 janvier 2009
Statut
Membre
Dernière intervention
18 octobre 2013
40
4 mars 2010 à 18:41
4 mars 2010 à 18:41
Désolé mais....... -----------------------------> TU SORS !!!!
Non plus sérieusement, le goto est effectivement hors de question ^^
Au niveau du break, c'est effectivement une seule boucle, d'où ma question...
J'ai la solution en utilisant une variable booléenne et en basant ma condition de sortie dessus, mais j'aimerais l'éviter s'il y a un moyen "plus propre"...
Mais merci pour ton aide ;)
Qqun a une autre idée ?
Non plus sérieusement, le goto est effectivement hors de question ^^
Au niveau du break, c'est effectivement une seule boucle, d'où ma question...
J'ai la solution en utilisant une variable booléenne et en basant ma condition de sortie dessus, mais j'aimerais l'éviter s'il y a un moyen "plus propre"...
Mais merci pour ton aide ;)
Qqun a une autre idée ?
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
4 mars 2010 à 22:01
4 mars 2010 à 22:01
Non il n'y a pas à rougir de honte d'utiliser le goto.
Le goto est effectivement déconseillé car il rend le code illisible (le fameux code spaghetti). On le déconseille donc souvent au débutant car ils peuvent souvent s'en passer en établissant un bon algorithme. Par contre pour ce genre de cas (ou pour la gestion d'erreurs), le goto est utile. Il rend le code plus lisible. Tu peux bien sûr t'en passer en utilisant des conditions dans tes while et une variable test, mais ça alourdit le code.
Donc, il n'y a pas de moyen plus propre.
Cdlt,
Le goto est effectivement déconseillé car il rend le code illisible (le fameux code spaghetti). On le déconseille donc souvent au débutant car ils peuvent souvent s'en passer en établissant un bon algorithme. Par contre pour ce genre de cas (ou pour la gestion d'erreurs), le goto est utile. Il rend le code plus lisible. Tu peux bien sûr t'en passer en utilisant des conditions dans tes while et une variable test, mais ça alourdit le code.
Donc, il n'y a pas de moyen plus propre.
Cdlt,
La solution de Jeff ne marche que s'il n'y a rien entre deux } } de fin de boucle.
Apparemment, je ne suis pas le seul partisan du goto. Un break n'est jamais qu'un goto déguisé dont la cible n'est absolument pas évidente et demande une lecture attentive du programme, alors qu'un vrai goto ne laisse aucune ambiguïté.
Apparemment, je ne suis pas le seul partisan du goto. Un break n'est jamais qu'un goto déguisé dont la cible n'est absolument pas évidente et demande une lecture attentive du programme, alors qu'un vrai goto ne laisse aucune ambiguïté.
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
5 mars 2010 à 08:09
5 mars 2010 à 08:09
une solution alternative est d'utiliser le try catch. Même si ce n'est pas le but à la base.
en utilisant différents type et en imbriquant correctement les blocs try, il doit être possible de faire tout ce qu'on veux.
Sinon je préfère la solution de Jeff en booléen (c'est d'ailleurs celle que j'utilise habituellement) même si comme le souligne le père il faut bien faire attention à ce qu'on met après.
Le goto n'est bien sur pas hors de propos, mais c'est tellement chiant. "Goto L1" et là je passe 15 minutes à trouver où est ce putain de "L1" et une fois trouver je ne sais plus où je suis dans le code.
Un break avec argument (break 2 pour sortir de 2 boucles) serait une bonne extension au C/C++.
en utilisant différents type et en imbriquant correctement les blocs try, il doit être possible de faire tout ce qu'on veux.
try{do { ... for(...) { ... throw(); } ... while(...);}catch(...){/*on fait rien car le but est juste de sortir*/}
Sinon je préfère la solution de Jeff en booléen (c'est d'ailleurs celle que j'utilise habituellement) même si comme le souligne le père il faut bien faire attention à ce qu'on met après.
Le goto n'est bien sur pas hors de propos, mais c'est tellement chiant. "Goto L1" et là je passe 15 minutes à trouver où est ce putain de "L1" et une fois trouver je ne sais plus où je suis dans le code.
Un break avec argument (break 2 pour sortir de 2 boucles) serait une bonne extension au C/C++.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
mais c'est tellement chiant. "Goto L1" et là je passe 15 minutes à trouver où est ce putain de "L1" . Je me permets de douter de ta bonne foi sur ce coup là. Il n'a pas de commande "Find" ton éditeur ? ^^
Je trouve "L1" beaucoup plus facile à trouver que } ! Car les } il y en a un tas et on ne sait pas toujours du premier coup d'oeil lequel est à prendre en considération. Alors que L1 est unique.
Historiquement, le goto a été banni pour de très bonnes raisons (les vieux programmes en basic complètement illisibles...). C'en est devenu un réflexe conditionné - donc irrationnel - chez les programmeurs.
Je trouve "L1" beaucoup plus facile à trouver que } ! Car les } il y en a un tas et on ne sait pas toujours du premier coup d'oeil lequel est à prendre en considération. Alors que L1 est unique.
Historiquement, le goto a été banni pour de très bonnes raisons (les vieux programmes en basic complètement illisibles...). C'en est devenu un réflexe conditionné - donc irrationnel - chez les programmeurs.
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
5 mars 2010 à 10:44
5 mars 2010 à 10:44
Je trouve "L1" beaucoup plus facile à trouver que } Je me permet de douter de ta bonne fois sur ce coup là. Il n'a pas de complétion d'accolade ton éditeur ? ^^
NA ! ;-)
Je parle d'expérience, car je travail sur code écrit en ésope (en fait du fortran modifié) et transcris en C++ qui use et abuse des goto. Une fois le find fait sur un fichier de plusieurs centaines de lignes, tu ne sais plus où était ta boucle et où tu sors. Enfin, tout dépend du contexte de l'utilisation et des commentaires, l'un peu être plus lisible que l'autre.
NA ! ;-)
Je parle d'expérience, car je travail sur code écrit en ésope (en fait du fortran modifié) et transcris en C++ qui use et abuse des goto. Une fois le find fait sur un fichier de plusieurs centaines de lignes, tu ne sais plus où était ta boucle et où tu sors. Enfin, tout dépend du contexte de l'utilisation et des commentaires, l'un peu être plus lisible que l'autre.
Il n'a pas de complétion d'accolade ton éditeur ?
Je ne suis pas sûr de ce que tu désignes par "complétion d'accolade"
Si c'est la fonction qui permet de trouver les correspondances entre accolades ouvrante / fermante d'une structure, oui, mon éditeur en est équipé, mais ça ne me sert à rien quand je suis n'importe où à l'intérieur de la structure.
Si c'est une fonction qui permet, depuis un endroit arbitraire, de sauter là où un break sauterait (c'est ça notre besoin), non il n'en a pas. Et le tien ?
NA² ^^
Je ne suis pas sûr de ce que tu désignes par "complétion d'accolade"
Si c'est la fonction qui permet de trouver les correspondances entre accolades ouvrante / fermante d'une structure, oui, mon éditeur en est équipé, mais ça ne me sert à rien quand je suis n'importe où à l'intérieur de la structure.
Si c'est une fonction qui permet, depuis un endroit arbitraire, de sauter là où un break sauterait (c'est ça notre besoin), non il n'en a pas. Et le tien ?
NA² ^^
Jean-François Pillou
Messages postés
18301
Date d'inscription
lundi 15 février 1999
Statut
Webmaster
Dernière intervention
16 février 2023
63 274
4 mars 2010 à 20:03
4 mars 2010 à 20:03
En PHP on peut passer un argument à break, mais pas en C++, du coup tu n'as pas beaucoup d'alernatives ;
int i,j,k,skip; skip=0; for(i=0;i<I&&!skip;++i){ /* loop 1 */ for(j=0;j<J&&!skip;++j){ /* loop 2 */ for(k=0;k<K&&!skip;++k){ /* loop 3 */ if(condition){ skip=1; break; } } } }
4 mars 2010 à 19:58
Je ne l'utilise que dans un cas de figure mais je n'ai pas de honte à l'utiliser. Le cas est classique, c'est pour la gestion des erreurs. Lorsque, dans une fonction, on a des tas de tests à effectuer (surtout dans des boucles) et que la finalité de ces tests est de sortir de la fonction par un chemin 'sans erreur' ou par un chemin 'avec erreur', je n'hésite pas.
A chacun son choix... il suffit de l'assumer!
Bonne soirée.