IF non funziona

Guardate queste linee:

if (ve<3) {
Serial.print(ve);
if  (ve=300)  lcd.clear();
Serial.println(ve);
delay(1000);
lcd.setCursor(7, 0); // Imposta il cursore alla riga (da 0 a 19) e colonna (da 0 a 3)
lcd.print("MENU'");
lcd.setCursor(1, 1);
lcd.print("Tempo alba");
lcd.setCursor(1, 2);
int("Tempo giorno");
lcd.setCursor(1, 3);
lcd.print("Tempo tramonto");
lcd.setCursor(0,ve);
lcd.write(byte(0)); // Stampa la freccia
}

ve è una variabile che mi indica in quale colonna del LCD a 4 righe devo stampare una freccia quando premo i pulsanti su e giù. All'inizio ve =1, infatti sul monitor viene stampato 1. Ma al secondo serial.print che si trova dopo l'IF (ve=300), viene stampato 300. Se al posto di 300 metto 25, print mi stampa 25, è come se arduino non facesse un IF ma un'assegnazione. Sto impazzendo per questa cosa. Infatti se tolgo l'IF e metto solo il clear, la variabile ve fa quello che deve fare. Dove sbaglio?

:warning:
Ti segnalo che, nella sezione in lingua Inglese, si può scrivere SOLO in Inglese ... quindi, per favore, la prossima volta presta più attenzione in quale sezione metti i tuoi post; questa volta esso è stato spostato, da un moderatore della sezione di lingua Inglese, nella sezione di lingua Italiana ... la prossima volta potrebbe venire direttamente eliminato. Grazie.

A quanto detto da UKHeliBob aggiungo ...
... cortesemente, come prima cosa, leggi attentamente il REGOLAMENTO della sezione Italiana del forum, (prestando sempre molta attenzione al punto 15), dopo di che, come da suddetto regolamento, fai la tua presentazione NELL'APPOSITA DISCUSSIONE spiegando bene quali esperienze hai in elettronica e programmazione, affinché noi possiamo conoscere la tua esperienza ed esprimerci con termini adeguati

Grazie,

Guglielmo

Ho cliccato sul link di presentazione ma non ho capito come inserire la mia presentazione.

Esattamente come rispondi a questa discussione, rispondi in quella ... come hanno fatto tutti :slight_smile:

Guglielmo

In effetti esegue una assegnazione e ve assume il valore 300, poiché il valore 300 è diverso da zero la condizione è vera ed esegue il clear del display. Se invece al posto di 300 ci scrivi 0 (zero) non esegue il clear poiché 0 e valutato false.

Ora sai di più sull'operatore assegnamento =, mentre l'operatore eguaglianza == è quello che inserito in una espressione risulta vero se entrambe gli operandi sono uguali.

Per provare:

if (1 == 1) Serial.println("uguale 1");
if (0 == 0) Serial.println("uguale 0");
if (1 == 0) Serial.println("non lo stampa, sono diversi");
// Allora la tua if dovrebbe essere:
if  (ve == 300)  lcd.clear();

Visto che questo errore può accadere perché un tasto rimane nella tastiera senza notarlo, i programmatori saggi invertono gli operandi:

if (300 == ve) lcd.clear();

Che se scritto per errore così:

if (300 = ve) lcd.clear();

Il compilatore termina con errore.

Ciao.

1 Like

Grazie per la precisa descrizione, in effetti sapevo delle varie differenze ma a volte la fretta di cercare l'errore non fa vedere l'errore anche se cosi evidente. Giusto per la cronaca, il compilatore non mi dava errore, infatti il programma veniva eseguito ma in modo sbagliato.

Ovviamente ... per il compilatore NON è un errore ... esegue l'assegnazione ('=') da te indicata e dopo verifica se il risultato è vero (diverso da 0) o falso (uguale a 0) ed agisce di conseguenza.

Guglielmo

1 Like

Questo è problema sentito e diverse soluzioni sono state proposte, una di queste si basa sulle proprietà delle variabili e delle costanti manifeste. Una costante manifesta (cioè 300) è un right value, cioè può stare a destra dell'operatore assegnamento e se sta a sinistra è un errore, perché non è possibile assegnare un valore ad una costante manifesta. Grazie alla evoluzione del linguaggio C++ un tipo di dato utente (una istanza di classe) si può comportare come un right value o left value. Purtroppo non c'è modo non c'è modo di attribuire queste proprietà ai tipi di dato primitivi. Dato che ve = 300 non può essere un errore poiché potrei sfruttarlo a mio vantaggio con if ( ve = 300 - vi ) se vi vale 299 il risultato è 1 quindi vero, oppure false quando vi vale 300, l'unico modo che abbiamo per farci avvisare dal compilatore è quello di invertire gli operandi, ma funziona solo con le costanti. Mentre con le variabili if (ve = vi) non c'è modo di farci avvisare dal compilatore. Grazie alle classi C++ se ve lo fosse potrei attribuirgli la proprietà right value e il compilatore emetterebbe errore dicendomi più o meno: non posso assegnare un valore a ve, esso è un right value. Il metodo più semplice per trasformare una variabile in right value è farla restituire da una funzione.

Ciao.

1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.