Switch case irrégulier

Bonjour, j'ai un switch case qui me pose problème,
en effet , le switch case ne se comporte pas comme il devrait ?
Tout d'abord, je vérifie que le caractère de choix est correct, et il l'est toujours,
Mais
ex sur le cas 'Y' les instructions de ce bloc ne sont pas exécutées du tout
J'ai fait plein de test en simplifiant au maxi les blocs , e en rajoutant plein d'autres, et je m'aperçois que parfois seule la première instruction est exécutée ou pas du tout ??

Ce switch case fait partie d'un programme installé sur un arduino MEGA, il fait 3096 octets (12¨%)
Quelles peuvent bien être les causes de ce problème ?

Je ne comprend pas ce qui se passe, je souhaite comprendre ,
Merci par avance de vos avis

void traitementTrame(char trame[] ) { 
  Serial.print(F("recu : "));
  Serial.println(trame);
  Serial.println (strlen(trame)); 
  Serial.println(trame[0]);
  switch (trame[0]) { 
    case 'M':      
      Serial.println(" case M");              // indiquer le passage dans le bloc 
      byte fin = strlen(trame)-1 ;
      for (byte i = 0; i < (fin -1) ;i++) {   // copie de la trame recu sans les 2 premiers caracteres le 'M' et le ':' 
          trame[i]= trame[i+2];      
        }        
      trame[fin -1]='\0';
      enregistrement_SD(trame);  // appel de la procedure pour enregister la trame dans un fichier sur la carte SD                      
      delay(20);           
      break;
    case 'W': 
      Serial.println("  case W");          // indiquer le passage dans le bloc 
      char texteval[4] ;                   //  déclarattion tableau de 4 caractères par sécurité
      byte  index = 0;
      texteval[0] =  trame[1];             // 2eme caractere de  l'index  (le ier étant la lettre code)
      texteval[1] =  trame[2];             // 2ieme caractere de l'index
      texteval[2]= '\0';                   // fin de chaine
      index = atoi(texteval);              // transforme la chaine en nombre 
      action(trame[0], index);
      break;
    case 'Y': 
      Serial.println("  case Y");
      char retour[66];
      retour[0] = 'Y';
      byte v = 1; 
      byte valmcp ;
      for (byte a = 0; a < strlen(adrout); a++) {
          for (byte p = 0; p < strlen(port) ; p++) {
            valmcp = lireportmcp(adrout[a], port[p]); 
            for (byte b = 0; b< 8; b++) {
              if (bitRead(valmcp, b)== 1) {retour[v] = '1';} else{ retour[v] = '0';}
              v+= 1; 
              }    
            }
       } 
      retour[v] = '\0'; 
      client.print(retour);
      Serial.print("retourné ") ;
      Serial.println(retour) ;
      break; 
    default :
       break;          
     }
 }

Il faudrait faire imprimer adrout et port

C'est voulu, v ne devrait-elle pas être initialisée à 0 plutôt?

Il faudrait que tu poste ta sortie moniteur série.
Tu es sur d'avoir que des caractères en majuscule ?

sous ton case 'Y', tu crées un tableau de 66 octets, ainsi que d'autres variables.
Normalement, le compilateur a du gueuler car il n'aime pas ça (problème de portée de cette déclaration).
Pour corriger cela, tu dois mettre des accolades { et } autour de ton code, comme ça:

case 'Y':
{
  // TON CODE ICI
}
break;

Pas certain que ton pb vienne de là, mais ça peut pas faire de mal...

1 Like

Malheureusement, il ne dit rien et si on déclare une variable comme cela avec une porté qui dépasse le case, il supprime purement et simplement le code correspondant.

Ah bin dis donc, il est sympa la compilo ! :smirk:
donc ceci explique cela.

Pas vraiment - c’est juste undefined behavior

Un switch case est comme un goto et on n’a pas le droit de sauter au dessus d’une déclaration de variable

Oui, mais il ne le dit pas quand on le fait. Ce serait sympa quand on fait une bêtise, qu'il le dise.

Quand je fais des if then else correctement imbriqués, il me met des tas d'avertissements, il pourrait faire pareil quand c'est incorrect!

Pour éviter ce genre de problème, il vaut mieux mettre entre accolades le bloc d'instructions dès qu'il fait plus que 6 ou 7 lignes.

Parfois il le dit de manière cryptique

Bonjour à tous et merci
Le problème venait bel et bien du manque d'accolade.
Dans mes tests j'avais bien essayé mais j'ai du intégrer aussi le break.
Je clos donc ce post

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.