IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Conseil sur utilisation switch case


Sujet :

C

  1. #1
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 446
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 446
    Points : 43 090
    Points
    43 090
    Par défaut Conseil sur utilisation switch case
    Bonjour,

    Je voudrais votre avis sur l'usage correct d'une boucle switch...case

    voici mon pseudo code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    switch(variable)
    {
     case 1:
      ...
      break;
     case 2:
      if (condition)
      {
          ...
          ...
         break;
      }
     case 3:
      ...
     break
     default:
      ...
    }
    Le code en dessous de case 3 s’exécute pour 2 et 3 sauf si condition est rempli

    Ca fonctionne. Mais cela est correct au niveau code ?
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  2. #2
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2015
    Messages
    644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2015
    Messages : 644
    Points : 1 509
    Points
    1 509
    Par défaut
    Bonjour,

    Dans l'idée ça à pas l'air mal pour ma part.

    La seule chose éventuellement à redire, c'est le fait que tu n'ai pas de break dans le cas 2. Et après, passer d'un cas à un autre de cette manière, je sais pas si c'est vraiment très propre...

    Mais dans l'idée, ça fonctionne plutôt bien
    Un fait toujours plaisir et encourage à l'entraide. Un n'est pas à négliger, pensez aux autres !

    Que la force soit avec Developpez.net
    Je ne suis pas un crack en informatique, loin de là, mais il n'y a pas que les mécaniciens qui sachent conduire une voiture

  3. #3
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Citation Envoyé par chrtophe Voir le message
    Le code en dessous de case 3 s’exécute pour 2 et 3 sauf si condition est rempli
    Plutôt : le code du case 3 est exécuté lorsque :
    • variable vaut 3 ;
    • variable vaut 2 et condition est faux.


    Citation Envoyé par chrtophe Voir le message
    Ca fonctionne. Mais cela est correct au niveau code ?
    C'est autorisé, et ça s'avère même utile dans certains cas (et pas que pour un Duff's device...). Ça s'appelle le control fallthrough.

    Est-ce une « mauvaise pratique » spaghetti, ou non.. comme beaucoup de choses ça dépend du cas d'utilisation. Quoi qu'il en soit un commentaire n'est jamais de trop dans ce genre de cas pour préciser aux développeurs qui feront la maintenance qu'il ne s'agit pas d'un oubli.
    Anectodiquement certains langages (je pense à C#) interdisent explicitement le fallthrough en produisant une erreur en l'absence de break, sauf si le case n'est pas spécialisé (est vide).


    Citation Envoyé par JujuPomme Voir le message
    La seule chose éventuellement à redire, c'est le fait que tu n'ai pas de break dans le cas 2.
    Moui.. c'est le pivot central de la question, non ?

  4. #4
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    Citation Envoyé par chrtophe Voir le message
    Ca fonctionne. Mais cela est correct au niveau code ?
    si c'est précisément ce que tu cherches à faire oui, si c'est pas correct le compilateur te le fera savoir de toutes façons...

  5. #5
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 446
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 446
    Points : 43 090
    Points
    43 090
    Par défaut
    Plutôt : le code du case 3 est exécuté lorsque :

    variable vaut 3 ;
    variable vaut 2 et condition est faux.
    oui, j'ai oublié le mot non : condition est non rempli, bien vu.

    Anectodiquement certains langages (je pense à C#) interdisent explicitement le fallthrough en produisant une erreur en l'absence de break
    Donc faut que je méfie si je passe en C++ aussi ou si je change de compilateur, bien que j'aurais une erreur à la compilation, donc normalement je devrais comprendre ce qui se passe.

    En regardant sur le net :
    https://en.wikipedia.org/wiki/Switch_statement

    Faut faire gaffe car Perl, bash ne gèrent pas le fallthrough par défaut mais le font avec le mot clé continue.

    Donc vraiment à utiliser avec parcimonie.

    Merci pour les réponses.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  6. #6
    Membre expérimenté
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    543
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 543
    Points : 1 745
    Points
    1 745
    Par défaut
    Bonjour
    Citation Envoyé par chrtophe Voir le message
    Bonjour,

    Je voudrais votre avis sur l'usage correct d'une boucle switch...case

    voici mon pseudo code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    switch(variable)
    {
     case 1:
      ...
      break;
     case 2:
      if (condition)
      {
          ...
          ...
         break;
      }
     case 3:
      ...
     break
     default:
      ...
    }
    Le code en dessous de case 3 s’exécute pour 2 et 3 sauf si condition est rempli

    Ca fonctionne. Mais cela est correct au niveau code ?


    Oui c’est autorisé et c’est ce que l’on appelle un arrêt inconditionnel : c’est à dire un arrêt volontaire du switch ou d’une boucle, par une autre condition que celle précisée dans l'en-tête de la boucle ou du switch.

    « Break » provoque une sortie immédiate du switch le plus proche, d’une boucle ou l’arrêt d’une prochaine instruction. En l'absence d'une instruction break, toutes les instructions depuis l'étiquette case sont exécutée jusqu'à la fin de l'instruction switch, y compris « default » (si il n’y a pas de break). Donc l’instruction break arrête l'exécution de la boucle englobante ou l'instruction conditionnelle la plus proche dans laquelle elle apparaît.
    Exemple:
    Attention si vous oublié volontairement les breaks toutes les instructions depuis l'étiquette case sont exécutée jusqu'à la fin de l'instruction switch.
    et l’exemple que je poste démontre d’une par le cas de l’arrêt inconditionnel, mais également les défauts dû à l’absence des break dans un switch.

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
     
    //
    //  main.c
    //  TesteCode
    //
    #include <stdio.h>
    #include <stdlib.h>
     
    int main( void ){
     
     
     
     
        int i = 2;
        int c_a = 10; //condition vrais
        int c_b = 0; //condition fausse
     
        for( i = 0; i < 100; i++ ){
            if ( i == 50 )
                break;
            continue;
        }
        fprintf( stdout, "valeur de i aprés break for\t:%d\n", i );
     
        i = 0;
        do{
            if( i == 55 )
                break;
        }while( i++ != 100 );
        fprintf( stdout, "valeur de i aprés break do-while\t:%d\n", i );
     
        i = 2;
     
        for( i = 0; i < 10; i++ ){
            switch( i ){
                case 1:
                    fprintf( stdout, " switch\t:%d\n", i );
                    break;
                case 2:
                    if( i > 1 ){
                        fprintf( stdout, " switch if \t:%d\n", i );
                        break; // arrêt immédiat du break
                    }
                    fprintf( stdout, " switch\t:%d\n", i ); // instruction non exécuté
                case 3:
                    fprintf( stdout, " switch\t:%d\n", i );
                    break; // arrêt immédiat du break
                case 4:
                    if( i > 1 ){
                    fprintf( stdout, " switch if \t:%d\n", i );
                    break;
                    }
                    fprintf( stdout, " switch\t:%d\n", i );
                    break;
                case 5:
                    do{
                        if( i == 55 )
                            break;  // sortie de la boucle
                    }while( i++ != 100 );
                    fprintf( stdout, "valeur de i aprés break do-while\t:%d\n", i );
                    i = 5; // pour la suite de l'exemple normalement arrêt du programme
                    break; //sortir du switch
                case 6:
                    for( i = 6; i < 100; i++ ){
                        if ( i == 50 )
                            break; //arrêt de la boucle mais pas du switch.
                    }
                    fprintf( stdout,
                            "valeur de i aprés break for case 6\t:%d\n", i );
                    //break;  //correctif arrêt du switch sinon poursuite
                case 7:
                    while( i++ != 100 ){
                        if( i == 50 )
                            break;
                    }
                    fprintf( stdout, "case 7 vaux 50\n" );
                    //break; //pas de break condition continue
                case 8:
                    i = 8; //pour l'exemple sinon arrêt
     
                    if( c_a ){
                        fprintf( stdout, "Condition remplis\n" );
                        break;
                    }
                    fprintf(stdout, "saut condition %d\n",i );
                    break; //
                case 9:
                    if( c_b ){
                        fprintf( stdout, "Condition remplis\n" );
                        break;
                    }
                    fprintf(stdout, "saut condition %d\n", i );
                    break; //
     
                default:
                    fprintf( stdout, " switch default \t:%d\n", i );
                    break;
            }
     
            getchar();
            fprintf( stdout, "PASSE\t:%d\n", i );
        }
     
        return EXIT_SUCCESS;
    }


    Citation Envoyé par Matt_Houston Voir le message
    Plutôt : le code du case 3 est exécuté lorsque :
    • variable vaut 3 ;
    • variable vaut 2 et condition est faux.

    C'est autorisé, et ça s'avère même utile dans certains cas (et pas que pour un Duff's device...). Ça s'appelle le control fallthrough.

    Est-ce une « mauvaise pratique » spaghetti, ou non.. comme beaucoup de choses ça dépend du cas d'utilisation. Quoi qu'il en soit un commentaire n'est jamais de trop dans ce genre de cas pour préciser aux développeurs qui feront la maintenance qu'il ne s'agit pas d'un oubli.
    Exacte, mais cela dépend de la condition si elle est vraie peut importe la valeur, le flux est maîtrisé et il n'y a pas d'exécution d'instruction suivante mais plutôt une sortie immédiate du switch. Le cas contraire l'instruction suivante est exécuté.
    Honnêtement, je ne pense pas que l’on parle de code spaghetti dans le sens propre du terme, car tout dépend de ce que l’on souhaite faire mais si l’on oublie de façon volontaire les breaks là on peut parle de code spaghetti car il y'a pas de contrôle de flux. mais encore le code spaghetti est un code floue avec un usage excessif de sauts inconditionnels il est encore un peut trop tôt de parler de code spaghetti.

    à bientôt
    Celui qui peut, agit. Celui qui ne peut pas, enseigne.
    Il y a deux sortes de savants: les spécialistes, qui connaissent tout sur rien,
    et les philosophes, qui ne connaissent rien sur tout.
    George Bernard Shaw

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. PB sur un switch case
    Par davidif dans le forum Visual C++
    Réponses: 9
    Dernier message: 25/11/2013, 14h38
  2. Probleme sur un switch case
    Par Hew dans le forum Débuter
    Réponses: 5
    Dernier message: 24/06/2011, 17h40
  3. [1.x] Conseils sur utilisation de Symfony
    Par Fused dans le forum Symfony
    Réponses: 6
    Dernier message: 10/07/2010, 14h32
  4. Utilisation switch case
    Par sebounty dans le forum Débuter
    Réponses: 12
    Dernier message: 06/06/2007, 11h05
  5. [Language] aide sur les switch case
    Par pouss dans le forum Langage
    Réponses: 3
    Dernier message: 05/04/2005, 11h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo