switch case, stranezza

Salve,

ho trovato per caso nella sezione internazionale un codice come questo:

int buffer;
switch (buffer) {
        case 1 ... 5:
	 Serial.println("1 - 5");
	 break;
	case 6 ... 7:
	 Serial.println("6 - 7");
	  break;
	default:
        Serial.println("ZERO");
}

Incuriosito ho provato a compilare e non da errori e funziona facendo quello che deve. Ma è un caso oppure e corretto mettere nel case una cosa del genere 1 ... 5 Io non avevo mai visto un uso del genere dello switch case

Ulteriore domanda: come potrei fare per utilizzare delle variabili float al posto delle int ?

Basta andare a guardare la sintassi dello switch/case in GCC ... QUI hai la spiegazione. Si chiama "case-range" ed è fuori dallo standard 'C' quindi ... meglio evitarlo !

La forma standard è:

int buffer;
switch (buffer) {
   case 1:
   case 2:
   case 3:
   case 4:
   case 5:
      Serial.println("1 - 5");
      break;
   case 6:
   case 7:
      Serial.println("6 - 7");
      break;
   default:
      Serial.println("ZERO");
}

E NO, il case accetta solo interi.

Guglielmo

É però possibile, visto che si parla di stati finiti, creare un array di float carico con quelli necessari, e confrontare il valore con ogni elemento dell'array. La funzione restituirà il numero successivo (così da lasciare libero 0) dell'indice dell'array ove é stata verificata l'uguaglianza. Su quel valore si fa la switch

lo switch accetta interi come variabile da controllare: switch(variabile_intera) e costanti come case.

interessante la soluzione di Silente...così nella funzione potresti anche gestire il range di accettabilità di un valore...che forse ti risolverà un po' di casini con i confronti tra float.

ORSO2001:
... così nella funzione potresti anche gestire il range di accettabilità di un valore...

... infatti, i confronti con i float sono sempre a rischio (causa gli arrotondamenti interni), mentre potrebbe fare un array a due dimensioni e per ogni elemento avere quindi un minimo ed un massimo accettabile con cui confrontare il valore.

Guglielmo