Difficilmente sarete accontentati dato che lo switch..case accetta solo valori numerici. Questo dipende dal compilatore, non dall'Arduino.
Al max potete chiedere di specificare questa cosa nel reference, come avevo suggerito.
Vabbe ce ne faremo una ragione ![]()
Ma io ho solo chiesto di modificare il reference, non ho chiesto modifiche sw.
Comunque sullo sciopero sono disponibile ![]()
Rispondevo a pablos, che chiedeva gli switch con le stringhe.
Testato,
la richiesta andrebbe cambiata, lo switch funziona anche con i char, sebbene di un solo carattere. Visto che gli int occupano 2 byte può anche essere che si riesca con i char di 2 caratteri ma a questo punto serve un chiarimento su come funziona questo switch.
Funziona con i char perché i char sono caratteri rappresentati in memoria dal corrispondente valore ASCII.
Difatti gli switch con i char sono fatti con i singoli apici:
swicht (var) {
case 'A':
...
case 'B':
ecc..
Proprio perché con i singoli apici il compilatore interpreta il carattere come valore ASCII, quindi quando metti 'A' è come se mettessi 65.
Si, questo lo sapevo ma hai fatto bene a precisarlo, io l'avevo omesso.
Però se scrivi che lo switch funziona solo con gli int sembra che con i char ad un byte non funziona. Credo che andrebbe precisato esattamente con quale tipo di variabili funziona.
Prendendo una pagina sul C++ di Microzozz su Switch
correttamente scrivono che
The expression must be of an integral type or of a class type for which there is an unambiguous conversion to integral type.
che, secondo questa tabella
sarebbero i char, bool, short, int e long anche unsigned.
Quindi credo che andrebbe scritta una cosa analoga.
NOn so se ti riferisci a me, ma io ho precisato che funziona con i "numeri", non solo con gli int.
Quindi con tutto ciò che in memoria è rappresentabile numericamente.
Martellata nelle mani per me.
No, non mi riferivo a te, anche se, volendo fare i pignoli anche le stringhe sono numeri e a questo punto mi becco la seconda martellata.
Mi riferivo alla segnalazione di Testato, dove scrive "int" anche se nell'esempio usa il char. Non vorrei che poi chi corregge peggiorasse il problema.
zoomx:
No, non mi riferivo a te, anche se, volendo fare i pignoli anche le stringhe sono numeri e a questo punto mi becco la seconda martellata.
???
Le stringhe sono un puntatore a un vettore di char. Certamente è un numero (pointer).
Se vuoi fare confronto fra stringhe usando i puntatori, funziona.
Ma la macchina ti dirà se i due puntatori sono uguali (ovvero puntano allo stesso indirizzo) non che quello a cui puntano ci sono 2 "frasi" uguali.
nid69ita:
Le stringhe sono un puntatore a un vettore di char. Certamente è un numero (pointer).
Se vuoi fare confronto fra stringhe usando i puntatori, funziona.
Ma la macchina ti dirà se i due puntatori sono uguali (ovvero puntano allo stesso indirizzo) non che quello a cui puntano sono 2 "frasi" uguali.
Mi hai anticipato.
zoomx:
Martellata nelle mani per me.No, non mi riferivo a te, anche se, volendo fare i pignoli anche le stringhe sono numeri e a questo punto mi becco la seconda martellata.
Mi riferivo alla segnalazione di Testato, dove scrive "int" anche se nell'esempio usa il char. Non vorrei che poi chi corregge peggiorasse il problema.
Allora ti tocca la terza martellata, perche' nel mio esempio riporto la condizione di NON funzionamento, con Strinhge, guarda bene, proprio a sottolineare che con le strinhge non funziona ![]()
Perfetto con le stringhe non funziona è chiarito, però se mi ritrovassi nella condizione di verificare delle stringhe (non una singola lettera) e associare ad esse dei case, dovrei usare questa pappardella di roba?
if stringa == "pippo" var_case=1
if stringa == "tizio" var_case=2
if stringa == "caio" var_case=3
switch (var_case)
{
case 1:
...
break;
case 2:
...
break;
case 3:
ciao
Si se PER FORZA vuoi usare la switch.
Altrimenti usi molto più semplicemente if-elseif
if(stringa=="pippo")
{
}
elseif(stringa=="tizio")
{
}
elseif(stringa == "caio")
{
}
effettivamente domanda stupida
ci metto molto di più a fare gli if e poi i case, si fa subito l'if e fine della storia
ciao
pablos:
effettivamente domanda stupidaci metto molto di più a fare gli if e poi i case, si fa subito l'if e fine della storia
In realtà c'è un caso in cui la tua soluzione è probabilmente più leggibile ...
Immagina di avere parecchie stringhe da verificare e comportarti di conseguenza (es. delle stringhe di comando) ... le metti in un array, poi fai una unica comparazione all'interno di un FOR di tutti gli elementi ed, alla fine, usi l'indice trovato come variabile del CASE ![]()
Guglielmo
Scusa Testato, hai ragione tu, non avevo notato i doppi apici e mi merito pienamente la terza martellata.
La soluzione di gpb01 è interessante visto che l'uso più comune dello switch con stringhe credo sia proprio l'interpretazione di comandi leggibili non di una sola lettera.
risolto grazie alla fine prelevo solo la lettera che mi serve e la converto in char
//Simulazione cambiamento registro per i pin settati in INPUT
void commutaz_dig_port(String parz) // fornisco la lettera del Registro e il suo bit es: PIN-C7 parz = C7
{
//PORT A,B,C,D,E,G,H,J,L,F,K
//String lett_port = parz.substring(4,5);
String Dbit = parz.substring(5,6)+"0";
char thisChar[Dbit.length()];
Dbit.toCharArray(thisChar, Dbit.length()) ;
byte a = atoi(thisChar); //trovo l'intero
char char_lett = parz.charAt(4); // converto carattere alla posizione 4
switch (char_lett)
{
//my_port |= (1<<a);... on my_port &= ~(1<<a)...off
case 'A':
{
byte my_port = PINA;
byte B[] = {22,23,24,25,26,27,28,29}; //pin corrispondenti al PORT_A
if(bit_is_0(PORTA, a)) my_port |= (1<<a); else my_port &= ~(1<<a);
if(bit_is_0(DDRA, a)) BitChange(Port[0], my_port, B, 0); else PORTA = my_port;
}
break;
case 'C':
{
byte my_port = PINC;
byte B[] = {37,36,35,34,33,32,31,30}; //pin corrispondenti al PORT_C
if(bit_is_0(PORTC, a)) my_port |= (1<<a); else my_port &= ~(1<<a);
if(bit_is_0(DDRC, a)) BitChange(Port[2], my_port, B, 2); else PORTC = my_port;
}
break;
case 'D':
{
byte my_port = PIND;
byte B[] = {21,20,19,18,99,99,99,38}; //pin corrispondenti al PORT_D
if(bit_is_0(PORTD, a)) my_port |= (1<<a); else my_port &= ~(1<<a);
if(bit_is_0(DDRD, a)) BitChange(Port[3], my_port, B, 3); else PORTD = my_port;
}
break;
case 'E':
{
byte my_port = PINE;
byte B[] = {99,99,99,5,2,99,99,99};
if(bit_is_0(PORTE, a)) my_port |= (1<<a); else my_port &= ~(1<<a);
if(bit_is_0(DDRE, a)) BitChange(Port[4], my_port, B, 4); else PORTE = my_port;
}
break;
case 'G':
{
byte my_port = PING;
byte B[] = {41,40,39,99,99,99,99,99}; //pin corrispondenti al PORT_G
if(bit_is_0(PORTG, a)) my_port |= (1<<a); else my_port &= ~(1<<a);
if(bit_is_0(DDRG, a)) BitChange(Port[5], my_port, B, 5); else PORTG = my_port;
}
break;
case 'H':
{
byte my_port = PINH;
byte B[] = {17,16,99,99,7,8,9,99};
if(bit_is_0(PORTH, a)) my_port |= (1<<a); else my_port &= ~(1<<a);
if(bit_is_0(DDRH, a)) BitChange(Port[6], my_port, B, 6); else PORTH = my_port;
}
break;
case 'J':
{
byte my_port = PINJ;
byte B[] = {15,14,99,99,99,99,99,99};
if(bit_is_0(PORTJ, a)) my_port |= (1<<a); else my_port &= ~(1<<a);
if(bit_is_0(DDRJ, a)) BitChange(Port[7], my_port, B, 7); else PORTJ = my_port;
}
break;
case 'L':
{
byte my_port = PINL;
byte B[] = {49,48,47,46,45,44,43,42};
if(bit_is_0(PORTL, a)) my_port |= (1<<a); else my_port &= ~(1<<a);
if(bit_is_0(DDRL, a)) BitChange(Port[8], my_port, B, 8); else PORTL = my_port;
}
break;
case 'F':
{
byte my_port = PINF;
byte B[] = {54,55,56,57,58,59,60,61};
if(bit_is_0(PORTF, a)) my_port |= (1<<a); else my_port &= ~(1<<a);
if(bit_is_0(DDRF, a)) BitChange(Port[9], my_port, B, 9); else PORTF = my_port;
}
break;
case 'K':
{
byte my_port = PINK;
byte B[] = {62,63,64,65,66,67,68,69};
if(bit_is_0(PORTK, a)) my_port |= (1<<a); else my_port &= ~(1<<a);
if(bit_is_0(DDRK, a)) BitChange(Port[10], my_port, B, 10); else PORTK = my_port;
}
break;
}
per curiosita' a che ti serve fare queste manovre sui registri ?
Sulla pagina web ho 70 pulsanti e 70 led, ciascun pulsante ha il nome in base al nome del suo registro e alla posizione del bit.
Quando lo premo mi spedisce su arduino la sua sigla es (button 25) A3 ... (button 45) L4. ecc ecc
Inoltre visualizzo costantemente lo stato dei 10 registri con soli 10 byte scomposti opportunamente in bit dal js ogni pochi ms
Per cui se premo il 45, mi va sul PORTL bit 4 se è a 0 lo mette a 1, se è a 1 lo mette a 0 ... il problema nasce quando quel tasto è settato come INPUT, così vado a vedere tramite DDRL(suo bit) se è zero vuol dire che è un input se 1 vuoldire che è output
Se cerchi di cambiare il registro di un pin che è input non cambierà mai, ma se crei una maschera che simula il contenuto byte dei registri per la visualizzazione posso impostarli come voglio, è un po' complicato sono 4000 righe di programma e non ci capisco più manco io :), ma in questo modo riesco a fargli eseguire le stesse istruzioni che farebbe premendo un pulsante collegato all'hardware, praticamente da remoto premo un pulsante facendo credere al micro che il byte del registro è cambiato quando non è vero (questo vale solo sei il pin è IN), se invece è OUT cambia direttamente il registro reale
Lo sketch non possiede nessun digitalwrite e nessun digitalread, ma solo azioni e reazioni generate dalla lettura e scrittura di una esatta copia di byte dei registri, però manipolati da me.