Come funziona FOR con IF

Il dubbio è semplice: Ho 5 termostati e 5 uscite - se anche una sola uscita è OFF pur avendo il termostato ON voglio accendere un flag else, il flag deve essere 0.

Quindi con la scansione dei termostati term (x) e delle uscite RES (x) pensavo di fare un ciclo FOR da 0 a 4

Ma prima di scriverlo (e di provarlo) mi sono domandato se mi accenderà il flag per OGNI linea per poi spegnermelo alla successiva e uscire (come penso) oppure dopo averli scansionati tutti, perché la condizione che voglio è - se anche una sola uscita è OFF pur avendo il termostato ON voglio accendere un flag else qualsiasi altra condizione il flag deve essere 0.

Ecco perché mi è venuto il dubbio "essere o non essere, questo è il problema..."

Azzeri la flag prima di entrare nel for, nel for ti chiedi se il termostato (X) è ON e uscita (X) è OFF metti a 1 la flag, quando esci dal for, se la flag è 1 vuol dire che almeno uno dei termostati è ON ma l'uscita è OFF.

Se vuoi sapere QUALE è ... allora devi usare un vettore di flag ;)

Guglielmo

steve-cr:
…Ho 5 termostati e 5 uscite

  • se anche una sola uscita è OFF pur avendo il termostato ON voglio accendere un flag
    else, il flag deve essere 0…

Se ho capito bene vuoi fare una cosa simile

byte status = 0;
for(byte b = 0; b < 5; b++)
{
   //Funzione che ritorna 0 se uscita ON, 1 se OFF. In questo modo
   //alla fine del FOR se avrai status > 0 sai che c'e' un uscita OFF
   status += checkExit(b); 
}
if(status > 0) flag = 1; //Flag acceso
else flag = 0; //Flag spento

Triko93:
Se ho capito bene vuoi fare una cosa simile

byte status = 0;

for(byte b = 0; b < 5; b++)
{
  //Funzione che ritorna 0 se uscita ON, 1 se OFF. In questo modo
  //alla fine del FOR se avrai status > 0 sai che c’e’ un uscita OFF
  status += checkExit(b);
}
if(status > 0) flag = 1; //Flag acceso
else flag = 0; //Flag spento

si,certo, ma di status ne ho 5. Magari tre a 0 e due a 1
Quindi?

gpb01: Azzeri la flag prima di entrare nel for, nel for ti chiedi se il termostato (X) è ON e uscita (X) è OFF metti a 1 la flag, quando esci dal for, se la flag è 1 vuol dire che almeno uno dei termostati è ON ma l'uscita è OFF.

Se vuoi sapere QUALE è ... allora devi usare un vettore di flag ;)

Guglielmo

...e questo mi andrebbe bene, ma se la ultima FOR, la quinta, risultasse 0 ?

Diciamo che se faccio

if term(0) == ON and RES (0) == OFF OR term(1) == ON and RES (1) == OFF OR term(2) == ON and RES (2) == OFF OR term(3) == ON and RES (3) == OFF OR term(4) == ON and RES (4) == OFF flag = 1

è quello che voglio.

Ma lo volevo fare, se possibile, con FOR

Tu cosa vuoi sapere? Vuoi sapere SE, QUALI o QUANTI terkostati sono on con resistenza off? Caso 1: Flag che comincia da 0, For controlli { If controllo { Flag a 1 }} Fuori for sai se ne hai trovati

Caso 3: Byte che comincia da 0 For { If { Byte++ }} Sai quanti sono

E non mi son dimenticato il caso 2: Array di flag tutte false For { if { La for esima flag diventa vera }} Ecco quali

Ok, é il caso 1

steve-cr:
Diciamo che se faccio

if term(0) == ON and RES (0) == OFF OR
term(1) == ON and RES (1) == OFF OR
term(2) == ON and RES (2) == OFF OR
term(3) == ON and RES (3) == OFF OR
term(4) == ON and RES (4) == OFF
flag = 1

è quello che voglio.

Ma lo volevo fare, se possibile, con FOR

Flag potrebbe essere booleano, tanto non cambia nulla se 1 = true quindi puoi fare

