Ferramentas do usuário

Ferramentas do site


clausula-switch-nao-funciona

O estranho caso do case que não funciona

Veja o seguinte código em C e me diga qual seria o resultado impresso na serial:

  1. Serial.begin(9600);
  2. uint8_t variable = 1;
  3. switch (variable)
  4. {
  5. case 0:
  6. Serial.println("zero");
  7. uint8_t myRandomVar = 0;
  8. break;
  9. case 1:
  10. Serial.println("um");
  11. break;
  12. default:
  13. Serial.println("Somente os valores 0 e 1 são aceitos");
  14. break;
  15. }

Se a sua resposta foi 'um' você está enganado!! Na realidade não vai imprimir nada.

O que acontece?

Um 'case' não define um escopo e declarar uma variável alí causa resultados inesperados durante a execução do código. Infelizmente o compilador 'avr-gcc' não parece avisar desse conflito e o problema só vai aparecer na execução, quando os 'cases' subsequentes àquele onde foi feita a declaração não funcionarem.

Solução

Envolver o código do case entre chaves {}. Assim o código ficaria:

  1. Serial.begin(9600);
  2. uint8_t variable = 1;
  3. switch (variable)
  4. {
  5. case 0: {
  6. Serial.println("zero");
  7. uint8_t myRandomVar = 0;
  8. break;
  9. }
  10. case 1:
  11. Serial.println("um");
  12. break;
  13. default:
  14. Serial.println("Somente os valores 0 e 1 são aceitos");
  15. break;
  16. }

Agora sim! O resultado será 'um“ enviado para a porta serial.

Outra opção, é obviamente não declarar variáveis dentro de um 'case. Quando necessário declare antes da clausula ''switch' !

clausula-switch-nao-funciona.txt · Última modificação: por jjo