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
Bonjour,

J'aimerais savoir comment sortir d'une boucle do..while de niveau 1 lorsqu'on est dans une boucle for en interne...

Schématiquement :

do
{
__...
__for(...) {
____... //Sortir de do...while
__}
__...
while(...);

Existe-t-il un système de boucle nommée comme en Ada ?

Merci ;)
A voir également:

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 ?
0
loupius Messages postés 697 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 31 décembre 2017 148
4 mars 2010 à 19:58
Se faire lyncher ? En tout cas, pas par moi !
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.
0
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
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 ?
0
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
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,
0
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é.
0
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
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.
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++.
0

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.
0
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
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.
0
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² ^^
0
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
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;
}
}
}
}
-1