flag = false;
for(byte idx=0;idx<5;idx++)
{
  flag = flag || (term(idx) == ON and RES (idx) == OFF);
}

steve-cr: ...e questo mi andrebbe bene, ma se la ultima FOR, la quinta, risultasse 0 ?

Non l'ho capita ... a te basta che UNO dei termostati sia ON e la relativa uscita sia OFF per attivare la flag, quindi, una volta che è attiva, che sia stato il primo o l'ultimo non cambia nulla :)

Ripeto però la domanda, a te SERVE sapere QUALE coppia/termostato viola la condizione o ti basta apere che UNA qualsiasi viola la tua condizione ?

Guglielmo

Silente: Tu cosa vuoi sapere? Vuoi sapere SE, QUALI o QUANTI terkostati sono on con resistenza off? Caso 1: Flag che comincia da 0, For controlli { If controllo { Flag a 1 }} Fuori for sai se ne hai trovati

Caso 3: Byte che comincia da 0 For { If { Byte++ }} Sai quanti sono

E non mi son dimenticato il caso 2: Array di flag tutte false For { if { La for esima flag diventa vera }} Ecco quali

Ok, é il caso 1

  • se anche una sola uscita è OFF pur avendo il termostato ON voglio accendere un flag

Più chiaro di così !!!!

gpb01: Non l'ho capita ... a te basta che UNO dei termostati sia ON e la relativa uscita sia OFF per attivare la flag, quindi, una volta che è attiva, che sia stato il primo o l'ultimo non cambia nulla :)

Ripeto però la domanda, a te SERVE sapere QUALE coppia/termostato viola la condizione o ti basta apere che UNA qualsiasi viola la tua condizione ?

Guglielmo

Il mio dubbio era se il flag viene aggiornato ad ogni incremento del ciclo FOR

Quindi ecco perché ti ho chiesto "se la ultima condizione (term(4) con RES(4)) è ZERO, mi annulla magari la condizione precedente che è UNO ?"

Ok. Quindi, come dissi, é il caso numero 1: Una flag che comuncia da zero "non ho stato richiesto" Una for, che cicla le volte che ti serve { Una if che fa il singolo controllo { Se il controllo passa "ho lo stato richiesto" rendo 1 la flag }} Uso la flag Fine

Non te lo annulla in for perché in for non setti mai la flag a 0, e essa é "più grande" della for (dichiarata prima e quindi sopravvive dopo)

Ancora più ottimizzato (di dice anche quel’è il primo che ti ha attivato il flag ma non se vi è più di uno che attiverebbe il flag)

flag = false;
byte idx=0;
while(!flag && idx<5)
{
  flag = flag || (term(idx) == ON and RES (idx) == OFF);
  idx++;
}
if(flag)
{
  idx-1 ti dice quale ha attivato il flag per primo
}

Copiando da fabpolli:
Ancora più ottimizzato (reagisce anche al caso inverso, termo no ma uscita alta)

flag = false;
byte idx=0;
while(!flag && idx<5)
{
  flag =  (term(idx) != RES (idx++));
}
if(flag)
{
  idx-1 ti dice quale ha attivato il flag per primo
}

steve-cr: Il mio dubbio era se il flag viene aggiornato ad ogni incremento del ciclo FOR

... solo SET mai RESET ... è li il trucco ;)

Guglielmo

Standardoil: Copiando da fabpolli ...

Bello ... ottimizzato al massimo :D

Guglielmo

Grazie, da te è un bel complimento...

gpb01: ... solo SET mai RESET ... è li il trucco ;)

Guglielmo

Vedi che c'era un trucco ????

Thanks

quale trucco? io faccio sia set che reset.... di fatto uso un uguale, assegnazione incondizionata

Standardoil:
Copiando da fabpolli:
Ancora più ottimizzato (reagisce anche al caso inverso, termo no ma uscita alta)

flag = false;

byte idx=0;
while(!flag && idx<5)
{
  flag =  (term(idx) != RES (idx++));
}
if(flag)
{
  idx-1 ti dice quale ha attivato il flag per primo
}

Bello, ma NON deve reagire in inverso perché potrei avere il termostato OFF e la RES ancora ON per altri motivi…