Problema Switch...Case. Ejecuta uno que no cumple

Hola, tengo un problema con el siguiente statment Switch/case y no entiendo porque. En esta parte del código hay dos variables a y b con valores random del 0 al 5 sin que estos estén repetidos, por ejemplo a=1 y b=4. Lo que me sucede es que da por buena la condición 4 del switch(a) y no entiendo porque. O sea, el código revisa la condición 1 con la variable a y hace lo que toca en el case 1 de a y cuando revisa la condición b con la variable b, veo que entra también en el switch(a) entra en el caso 4 como si el valor de a fuese 4 y no 1...y no entiendo porqué.

A ver si alguién me o aclara :slight_smile:

  boolean control = false;
  int contador = 0;
  while (!control) {
    
    int YellowStatus=digitalRead(BUTTON_YELLOW);
    int RedStatus=digitalRead(BUTTON_RED);
    int GreenStatus=digitalRead(BUTTON_GREEN);
    int BlueStatus=digitalRead(BUTTON_BLUE);
    int WhiteStatus=digitalRead(BUTTON_WHITE);
    int BlackStatus=digitalRead(BUTTON_BLACK);
    
    switch (a){
      case 0:
      if (YellowStatus==PRESSED){
         digitalWrite(pines[a], LOW);
        contador++;
        a=100;// Ho posem perque no miri mes aquest pin 
        break;
         }
      
      case 1:
      if (RedStatus==PRESSED){
         digitalWrite(pines[a], LOW);
        contador++;
        a=100;// Ho posem perque no miri mes aquest pin
        break;
         }
      
        case 2:
      if (GreenStatus==PRESSED){
         digitalWrite(pines[a], LOW);
        contador++;
        a=100;// Ho posem perque no miri mes aquest pin
        break;
         }
       
      case 3:
      if (BlueStatus==PRESSED){
         digitalWrite(pines[a], LOW);
        contador++;
        a=100;// Ho posem perque no miri mes aquest pin
        break;
         }
       
      case 4:
      if (WhiteStatus==PRESSED){
         digitalWrite(pines[a], LOW);
        contador++;
        a=100;// Ho posem perque no miri mes aquest pin
        break;
         }
       
      case 5:
      if (BlackStatus==PRESSED){
         digitalWrite(pines[a], LOW);
        contador++;
        a=100;// Ho posem perque no miri mes aquest pin
        break;
         }
      default: break;
      
       
   }
    
     switch (b){
      case 0:
      if (YellowStatus==PRESSED){
         digitalWrite(pines[b], LOW);
        contador++;
        b=100;// Ho posem perque no miri mes aquest pin 
        break;
         }
      
      case 1:
      if (RedStatus==PRESSED){
         digitalWrite(pines[b], LOW);
        contador++;
        b=100;// Ho posem perque no miri mes aquest pin
        break;
         }
      
        case 2:
      if (GreenStatus==PRESSED){
         digitalWrite(pines[b], LOW);
        contador++;
        b=100;// Ho posem perque no miri mes aquest pin
        break;
         }
       
      case 3:
      if (BlueStatus==PRESSED){
         digitalWrite(pines[b], LOW);
        contador++;
        b=100;// Ho posem perque no miri mes aquest pin
        break;
         }
       
      case 4:
      if (WhiteStatus==PRESSED){
         digitalWrite(pines[b], LOW);
        contador++;
        b=100;// Ho posem perque no miri mes aquest pin
        break;
         }
       
      case 5:
      if (BlackStatus==PRESSED){
         digitalWrite(pines[b], LOW);
        contador++;
        b=100;// Ho posem perque no miri mes aquest pin
        break;
         }
       default: break;
       
   }
    if (contador==seleccion){ // Si s'han apagat tantes llums com n hi havia enceses surt
      control=true; 
     } 
    
  }

Me parece que el switch no es necesario en absoluto en su código.
Сonvierta sus estados de color en una matriz y el código será 10 veces más corto:

uint8_t button_pins[6] = {BUTTON_YELLOW, BUTTON_RED, BUTTON_GREEN,
                          BUTTON_BLUE, BUTTON_WHITE, BUTTON_BLACK};
uint8_t color_Status[6] = {0};

for (byte i =0; i < 6; i++) {
    color_Status[i] = digitalRead(button_pins[i]);}

if ((a < 6) && (color_Status[a] == PRESSED)) {
   digitalWrite(pines[a], LOW);
   contador++;
   a=100; 
}
if ((b < 6) && (color_Status[b] == PRESSED)) {
   digitalWrite(pines[b], LOW);
   contador++;
   b=100; 
}
1 Like

¿Cómo sabes que entra también a = 4?
Lo que veo es que ambos switch() son iguales con la única diferencia de la variable de comparación.
Quiero decir que el resultado es el mismo para a = 1 y b = 4 que para a = 4 y b = 1.
Lo mismo ocurre con cualquier otro par de valores.

1 Like

@MaximoEsfuerzo
Perdon... a quien lo escribiste - yo o OP ?

1 Like

Al OP

1 Like

debes escribir la instrucción break fuera del if, así:

case 0:
      if (YellowStatus==PRESSED){
         digitalWrite(pines[b], LOW);
        contador++;
        b=100;// Ho posem perque no miri mes aquest pin 
         }
        break; // <<<---

case 1:
      

... en todos los casos

1 Like

@mancera1979 :clap:t4:
Muy buena observación.
Vi algo fuera de lugar, algo no encajaba, pero no me di cuenta que era eso.

1 Like

Haciendo lo que comentas de poner el "break" fuera del "if" hace que el programa se ejecute perfectamente. Ese era el error.

Gracias!!!

Muy interesante el código que pones. Lo analizaré (está un poco fuera de mi rango de conociemiento), lo probaré y seguro que lo uso en breve.

Gracias

De todos modos no sabía que si no ponías el break,el codigo ejecutase los siguientes "case" aunque la condición de la variable "switch" no se cumpliese....vamos, que siguiese en otro statment switch distinto.

Gracias a todos!

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