Go Down

Topic: Come funziona FOR con IF (Read 979 times) previous topic - next topic

steve-cr

Oct 23, 2018, 02:57 pm Last Edit: Oct 23, 2018, 02:57 pm by steve-cr
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..."
Samantha Cristoforetti: "Mi fai fare un giro sul tuo ultraleggero?". "Certamente, però piloto io !"

gpb01

#1
Oct 23, 2018, 03:07 pm Last Edit: Oct 23, 2018, 03:08 pm by 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
Search is Your friend ... or I am Your enemy !

Triko93

#2
Oct 23, 2018, 03:37 pm Last Edit: Oct 23, 2018, 03:39 pm by Triko93
...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

Code: [Select]

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
If you find my replies useful please give me a +karma.
Stay Hungry, Stay Foolish

steve-cr

Se ho capito bene vuoi fare una cosa simile

Code: [Select]

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?
Samantha Cristoforetti: "Mi fai fare un giro sul tuo ultraleggero?". "Certamente, però piloto io !"

steve-cr

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 ?
Samantha Cristoforetti: "Mi fai fare un giro sul tuo ultraleggero?". "Certamente, però piloto io !"

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
Samantha Cristoforetti: "Mi fai fare un giro sul tuo ultraleggero?". "Certamente, però piloto io !"

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
Dove va un numero va una variabile, una funzione e/o  un test.
Per ottenere devi spiegare

Strumenti/Formattazione automatica fino alla morte!
Cristianesimo:bibbia='C':K&R

fabpolli

#7
Oct 23, 2018, 04:16 pm Last Edit: Oct 23, 2018, 04:17 pm by fabpolli
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
Code: [Select]

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

gpb01

...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
Search is Your friend ... or I am Your enemy !

steve-cr

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ì !!!!
Samantha Cristoforetti: "Mi fai fare un giro sul tuo ultraleggero?". "Certamente, però piloto io !"

steve-cr

#10
Oct 23, 2018, 04:21 pm Last Edit: Oct 23, 2018, 04:21 pm by steve-cr
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 ?"
Samantha Cristoforetti: "Mi fai fare un giro sul tuo ultraleggero?". "Certamente, però piloto io !"

Silente

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)
Dove va un numero va una variabile, una funzione e/o  un test.
Per ottenere devi spiegare

Strumenti/Formattazione automatica fino alla morte!
Cristianesimo:bibbia='C':K&R

fabpolli

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)
Code: [Select]


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
}

Standardoil

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


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
}
Prima legge di Nelson (che sono io): Non scambiare il fine con il mezzo: ricorda "cosa" devi fare, non "come" devi farlo

Non bado a studenti, che copino altrove

Tu hai problema-Io ti domando-Tu non mi rispondi: vuol dire che non ti serve più

gpb01

#14
Oct 23, 2018, 04:50 pm Last Edit: Oct 23, 2018, 04:50 pm by gpb01
Il mio dubbio era se il flag viene aggiornato ad ogni incremento del ciclo FOR
... solo SET mai RESET ... è li il trucco ;)

Guglielmo
Search is Your friend ... or I am Your enemy !

Go Up