Go Down

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

gpb01

#15
Oct 23, 2018, 04:51 pm Last Edit: Oct 23, 2018, 04:51 pm by gpb01
Copiando da fabpolli ...
Bello ... ottimizzato al massimo :D

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

Standardoil

Grazie, da te è un bel complimento...
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ù

steve-cr

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

Guglielmo
Vedi che c'era un trucco ????

Thanks
Samantha Cristoforetti: "Mi fai fare un giro sul tuo ultraleggero?". "Certamente, però piloto io !"

Standardoil

quale trucco?
io faccio sia set che reset.... di fatto uso un uguale, assegnazione incondizionata
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ù

steve-cr

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
}

Bello, ma NON deve reagire in inverso perché potrei avere il termostato OFF e la RES ancora ON per altri motivi...
Samantha Cristoforetti: "Mi fai fare un giro sul tuo ultraleggero?". "Certamente, però piloto io !"

steve-cr

Comunque, rimanendo sul basico (e anche BASIC), se io scrivo questa espressione non fa come dico io:
Code: [Select]
if ((term[0] == HIGH && RES[0] == LOW) || (term[1] == HIGH && RES[1] == LOW) || (term[2] == HIGH && RES[2] == LOW) || (term[3] == HIGH && RES[3] == LOW) || (term[4] == HIGH && RES[4] == LOW)) continua = 0;
    else continua = 1;


mi da sempre 1, anche se la condizione del 4 termostato è HIGH e la RES è LOW
Samantha Cristoforetti: "Mi fai fare un giro sul tuo ultraleggero?". "Certamente, però piloto io !"

steve-cr

... e non vi dico tutti i problemi a trovare l'errore con la variabile chiamata "maintain" al posto di "continua"....
Samantha Cristoforetti: "Mi fai fare un giro sul tuo ultraleggero?". "Certamente, però piloto io !"

Standardoil

semplice anche questo
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ù

steve-cr

semplice anche questo
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
}

Ripeto, term deve essere ON e RES deve essere LOW, il contrario non lo voglio.

Poi comunque non riesco a capire ma non è come intendo, qualcosa sfugge.

Però facendo così:
Code: [Select]
aa = digitalRead(RES[0])+digitalRead(RES[1])+digitalRead(RES[2])+digitalRead(RES[3])+digitalRead(RES[4]);
bb = digitalRead(term[0])+digitalRead(term[1])+digitalRead(term[2])+digitalRead(term[3])+digitalRead(term[4]);
if (bb > aa) flag = 1;
else flag = 0;

diciamo che l'ho fregato
Samantha Cristoforetti: "Mi fai fare un giro sul tuo ultraleggero?". "Certamente, però piloto io !"

Standardoil

Ripeto, term deve essere ON e RES deve essere LOW, il contrario non lo voglio.
All'ora...
questa storia di usare high e low nei test è micidiale, fa dimenticare le basi del 'C'
ancora K&R dicevano che NON serve
un test su "term(idx)" è (indicativo presente del verbo essere) sinonimo di "term(idx)==HIGH"
questa cosa deve esssere chiara, altrimenti non si sta parlando di programmazione in 'C'
analogamente !RES(idx++) è sinonimo di RES(idx++) ==LOW
quindi la tua condizione è soddisfatta
per quanto riguarda il tuo ultimo farammento di codice, diciamo che hai preso un abbaglio
visto che potrebbe anche accadere che il NUMERO degli ingrssi alti sia uguale al numero delle uscite alte, MA non siano ugluali i SINGOLI ingressi
Se non ti va nemmeno la forma estesa tutta fatta di IF e operatori booleani, hai qualche problema differente, adesso non saprei, ma se non ti va nemmeno la forma estesa allora la condizione che cerchi NON si verifica
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ù

Triko93

#25
Oct 23, 2018, 08:16 pm Last Edit: Oct 23, 2018, 08:16 pm by Triko93
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
- se anche una sola uscita è OFF pur avendo il termostato ON voglio accendere un flag

Più chiaro di così !!!!

@steve-cr
Questo lo fa esattamente il codice che ti ho inviato.
Chiedo anche agli altri, cos'ha di sbagliato il mio cicletto?
If you find my replies useful please give me a +karma.
Stay Hungry, Stay Foolish

Triko93

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
}

Ti dispiace spiegarmi cosa fa la 1 riga del while??? Mi son perso da quanto hai stretto.
Immagino l'ultima riga sia idx-1 //Commento
If you find my replies useful please give me a +karma.
Stay Hungry, Stay Foolish

gpb01

#27
Oct 23, 2018, 08:29 pm Last Edit: Oct 23, 2018, 08:35 pm by gpb01
Ti dispiace spiegarmi cosa fa la 1 riga del while???
... basta leggerla ... fino a quando (while) !flag (NOT flag ovvero se flag è vero diventa falso e viceversa) e (&&) idx < 5 ripeti quello che è tra { ... }

Nelle parentesi verifica che term(idx) sia != (diverso) da RES(idx), assegna il risultato logico a flag e DOPO automaticamente incremeta idx (idx++ è un post-incremento).

Studiare gli operatori booleani  i pre-incrementi/decrementi ed i post incrementi/decrementi!!!

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

Triko93

... basta leggerla...
Nelle parentesi verifica che term(idx) sia !=[/b
Studiare gli operatori booleani  i pre-incrementi/decrementi ed i post incrementi/decrementi!!!

Guglielmo
La condizione del while è chiara ed anche il resto era appunto quell incremento che c era nel l'assegnazione della variabile flag che non pensavo si potesse fare perché non L ho mai visto.

Pre incremento e post studiati a suo tempo ma mai applicati così! Non capisco perché la scuola non spiega certe cose ad un indirizzo informatico, ma alla fine sta a noi poi esplorare!!!
If you find my replies useful please give me a +karma.
Stay Hungry, Stay Foolish

docdoc

Studiare gli operatori booleani
Esattamente. Ma aggiungo anche che quando ci sono problemi di LOGICA di questo tipo, è utile farsi una "tabella della verità" di ciò che si vuole ottenere, e da lì iniziare a ragionare, magari già ad occhio si notano criteri utili.

Altrimenti facciamo 34 pagine di thread con millemila discorsi su if, condizioni, for, while, e famiglia varia.
Alex "docdoc" - ** se ti sono stato d'aiuto, un punto karma sarà gradito, clicca su "add" qui a sinistra, vicino al mio nome ;) **

Go Up