Quando IF sembra sbagliato...

Scusate ma mi sfugge qualcosa e chi programma tanto e spesso sa cosa intendo: l’errore è così evidente che non lo vedi…

if ((digitalRead(RES[0] == HIGH)) && ((timeBase10 >= tempociclo) || (digitalRead(term[0] == LOW)))) {
      digitalWrite(RES[0], LOW);
}

Io leggo la uscita RES[0] e se la trovo HIGH proseguo nell’IF (altrimenti salto)
se il timeBase10 >= del tempociclo SPENGO
ma anche se leggo che term[0] è LOW SPENGO indipendentemente da tempociclo

Quindi o che tempociclo è esaurito o che l’ingresso term[0] è LOW l’uscita dovrebbe spegnersi…

Il discorso è che tempociclo non è esaurito, l’entrata term è HIGH ma lui si spegne ugualmente…

Scusa, quale sarebbe la domanda?
Perché lo if non ti fa quello che dovrebbe?
E cosa dovrebbe?
A naso hai sbagliato con la doppia parentesi sul primo test, ma senza delucidazioni.....

Standardoil:
A Ma di hai sbagliato con la doppia parentesi sul primo test, ma senza delucidazioni.....

...criptico...

(digitalRead(RES[0] == HIGH))

-->

(digitalRead(RES[0]) == HIGH)

(E idem sul LOW.)

Corretto, maledetto correttore

Maledette parentesi !!!
Come dicevo, l'errore è così grande che non lo vedi ( e nemmeno il compilatore te lo corregge...)

Grazie Sukkopera

steve-cr:
Come dicevo, l'errore è così grande che non lo vedi ( e nemmeno il conpilatore te lo corregge...)

Il compilatore vede solo gli errori di sintassi, mentre quella che hai scritto è un'istruzione C perfettamente valida (solo che fa qualcosa di diverso da quello che volevi fare).

quindi viene fatto l'AND con l'if? l'if che valore assume?
avrei detto che è un errore cercare di fare quest'operazione in quanto l'if si aspetta un istruzione
da eseguire o non eseguire, ma trova un AND senza uno dei due elementi. Sono perplesso.

L'if si aspetta una condizione che può essere solo vera o falsa ovvero un valore booleano. Ciò che non è booleano viene ricondotto a tale tramite varie regole di conversione.

Nella fattispecie, con le parentesi mal posizionate come le avevi messe tu, l'if valuta a il valore di ritorno della digitalRead().

L'argomento della digitalRead() stessa invece sarebbe stato l'output del confronto tra res[0] e HIGH (che vale 1). Se anche res[0] vale 1, il risultato è vero, che in C vale a sua volta 1. Altrimenti è falso e vale 0.

L’ if funziona anche con valori non boleani. Un numero positivo diverso da 0 é vero. Non so cosa fa con -1.

Ciao Uwe

uwefed:
L' if funziona anche con valori non boleani. Un numero positivo diverso da 0 é vero. Non so cosa fa con -1.

Ciao Uwe

Qualunque cosa non booleana viene convertita in booleano secondo le solite regole. Per gli interi, 0 è FALSE, tutto il resto (compreso -1) è TRUE.

EDIT: Avevo tagliato un pezzo della mia risposta che parlava di questo, ora ho precisato meglio.

steve-cr:
Scusate ma mi sfugge qualcosa e chi programma tanto e spesso sa cosa intendo: l'errore è così evidente che non lo vedi...

L'errore è già stato identificato, ma volevo solo aggiungere una considerazione "stilistica"...

Scusa, ma che è 'sto proliferare di parentesi che poi alla fine ti si intrecciano gli occhi (come poi è capitato ora) ? :smiley:
Mica stai programmando in LISP... (chi ha "una certa età" sa di cosa parlo..;)).

Per dire, se hai una condizione tipo "variabile>valore" inutile metterla tra parentesi. E quando hai varie condizioni da "accorpare", io in genere le scrivo su una riga separata, così come la graffa.

