Dans une structure switch ($mode) {
case 1:
...
break;
case 2:
...
break;
case 3:
...
break;
}
Je peux passer de case 1: à case 2: ou de case 2: à case 3: en
effectuant un "break" conditionnel.
Mais je n'arrive pas à passer, avec une condition dans case 1:,
directement à case 3:, même avec continue;
Est-ce possible ?
Merci.
--
= Dominique Ottello = http://www.ottello.net
Aujourd'hui, l'idéal du progrès est remplacé par l'idéal de l'innovation :
il ne s'agit pas que ce soit mieux, il s'agit seulement que ce soit nouveau,
même si c'est pire qu'avant et cela de toute évidence. Montherlant
Dans une structure switch ($mode) { case 1: ... break;
case 2: ... break;
case 3: ... break; }
Je peux passer de case 1: à case 2: ou de case 2: à case 3: en effectuant un "break" conditionnel.
Mais je n'arrive pas à passer, avec une condition dans case 1:, directement à case 3:, même avec continue;
Est-ce possible ?
Oui et non. C'est bien sûr possible en intervertissant l'ordre des cas (tu peux même mettre le 'default' où tu veux) :
switch ($mode) { case 1 : ... if (condition) break; /* else fall through */ default : ... if (condition) break; /* else fall through */ case 3 : ... if (condition) break; /* else fall through */ case 2 : ... break; }
Sinon, bien que ce soit souvent crade, tu peux glisser un « goto », ce qui peut être utile même au milieu des instructions du case :
switch ($mode) { case 1 : /* calcul pour 1 */ goto calcul_general;
case 2 : /* calcul pour 2 */ goto calcul_general;
case 3 : /* calcul pour 3 */ /* goto calcul_general; */
calcul_general: /* calcul commun aux cas 1 à 3 */ break;
default: /* ici, on fait autre chose */ break; }
À éviter quand même, autant que possible.
Sinon, si je peux me permettre un conseil, lorsque tu veux enchaîner d'un case à un autre, mets *toujours* un commentaire pour dire que l'absence de break est volontaire. Mon habitude tirée de la lecture de nombreux programmes en C (et en anglais) consiste à écrire : /* fall through */
Bonjour,
Dans une structure switch ($mode) {
case 1:
...
break;
case 2:
...
break;
case 3:
...
break;
}
Je peux passer de case 1: à case 2: ou de case 2: à case 3: en
effectuant un "break" conditionnel.
Mais je n'arrive pas à passer, avec une condition dans case 1:,
directement à case 3:, même avec continue;
Est-ce possible ?
Oui et non. C'est bien sûr possible en intervertissant l'ordre des cas
(tu peux même mettre le 'default' où tu veux) :
switch ($mode) {
case 1 :
...
if (condition) break;
/* else fall through */
default :
...
if (condition) break;
/* else fall through */
case 3 :
...
if (condition) break;
/* else fall through */
case 2 :
...
break;
}
Sinon, bien que ce soit souvent crade, tu peux glisser un « goto », ce
qui peut être utile même au milieu des instructions du case :
switch ($mode) {
case 1 :
/* calcul pour 1 */
goto calcul_general;
case 2 :
/* calcul pour 2 */
goto calcul_general;
case 3 :
/* calcul pour 3 */
/* goto calcul_general; */
calcul_general:
/* calcul commun aux cas 1 à 3 */
break;
default:
/* ici, on fait autre chose */
break;
}
À éviter quand même, autant que possible.
Sinon, si je peux me permettre un conseil, lorsque tu veux enchaîner
d'un case à un autre, mets *toujours* un commentaire pour dire que
l'absence de break est volontaire. Mon habitude tirée de la lecture de
nombreux programmes en C (et en anglais) consiste à écrire :
/* fall through */
Dans une structure switch ($mode) { case 1: ... break;
case 2: ... break;
case 3: ... break; }
Je peux passer de case 1: à case 2: ou de case 2: à case 3: en effectuant un "break" conditionnel.
Mais je n'arrive pas à passer, avec une condition dans case 1:, directement à case 3:, même avec continue;
Est-ce possible ?
Oui et non. C'est bien sûr possible en intervertissant l'ordre des cas (tu peux même mettre le 'default' où tu veux) :
switch ($mode) { case 1 : ... if (condition) break; /* else fall through */ default : ... if (condition) break; /* else fall through */ case 3 : ... if (condition) break; /* else fall through */ case 2 : ... break; }
Sinon, bien que ce soit souvent crade, tu peux glisser un « goto », ce qui peut être utile même au milieu des instructions du case :
switch ($mode) { case 1 : /* calcul pour 1 */ goto calcul_general;
case 2 : /* calcul pour 2 */ goto calcul_general;
case 3 : /* calcul pour 3 */ /* goto calcul_general; */
calcul_general: /* calcul commun aux cas 1 à 3 */ break;
default: /* ici, on fait autre chose */ break; }
À éviter quand même, autant que possible.
Sinon, si je peux me permettre un conseil, lorsque tu veux enchaîner d'un case à un autre, mets *toujours* un commentaire pour dire que l'absence de break est volontaire. Mon habitude tirée de la lecture de nombreux programmes en C (et en anglais) consiste à écrire : /* fall through */
Stephane Pineau
Le 06 Sep 2004 18:10:45 GMT, Dominique Ottello écrivait:
Je peux passer de case 1: à case 2: ou de case 2: à case 3: en effectuant un "break" conditionnel.
Mais je n'arrive pas à passer, avec une condition dans case 1:, directement à case 3:, même avec continue;
La seule méthode à peu près propre que je vois, c'est de mettre ta liste switch dans une fonction, et faire un appel récursif en changeant la valeur passée en paramètre dans telle ou telle condition avec le paramètre initial se vérifie lors du second appel. avec le nouveau paramètre..
Maintenant le plus propre est sans doute de revoir la logique des process car utiliser ce genre de test conditionnel dont ont fait varier la condition lors de son évaluation ca me semble peut maintenable et source de multiplication des erreurs (on ne gère plus n cas de figures, mais nxnxn....cas)
Le 06 Sep 2004 18:10:45 GMT, Dominique Ottello <air.intakes@fra.fr.invalid>
écrivait:
Je peux passer de case 1: à case 2: ou de case 2: à case 3: en
effectuant un "break" conditionnel.
Mais je n'arrive pas à passer, avec une condition dans case 1:,
directement à case 3:, même avec continue;
La seule méthode à peu près propre que je vois, c'est de mettre ta liste
switch dans une fonction, et faire un appel récursif en changeant la valeur
passée en paramètre dans telle ou telle condition avec le paramètre initial
se vérifie lors du second appel. avec le nouveau paramètre..
Maintenant le plus propre est sans doute de revoir la logique des process
car utiliser ce genre de test conditionnel dont ont fait varier la condition
lors de son évaluation ca me semble peut maintenable et source de
multiplication des erreurs (on ne gère plus n cas de figures, mais
nxnxn....cas)
Le 06 Sep 2004 18:10:45 GMT, Dominique Ottello écrivait:
Je peux passer de case 1: à case 2: ou de case 2: à case 3: en effectuant un "break" conditionnel.
Mais je n'arrive pas à passer, avec une condition dans case 1:, directement à case 3:, même avec continue;
La seule méthode à peu près propre que je vois, c'est de mettre ta liste switch dans une fonction, et faire un appel récursif en changeant la valeur passée en paramètre dans telle ou telle condition avec le paramètre initial se vérifie lors du second appel. avec le nouveau paramètre..
Maintenant le plus propre est sans doute de revoir la logique des process car utiliser ce genre de test conditionnel dont ont fait varier la condition lors de son évaluation ca me semble peut maintenable et source de multiplication des erreurs (on ne gère plus n cas de figures, mais nxnxn....cas)
Sinon, bien que ce soit souvent crade, tu peux glisser un « goto », ce qui peut être utile même au milieu des instructions du case :
switch ($mode) { case 1 : /* calcul pour 1 */ goto calcul_general; calcul_general: /* calcul commun aux cas 1 à 3 */ break; default: /* ici, on fait autre chose */ break; }
Hola, c'est pas du php ça ! Goto n'existe pas en php et dieux merçi (déjà que le php, ça peut être illisible)
-- Benoit F.
Olivier Miakinen wrote:
Sinon, bien que ce soit souvent crade, tu peux glisser un « goto », ce
qui peut être utile même au milieu des instructions du case :
switch ($mode) {
case 1 :
/* calcul pour 1 */
goto calcul_general;
calcul_general:
/* calcul commun aux cas 1 à 3 */
break;
default:
/* ici, on fait autre chose */
break;
}
Hola, c'est pas du php ça ! Goto n'existe pas en php et dieux merçi
(déjà que le php, ça peut être illisible)
Sinon, bien que ce soit souvent crade, tu peux glisser un « goto », ce qui peut être utile même au milieu des instructions du case :
switch ($mode) { case 1 : /* calcul pour 1 */ goto calcul_general; calcul_general: /* calcul commun aux cas 1 à 3 */ break; default: /* ici, on fait autre chose */ break; }
Hola, c'est pas du php ça ! Goto n'existe pas en php et dieux merçi (déjà que le php, ça peut être illisible)
-- Benoit F.
Benoit F
Dominique Ottello wrote:
Dans une structure switch ($mode) { case 1: ... break; case 2: ... break; case 3: ... break; }
Je peux passer de case 1: à case 2: ou de case 2: à case 3: en effectuant un "break" conditionnel.
Je crois que le plus lisible dans l'histoire serait d'oublier le switch et le remplacer par un il ... elseif ... elsif ... else
-- Benoit F.
Dominique Ottello wrote:
Dans une structure switch ($mode) {
case 1: ... break;
case 2: ... break;
case 3: ... break;
}
Je peux passer de case 1: à case 2: ou de case 2: à case 3: en
effectuant un "break" conditionnel.
Je crois que le plus lisible dans l'histoire serait d'oublier le switch
et le remplacer par un il ... elseif ... elsif ... else
Je peux passer de case 1: à case 2: ou de case 2: à case 3: en effectuant un "break" conditionnel.
Mais je n'arrive pas à passer, avec une condition dans case 1:, directement à case 3:, même avec continue;
Est-ce possible ?
Merci.
bonjour,
pour moi il s'agit de factorisation de code. En d'autres termes écris une procédure/fonction que tu appelles avec les bons paramètres dans tes 'case'.
exemple succint et rapide:
une fois l'exemple écrit.... je me demande si j'ai bien compris ton problème ou si le switch est bien adapté à la situation :-)
*************************************** function f1(param...) { .... } function f2(param...) { .... }
switch (mode) { case 1: aaa; if ( test1) { f1(); } else { f2() } break;
case 2: f1() break;
case 2: f2() break; }
Olivier Miakinen
Hola, c'est pas du php ça ! Goto n'existe pas en php et dieux mer[c]i (déjà que le php, ça peut être illisible)
Oups ! Ben je crois que j'ai dit une grosse connerie. Du coup, j'ai vérifié l'autre truc que j'avais raconté, à propos de la position quelconque du default : eh bien c'était une connerie aussi.
<cit. http://fr2.php.net/switch> Un case spécial est default. Ce cas est utilisé lorsque tous les case ont échoués. Il doit être le dernier cas listé. </cit.>
Hola, c'est pas du php ça ! Goto n'existe pas en php et dieux mer[c]i
(déjà que le php, ça peut être illisible)
Oups ! Ben je crois que j'ai dit une grosse connerie. Du coup, j'ai
vérifié l'autre truc que j'avais raconté, à propos de la position
quelconque du default : eh bien c'était une connerie aussi.
<cit. http://fr2.php.net/switch>
Un case spécial est default. Ce cas est utilisé lorsque tous les case
ont échoués. Il doit être le dernier cas listé.
</cit.>
Hola, c'est pas du php ça ! Goto n'existe pas en php et dieux mer[c]i (déjà que le php, ça peut être illisible)
Oups ! Ben je crois que j'ai dit une grosse connerie. Du coup, j'ai vérifié l'autre truc que j'avais raconté, à propos de la position quelconque du default : eh bien c'était une connerie aussi.
<cit. http://fr2.php.net/switch> Un case spécial est default. Ce cas est utilisé lorsque tous les case ont échoués. Il doit être le dernier cas listé. </cit.>
Dominique Ottello
"Thierry SCHMIT" écrivait :
pour moi il s'agit de factorisation de code. En d'autres termes écris une procédure/fonction que tu appelles avec les bons paramètres dans tes 'case'.
exemple succint et rapide:
Merci à tous pour vos réponses.
Je retiendrais, pour le cas particulier qui me turlupinait, cet exemple de factorisation de code.
-- Un ordinateur résout des problèmes que nous n'aurions pas sans lui
"Thierry SCHMIT" <nospam@nospam.com> écrivait :
pour moi il s'agit de factorisation de code.
En d'autres termes écris une procédure/fonction
que tu appelles avec les bons paramètres dans
tes 'case'.
exemple succint et rapide:
Merci à tous pour vos réponses.
Je retiendrais, pour le cas particulier qui me turlupinait, cet exemple
de factorisation de code.
--
Un ordinateur résout des problèmes que nous n'aurions pas sans lui
pour moi il s'agit de factorisation de code. En d'autres termes écris une procédure/fonction que tu appelles avec les bons paramètres dans tes 'case'.
exemple succint et rapide:
Merci à tous pour vos réponses.
Je retiendrais, pour le cas particulier qui me turlupinait, cet exemple de factorisation de code.
-- Un ordinateur résout des problèmes que nous n'aurions pas sans lui
Xavier
Olivier Miakinen disait le 06/09/2004 20:45:
Sinon, bien que ce soit souvent crade, tu peux glisser un « goto », ce qui peut être utile même au milieu des instructions du case :
switch ($mode) { case 1 : /* calcul pour 1 */ goto calcul_general;
héhé, le goto est a la mode en ce moment :) il y a eu un gros flame a propos de l'introduction de la fonction goto dans php5 , je pensais que tu anticipait :)
voila un blog qui recence pas mal de liens a ce sujet :) http://www.procata.com/blog/archives/2004/07/29/goto-in-php/
A + xavier
Olivier Miakinen disait le 06/09/2004 20:45:
Sinon, bien que ce soit souvent crade, tu peux glisser un « goto », ce
qui peut être utile même au milieu des instructions du case :
switch ($mode) {
case 1 :
/* calcul pour 1 */
goto calcul_general;
héhé, le goto est a la mode en ce moment :)
il y a eu un gros flame a propos de l'introduction de la fonction goto
dans php5 , je pensais que tu anticipait :)
voila un blog qui recence pas mal de liens a ce sujet :)
http://www.procata.com/blog/archives/2004/07/29/goto-in-php/
Sinon, bien que ce soit souvent crade, tu peux glisser un « goto », ce qui peut être utile même au milieu des instructions du case :
switch ($mode) { case 1 : /* calcul pour 1 */ goto calcul_general;
héhé, le goto est a la mode en ce moment :) il y a eu un gros flame a propos de l'introduction de la fonction goto dans php5 , je pensais que tu anticipait :)
voila un blog qui recence pas mal de liens a ce sujet :) http://www.procata.com/blog/archives/2004/07/29/goto-in-php/
A + xavier
Olivier Miakinen
héhé, le goto est a la mode en ce moment :) il y a eu un gros flame a propos de l'introduction de la fonction goto dans php5 , je pensais que tu anticipai[s] :)
Ah non, je ne me suis jamais encore renseigné sur PHP5. J'ai juste confondu avec le C, dans lequel il m'arrive parfois d'utiliser des « goto » dans le seul cas où cela rend le code plus lisible, à savoir la gestion de multiples cas d'erreur.
voila un blog qui recence pas mal de liens a ce sujet :) http://www.procata.com/blog/archives/2004/07/29/goto-in-php/
Je viens d'y apprendre que PHP5 va introduire la gestion des exceptions, qui est une autre alternative au goto. Merci pour le lien.
héhé, le goto est a la mode en ce moment :)
il y a eu un gros flame a propos de l'introduction de la fonction goto
dans php5 , je pensais que tu anticipai[s] :)
Ah non, je ne me suis jamais encore renseigné sur PHP5. J'ai juste
confondu avec le C, dans lequel il m'arrive parfois d'utiliser des
« goto » dans le seul cas où cela rend le code plus lisible, à savoir
la gestion de multiples cas d'erreur.
voila un blog qui recence pas mal de liens a ce sujet :)
http://www.procata.com/blog/archives/2004/07/29/goto-in-php/
Je viens d'y apprendre que PHP5 va introduire la gestion des exceptions,
qui est une autre alternative au goto. Merci pour le lien.
héhé, le goto est a la mode en ce moment :) il y a eu un gros flame a propos de l'introduction de la fonction goto dans php5 , je pensais que tu anticipai[s] :)
Ah non, je ne me suis jamais encore renseigné sur PHP5. J'ai juste confondu avec le C, dans lequel il m'arrive parfois d'utiliser des « goto » dans le seul cas où cela rend le code plus lisible, à savoir la gestion de multiples cas d'erreur.
voila un blog qui recence pas mal de liens a ce sujet :) http://www.procata.com/blog/archives/2004/07/29/goto-in-php/
Je viens d'y apprendre que PHP5 va introduire la gestion des exceptions, qui est une autre alternative au goto. Merci pour le lien.
Ganf
Le Mon, 06 Sep 2004 18:45:51 +0000, Olivier Miakinen a écrit :
Sinon, si je peux me permettre un conseil, lorsque tu veux enchaîner d'un case à un autre, mets *toujours* un commentaire pour dire que l'absence de break est volontaire.
Marrant parce que moi je dirai l'inverse ;) Pouvoir passer au cas suivant tout seul c'est le rôle de switch, sa raison d'être. Si le but est de faire des cas exclusif alors la bonne syntaxe (si tant est qu'il y en est une) est plutot if/elsif/else (qui elle est faite pour). C'est au contraire quand je suis amené à faire un break ou deux dans un switch que je le commente durement.
Ma question c'est : si c'est pour toujours mettre des break, pourquoi un switch ? la syntaxe if/else/else est globalement plus claire (comprendre: plus homogène avec le reste de la syntaxe).
-- Eric
Le Mon, 06 Sep 2004 18:45:51 +0000, Olivier Miakinen a écrit :
Sinon, si je peux me permettre un conseil, lorsque tu veux enchaîner
d'un case à un autre, mets *toujours* un commentaire pour dire que
l'absence de break est volontaire.
Marrant parce que moi je dirai l'inverse ;)
Pouvoir passer au cas suivant tout seul c'est le rôle de switch, sa
raison d'être. Si le but est de faire des cas exclusif alors la bonne
syntaxe (si tant est qu'il y en est une) est plutot if/elsif/else (qui
elle est faite pour). C'est au contraire quand je suis amené à faire un
break ou deux dans un switch que je le commente durement.
Ma question c'est : si c'est pour toujours mettre des break, pourquoi un
switch ? la syntaxe if/else/else est globalement plus claire (comprendre:
plus homogène avec le reste de la syntaxe).
Le Mon, 06 Sep 2004 18:45:51 +0000, Olivier Miakinen a écrit :
Sinon, si je peux me permettre un conseil, lorsque tu veux enchaîner d'un case à un autre, mets *toujours* un commentaire pour dire que l'absence de break est volontaire.
Marrant parce que moi je dirai l'inverse ;) Pouvoir passer au cas suivant tout seul c'est le rôle de switch, sa raison d'être. Si le but est de faire des cas exclusif alors la bonne syntaxe (si tant est qu'il y en est une) est plutot if/elsif/else (qui elle est faite pour). C'est au contraire quand je suis amené à faire un break ou deux dans un switch que je le commente durement.
Ma question c'est : si c'est pour toujours mettre des break, pourquoi un switch ? la syntaxe if/else/else est globalement plus claire (comprendre: plus homogène avec le reste de la syntaxe).