Go Down

Topic: Verificare n variabili con if (Read 191 times) previous topic - next topic

AleDi2

Ciao a tutti.
Ho un piccolo problemino, anche se penso che sia molto semplice.
Vi faccio subito un esempio:

Code: [Select]
int Val1 = 0;
int Val2 = 0;
int Val3 = 0;
int Val4 = 0;
int Val5 = 0;
int Val6 = 0;
int Val7 = 0;
int Val8 = 0;
int Val9 = 0;
int Val10 = 0;



Facciamo finta di avere 10 variabili che assumono due semplici valori: 0 o 1.
Ora, la domanda è: come posso verificare che, nel caso anche solo una delle 10 variabili diventi pari a valore 1, accenda ad esempio un LED?
Non so se sono stato abbastanza chiaro, però l'idea era di fare più o meno così:

Code: [Select]
if ((Val1 || Val2 || Val3 || Val4 || Val 5 || Val6 || Val7 || Val8 || Val9 || Val10) == 1){
//accendi il led
}
else {
//spegni il led
}


Si può fare?

ORSO2001

#1
Apr 20, 2019, 09:07 pm Last Edit: Apr 20, 2019, 09:09 pm by ORSO2001
ciao...puoi ragionare in questo modo...una int ha 16 bit...se tutti sono a "0" il totale sarà "0"...se anche uno solo è a "1" il totale è diverso da "0"...

ps: comunque il tuo if non è corretto

AleDi2

Sisi lo so che l'if non è corretto, infatti era solo per dare l'idea di cosa deve fare
Io pensavo di sommare tutte le variabili e a quel punto verificare se la variabile totale fosse maggiore di 0...un po' come la storia che dici tu dei bit

maubarzi

in realtà l if va bene se elimini ==1
di fatto testi ogni variabile trattandola come booleana quindi 0 = false ogni altro valore = true e metti tutto in or quindi se tutte le variabili sono zero l intera espressione è false, se almeno una non è zero diventa true, come serve a te
Nessuna buona azione resterà impunita!

Preistoria -> medioevo -> rinascimento -> risorgimento -> rincoglionimento!

uwefed

Userei un array al posto di 10 variabili numerate.
Poi gestireli con dei FOR.
Ciao Uwe

Maurotec

Che spreco di risorse, 10 variabili int, ognuna per salvare il valore di un bit, come ha detto @ORSO, o meglio un interno senza segno di tipo uint16_t  bitsCollection; grande 16 bit.

Ogni bit lo accendi e spegni con _BV(bit), più precisamente:
Code: [Select]

uint16_t  bitsCollection=0;
bitsCollection |=    _BV(15);            // accendo il bit 15
bitsCollection &= ~_BV(15);            // spengo il bit 15

bitsCollection |= _BV(0) | _BV(1) | _BV(2);               // Accendo i primi tre bit
bitsCollection &= ~( _BV(0) | _BV(1) | _BV(2) );       // Spengo i primi tre bit



C'è anche un modo per evitare di usare _BV e gli operatori logici e si chiama in C "bitfield", letteralmente "campi di bit, PS: una volta aperto il libro visto che ci sei dai uno sguardo anche alle "union".

Ciao.

nid69ita

#6
Apr 22, 2019, 09:18 am Last Edit: Apr 22, 2019, 09:20 am by nid69ita
Il problema di base di avere enne variabili tutte dello stesso tipo lo risolvi come dice @uwe usando gli array.
Se poi caso particolare solo bit come dice @maurotec. In arduino ci sono funzioni tipo bitSet e bitRead, un po più semplici da usare
my name is IGOR, not AIGOR

Datman

#7
Apr 22, 2019, 09:58 am Last Edit: Apr 22, 2019, 10:02 am by Datman
Se vuoi rimanere sulle variabili distinte, usa delle variabili byte, che occupano 8 bit. Comunque dovrai scrivere:
if(val1==1 || val2==1 || ... || val10==1) digitalWrite(x, HIGH);

Poiché le variabili che stiamo usando contengono valori numerici (1 oppure 0), è anche corretto scrivere:
if(val1+val2+...+val 10>0) digitalWrite(x, HIGH);

o, più semplicemente:
if(val1+val2+...+val 10) digitalWrite(x, HIGH);
Hi,I'm Gianluca from Roma.I play&work with electronics since I was16(1984).
After 25yrs of maintenance on cameras&video mixers,since 2013myJob is HDTVstudios design.
Since Jan2015 IPlayWith Arduino:bit.ly/2F3LPWP
Thanks 4 a Karma if U like my answer

Go Up