La tua if() quindi, invece di una complicata:

if ((digitalRead(RES[0]) == HIGH)) && ((timeBase10 >= tempociclo) || (digitalRead(term[0]) == LOW)))) {
  digitalWrite(RES[0], LOW);
}

diventa una più leggibile:

if ( digitalRead(RES[0]) == HIGH 
      && (timeBase10 >= tempociclo || digitalRead(term[0]) == LOW)  )
{
  digitalWrite(RES[0], LOW);
}

EDIT: corrette le 2 parentesi mancanti (mancavano già nell'originale, io ho pensato solo a quelle "esterne"... :wink:

Mettigli le parentesi giuste però :D.

Si, vero, le parentesi le ho fatte proliferare un po' troppo però grazie all'IDE se mi posiziono su una parentesi chiusa mi evidenzia a quale parentesi aperta si riferisce percui non ci ho fatto troppo caso ma anche io sono uno che preferisce essere conciso e scartare ciò che non serve.
Grazie comunque a tutti, bravi e esauriento come solito!

P.S. non uso LISP... Ne ho già abbastanza di tutti quelli che uso... :astonished:

SukkoPera:
Mettigli le parentesi giuste però :D.

Si, ho tagliato una di troppo (ma l'ho detto che mi si stavano incrociando gli occhi... :wink: )
Corretto.

SukkoPera:
L'if si aspetta una condizione che può essere solo vera o falsa ovvero un valore booleano. Ciò che non è booleano viene ricondotto a tale tramite varie regole di conversione.

Nella fattispecie, con le parentesi mal posizionate come le avevi messe tu, l'if valuta a il valore di ritorno della digitalRead(), che credo sia vero se il pin che le si passa è sensato.

L'argomento della digitalRead() stessa invece sarebbe stato l'output del confronto tra res[0] e HIGH (che vale 1). Se anche res[0] vale 1, il risultato è vero, che in C vale a sua volta 1. Altrimenti è falso e vale 0.

si ma fermo io non contesto l'esecuzione dell'if io ma del && che a sinistra non ha un operando.
per questo chiedevo cosa vale if(...) evidentemente vale qualcosa e può essere usato ma non è che abbia molto senso apparentemente.

Come non ha un operando a sinistra? digitalRead() ha un valore di ritorno, non è mica void!

@docdoc: Rivedi ancora le parentesi, non sono a posto! :smiley:

se rileggi il codice originale che ha messo steve forse capisci cosa sto dicendo.

con le parentesi che ha messo lui l'operazione di AND sembra essere tra

if ((digitalRead(RES[0] == HIGH)) AND ((timeBase10 >= tempociclo) || (digitalRead(term[0] == LOW))))

la parte destra avrà il valore che avrà ma la parte sinistra non è il risultato del digitalRead e neanche il risultato del confronto con l'operatore HIGH. cos'è? Se non segnala errore vuol dire che if(qualunque condizione) è un valore valido per il C. ecco questo mi è nuovo e non lo capisco.
O forse le due parentesi tonde superflue che chiudono alla fine interferiscono con la valutazione.

SukkoPera:
@docdoc: Rivedi ancora le parentesi, non sono a posto! :smiley:

Eh, giusto, sti digitalRead()... :slight_smile:

gianlucaf:
if ((digitalRead(RES[0] == HIGH)) AND ((timeBase10 >= tempociclo) || (digitalRead(term[0] == LOW))))

la parte destra avrà il valore che avrà ma la parte sinistra non è il risultato del digitalRead e neanche il risultato del confronto con l'operatore HIGH.

Il tuo errore è quello in grassetto. La parte sinistra è - eccome! - il risultato della digitalRead(), perché dici di no?
Si può discutere su quale sia poi l'argomento che passi alla digitalRead(), ma questo l'ho già spiegato prima.