[C] un break et un continue en cascade... - sortie de boucle et poursuivre l'autre

for (blocH=1; blocH<4; blocH++) {
  for (blocV=1; blocV<4; blocV++) {
  	for (i=1; i<10; i++) {
                                [...]

    if (ptr->value==val) {
    	break; [B]/*i*/[/B]
    	continue; [B]/*blocV*/[/B]
    }
                }
              }
}

Dans ce bout de code, j’aimerai que si une condition est vérifiée, on casse la boucle en i, et on poursuit celle en blocV. Est-ce que ça peut se faire ainsi, ou faut il retester en dehors de la boucle i, du genre…

for (blocH=1; blocH<4; blocH++) {
  for (blocV=1; blocV<4; blocV++) {
  	for (i=1; i<10; i++) {
                                [...]

    if (ptr->value==val)
    	break; [B]/*i*/[/B]
                }
  	if (ptr->value==val)
    	continue; [B]/*blocV*/[/B]
              }
}

Quoi de mieux que du C pour se détendre après avoir lu un code de porc mitonné par un sagouin de prof ? (un code sans commentaires…)


for (blocH=1; blocH<4; blocH++) {
  for (blocV=1; blocV<4; blocV++) {
     for (i=1; i<10; i++) {
       if ( ptr->value == val ) break;
    }
  }
}

Ton break va arrêter la troisième boucle imbriquée, permettant à la deuxième boucle de continuer sur la prochaine valeur de blocV. Le continue, après un break, ne sert à rien du tout.

break = j’arrête la boucle courante
continue = j’arrête l’itération courante

concrêtement :

for ( x = 1; x < 10; x++ ) {

  if ( x % 2 ) continue; 
  puts("youda");
} 

Est équivalent à :

for ( x = 1; x < 10; x++ ) {
  if ( !( x % 2 ) {
     puts("youda");
  }
} 

Précise ta question si ça ne t’aide pas.

Moi aussi, je trouve que c’est du code bestial, le mélange break, continue. Je préfère faire une petite fonction qui contient la boucle, et qui fait un return sur le test, comme ça, on sait ce qu’on quitte.

sinon, en java, on peut mettre un label sur le break pour faire un
mon_label: for( …)…

break mon_label;
m’enfin là, c’est limite du goto, plus rien à voir avec du structuré. :wink:

Sinon, c’est sûr qu’après ton break, le continue n’est pas appelé, soit il faut retester, soit il faut revoir l’algo :neutre:

C’était effectivement ce que j’avais cru constater; sinon désolé d’avoir été aussi expéditif dans le del des lignes de programme intermédiaires, ce qui fait que le but principal n’est pas facile (euphémisme…) à saisir.
Merci à vous, je pense que je vais m’orienter vers la deuxième solution originale. C’est pas très beau, mais bon, ça marche et c’est lisible.

N’oublie pas que tu peux mettre ce que tu veux comme conditions dans ton for.

Exemple:



Break = 0;
for (i = 0; i < N && !Break; i++)
   for (j = 0; j < N; j++)
      if (condition) { Break = 1 }

Si avec ça, je trouve pas mon bonheur! :miam:
Encore merci

le break en C c’est le mal, c’est comme les goto et label.

for (i = 0; i < N && !condition; i++)
  for (j = 0; j < N && !condition; j++)
   {
   }

pourquoi mettre un break alors que l’on peut mettre la condition directement dans le for, ne me parler pas de lisibiliter SVP.

tu l’as dis : lisibilité. Tu te tape une super condition à la con dans ton for, soit une variable de plus en haut de ton code, rien que pour casser ta boucle alors que tu peux le faire directement…

Je conviens que c’est la même chose, mais pas au niveau processeur/code produit.

goto est mal parce que existence casse en lui seul le principe de continuité d’un programme : tu peux revenir tout en haut de ton code comme ça… Mais c’est exactement ce que fait l’ordinateur finalement =>

for ( i = 0; i < 11; i++ ) machin;

i = 0
LP0: IF i >= 11 GOTO END
machin
i++
GOTO LP0
END:

un break c’est bien sûr un goto caché, mais à la différence que celui-ci ne permet pas de remonter dans le code. Sans compter que tu ne sais pas comment va être optimiser ton programme, et je pense qu’un break a plus de chances d’être mieux optimisé qu’une condition dans une boucle.

et bien mon prof a toujours dis que c’etait le mal le break et le continue …

enfin bon apres, c’est une question d’habitude …

mais par exemple, je pourrais te dire que lorsque tu as enormement de ligne dans un for et que dans toutes ces lignes, tu as une petite ligne qui casse la boucle ce n’est pas forcement plus lisible …

En te forcant à mettre les conditions uniquement dans le for, tu sais tout de suite quel sont les conditions pour sortir alors qu’avec ton system, il faut se reperer toutes les lignes avec un break …

je sais c’est tiré par les cheveux mais tu vois bien qu’au niveau clarté ce n’est pas forcement mieux

En général si ta boucle utilise plus de 3 imbrications de boucle, c’est que tu as un problème ou que tu es dans un cas spécial (compilateur? etc).

Ensuite, si ton code fait 200 lignes, c’est que tu ne l’as pas découpé en fonctions/macros ce qui n’est pas forcément mieux point de vue lisibilité.

pfff, ces excuses :wink:

sinon le cas des 3 imbrications, ca peut etre utile pour des tableaux à 3 dimensions par exemple …

C’est bien ce que je dis : tu n’as pas découpé ton code. Et comme je l’ai dis, il est rare d’avoir affaire à de tels tableaux.