Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Forum général sur le langage C !

Modérateur : Jérémy

Question sur le switch-case ?
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#1 Message par Jérémy » dim. 29 nov. 2015 16:55

Bonjour à tous ,

Je m’aperçois que la fonction switch , ne peux contenir qu'une seule ligne de traitement ?

Peut être , ai-je mal compris?

Dans l'exemple il donne :

Code : Tout sélectionner

switch (phase) {
  case 
0Lo();  break;
  case 
1Mid(); break;
  case 
2Hi();  break;
  default: 
Message("Invalid state!");


Je ne peux donc pas ecrire :

Code : Tout sélectionner

case0 traitement1traitement2traitement3; break; 


Si vous avez une explication, car ce me parait bizarre, si on veut faire quelques calcul ou autre, on est obligé de passé par une fonction.
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Question sur le switch-case ?
Subzero64170
Avatar de l’utilisateur
Débutant
Débutant
Messages : 51
Âge : 37
Enregistré en : octobre 2015
Localisation : PAU

#2 Message par Subzero64170 » dim. 29 nov. 2015 18:53

Salut Jeremy,
Apparemment on peut exécuter plusieurs instructions à la suite dans un case en language C; d'aprés cet exemple de prog d'un arduino ça à l'air possible voici le lien vers la page : lien switch case arduino

Code : Tout sélectionner

// fait un choix parmi plusieurs messages reçus
switch (message) {
    case 
0//si le message est "0"
        //allume que la sortie 3
        
digitalWrite(3,HIGH);
        
digitalWrite(4,LOW);
        
digitalWrite(5,LOW);
        break;
    case 
1//si le message est "1"
        //allume que la sortie 4
        
digitalWrite(3,HIGH);
        
digitalWrite(4,LOW);
        
digitalWrite(5,LOW);
        break;
    case 
2//si le message est "2"
        //allume que la sortie 5
        
digitalWrite(3,LOW);
        
digitalWrite(4,LOW);
        
digitalWrite(5,HIGH);
        break;
    } 
“L'imagination est plus importante que le savoir.” A.Einstein

Question sur le switch-case ?
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#3 Message par Jérémy » lun. 30 nov. 2015 00:02

Hello Subzero,

Je crois que justement ça ne fonctionne pas avec mikroC . Je ne suis pas certains alors je ferais quelques tests demain , si je trouve le temps.

Je pensais aussi que ça fonctionnait comme ca, ca me paraitrais normal , bizarre ! je te tiens au jus .
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Question sur le switch-case ?
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#4 Message par paulfjujo » lun. 30 nov. 2015 18:37

bonsoir,

il faut mettre des accolades entre chaque "case"

Code : Tout sélectionner


switch 
(phase) {
  case 0: 
    
{
     Led1=0;
     Led2=1;
     Tache1();
      break;
    }
  case 1:
  {
     Led2=0;
     Led3=1;
     Tache2();
     break;
    }
  case 2:
   {
     Led3=0;
     Led4=1;
     Tache3();
     break;
    }
  default: Message("Invalid state!");



voir state machine ... usage immoderé de switch case ...

un extrait ci dessous

Code : Tout sélectionner


 
switch (BT_state) {
      case  
0: {
                
response 0;                   // Clear response
                
if (tmp == 'C')                 // We have 'C', it could be CMD<cr><lf>  or CONN
                  
BT_state 1;                 // Expecting 'M' or 'N'
                
if (tmp == 'A')                 // We have 'A', it could be AOK<cr><lf>
                  
BT_state 11;                // expecting 'O'
                
if (tmp == 'E')                 // We have 'E', it could be END<cr><lf>
                  
BT_state 31;                // expecting 'N'
                
break;                          // ...
      
}

      case  
1: {
                if (
tmp == 'M')
                  
BT_state 2;
                
//else if (tmp == 'O')
                //  BT_state = 22;
                
else
                  
BT_state 0;
                break;
      }

      case  
2: {
                if (
tmp == 'D') {
                  
response BT_CMD;           // CMD
                  
BT_state 40;
                }
                else
                  
BT_state 0;
                break;
         }
         ... 
etc .. 
          

Attention!! ET c'est pas fini !
Aide toi, le ciel ou FantasPic t'aidera

Question sur le switch-case ?
Claudius
Avatar de l’utilisateur
Passioné
Passioné
Messages : 260
Âge : 69
Enregistré en : septembre 2015
Localisation : ELANCOURT (78 - YVELINES)
Contact :

#5 Message par Claudius » lun. 30 nov. 2015 20:19

Bonsoir,
il faut mettre des accolades entre chaque "case"...

Le seul cas où les accolades sont requises est lorsque une ou plusieurs variables doivent être définies dans le traitement du case pour bien marquer leur espace de visibilité. Ces variables seront donc locales au bloc et non visibles à l'extérieur de celui-ci...

Si aucune variable n'est définie, les spécifications du Langage C n'imposent pas ces 2 accolades ouvrante et fermante ;-)

Zéro pointé si le compilateur impose lesdites accolades dans tous les cas ;-(

Question sur le switch-case ?
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#6 Message par Jérémy » lun. 30 nov. 2015 21:29

Bonsoir,

Merci à tous les trois pour vos réponses. Ca fonctionne parfaitement avec les accolades !
Je suis persuadé d'avoir essayé avec , sans succès . peut être que j'avais mis le break en dehors ; En tout état de cause , j'ai forcement du me gourer quelque part , car la ça fonctionne parfaitement .

Un switchn'est plus ni moins qu'un if...elseif en fait !

Merci !
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Question sur le switch-case ?
Gérard
Avatar de l’utilisateur
Expert
Expert
Messages : 1640
Âge : 65
Enregistré en : septembre 2015
Localisation : Alsace - Haut-Rhin

#7 Message par Gérard » lun. 30 nov. 2015 21:51

Une petite question : pourquoi un break dans chaque 'case' ?
Je pensais que après être entré dans un 'case' et après réalisation des opérations prévues, on allait définitivement sortir du 'switch' ?
Le 18/04/19 je suis devenu papy de jumeaux, le 01/09/23 une petite cousine des jumeaux est née.

Question sur le switch-case ?
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#8 Message par Jérémy » lun. 30 nov. 2015 21:58

Il me semble que c'est pour ne pas prendre en compte les cas suivants. Ainsi on évite d'évaluer les autres possibilités du case.
le break fait sauté directement à la fin du case !

Il me semble , attendons l'avis de quelqu'un de mieux calé que moi :P
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Question sur le switch-case ?
Gérard
Avatar de l’utilisateur
Expert
Expert
Messages : 1640
Âge : 65
Enregistré en : septembre 2015
Localisation : Alsace - Haut-Rhin

#9 Message par Gérard » mar. 1 déc. 2015 09:06

Si on entre dans un cas, il n'est pas nécessaire d'évaluer tous les autres cas qui suivent.
J'ai loupé quelque chose?
Le 18/04/19 je suis devenu papy de jumeaux, le 01/09/23 une petite cousine des jumeaux est née.

Question sur le switch-case ?
Claudius
Avatar de l’utilisateur
Passioné
Passioné
Messages : 260
Âge : 69
Enregistré en : septembre 2015
Localisation : ELANCOURT (78 - YVELINES)
Contact :

#10 Message par Claudius » mar. 1 déc. 2015 09:59

Bonjour,

Compléments de réponses dans l'ordre chronologique:

@Jérémy:
- Un switch n'est plus ni moins qu'un if...else if en fait ! => Oui, sauf que le compilateur optimise suivant le nombre de cas à tester (cf. Implémentation)

- le break fait sauter directement à la fin du case ! => Non, fait sauter directement à la fin du switch à son l'accolade fermante terminant l'exécution de l'instruction switch pour être précis

@Gérard:
- Si on entre dans un cas, il n'est pas nécessaire d'évaluer tous les autres cas qui suivent => En quelque sorte oui, mais il est plus juste d'écrire "il ne faut pas évaluer..." dans le cas avec break ;-). Attention à l'absence involontaire de break qui conduit à un enchainement d'instructions de plusieurs cas mais qui peut être volontaire si cet enchainement est souhaité; mettre dans ce cas un commentaire explicite ou mieux une instruction goto / label pour le lecteur du code qui n'aura pas à se poser de question (volontaire ou oublie ?)

- J'ai loupé quelque chose ? => Oui et non, si un doute toujours se reporter aux spécifications du langage (cf. notamment Instruction switch)

NB: L’accueil d'accolades ouvrante / fermante dans le bloc case / break est requis lorsque le compilateur "accepte" la définition de variables locales dans ce bloc mais n'est pas obligatoire si aucune variable n'est à définir (désolé d'insister ;-)).
Voir C++ : Déclarer une variable dans un switch; c'est expliqué pour du C++ mais le compilateur C applique la même règle...


Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 47 invités