perche questa "riga" da problemi?

if (negativo == true && calibro > 999 && calibro < 10000) lc.setChar(0,4,’-’,false);
else lc.setChar(0,4,’ ',false);

questa riga non fa il suo dovere e non mi e chiaro il motivo :frowning:

Che vuol dire che non fa il suo dovere?

if viene eseguito lo stesso anche se le condizioni non sono state raggiunte :~

Perché, probabilmente, analizzando da sinistra verso destra, gli operatori che incontra sono tutti logici e quindi, magari li considera a pari priorità (anche se, io ricordavo che > e < dovrebbero venir valutati PRIMA del &&), quindi … negativo == true poi il true o false che ne ricava viene messo in AND con calibro quindi il risultato … ecc. ecc.

Metti le parentesi per definire le varie cose …

if ( (negativo == true) && (calibro > 999) && (calibro < 10000) )

… che rendono chiaro anche al compilatore cosa diavolo tu vuoi :wink:

Guglielmo

Edit : ho corretto l’ordine di esame … gli statement vengono normalmente analizzati da destra a sinistra, ma le condizioni nell’IF normalmente da sinistra a destra … anche per questioni di velocità nel calcolare il risultato del IF (“short-circuit” evaluation) …

proverò a fare ancora un tentativo con le parentesi

Sì, analizza da SX a DX. Se il primo test fallisce, gli altri non li guarda neanche. Quindi se il tuo intento è quello di fare qualcosa quando negativo è vero E CONTEMPORANEAMENTE calibro è compreso fra 1000 e 9999, ti consiglio di scrivere così:

if ((negativo == true) &&((calibro > 999) && (calibro < 10000))) {

Oppure un doppio IF

if (negativo == true)
{
  if (calibro > 999 && calibro < 10000) lc.setChar(0, 4, '-', false);
}
else
  lc.setChar(0, 4, ' ', false);

a meno che tu non volessi fare una cosa così:

if (negativo == true)
{
  if (calibro > 999 && calibro < 10000)
    lc.setChar(0, 4, '-', false);
  else
    lc.setChar(0, 4, ' ', false);
}

In questo caso se negativo è falso non esegue nessuno dei due casi.

PaoloP: Oppure un doppio IF .... ....

Quale è lo scopo ?

Qualunque compilatore, degno di tale nome, in questi casi effettua la "short-circuit evaluation" e quindi, comunque, alla prima condizione falsa, NON valuterà più le altre condizioni e salterà direttamente agli statements per il false !

Guglielmo

Non è per il compilatore, è per l'umano che legge il codice. :sweat_smile: Forse voleva fare come nel secondo caso invece il compilatore interpreta come nel primo. :grin:

PaoloP: Non è per il compilatore, è per l'umano che legge il codice. :sweat_smile: Forse voleva fare come nel secondo caso invece il compilatore interpreta come nel primo. :grin:

:grin: :grin: :grin: :grin: :grin: :grin: :grin:

Guglielmo

il problema “pare” che sia —negativo---- :astonished:
non riesco a vedere (col serial monitor ) che valore assume negativo :~

se metto serialPrint (negativo) visualizza numeri senza senso invece di zero uno o false true

all’inizio del codice e boolean negative;

metto qui un codice simile preso dal playground http://playground.arduino.cc/Main/LedControl

void printNumber(int v) {
    int ones;
    int tens;
    int hundreds;
    boolean negative;	

    if(v < -999 || v > 999) 
       return;
    if(v<0) {
        negative=true;
        v=v*-1;
    }
    ones=v%10;
    v=v/10;
    tens=v%10;
    v=v/10;
    hundreds=v;			
    if(negative) {
       //print character '-' in the leftmost column	
       lc.setChar(0,3,'-',false);

    else {
       //print a blank in the sign column
       lc.setChar(0,3,' ',false);    }
    }
    //Now print the number digit by digit
    lc.setDigit(0,2,(byte)hundreds,false);
    lc.setDigit(0,1,(byte)tens,false);
    lc.setDigit(0,0,(byte)ones,false);
}

a parte che cosi com’è non funziona mancherebbero $) i “pinmode” setup #include ecc

non so se è un errore
o molto probabilmente non so come funziona boolean negative;

ad un certo tunto viene scritto

if(negative ) {
//print character ‘-’ in the leftmost column
lc.setChar(0,3,’-’,false);

ma non dovrebbe essere scritto if(negative == true )

No, è la stessa cosa ... pensaci ...

 if(negative  ==   true )

viene valutata l'espressione all'interno delle parentesi che da un risultato true (==) o false (!=), dopo di che l'IF si comporta di conseguenza. Ma, dato che negative è già true o false ... l'IF può valutalo direttamente senza fare un inutile confronto in più ;)

Guglielmo

gpb01: No, è la stessa cosa ... pensaci ...

 if(negative  ==   true )

viene valutata l'espressione all'interno delle parentesi che da un risultato true (==) o false (!=), dopo di che l'IF si comporta di conseguenza. Ma, dato che negative è già true o false ... l'IF può valutalo direttamente senza fare un inutile confronto in più ;)

Guglielmo

più o meno ho capito (forse)

ma mettendo boolean negative; senza nient'altro che valore assume di default negative ?

e come faccio a vedere sul serial monitor se è true o false

Invece di riportare un "codice simile" preso dal playground, riporta il TUO codice, così ci viene più facile aiutarti!

gingardu: ma mettendo boolean negative; senza nient'altro che valore assume di default negative ?

Tutte le variabili partono a zero (se globali) perciò negative=0=falso

paulus1969: Invece di riportare un "codice simile" preso dal playground, riporta il TUO codice, così ci viene più facile aiutarti!

e natale niente "cattiverie" ]:D appena passate le feste e mi viene il coraggio lo posto

nid69ita: Tutte le variabili partono a zero (se globali) perciò negative=0=falso

nid ... su questo NON metterci la mano sul fuoco ... potresti perdercela ! Non hai idea dei compilatori che ho incontrato che se ne fregano altamente di inizializzare loro le variabili. Il loro compito è allocare l'area di memoria ... e, se non ti preoccupi tu di dare un valore iniziale ... quello che c'è dentro ti trovi ;)

E' difatti buona norma, ove occorra, assegnare sempre un valore iniziale ad una variabile ... si evitano sgradite sorprese e ... malfunzionamenti poi difficili da diagnosticare.

Guglielmo

gpb01:

nid69ita: Tutte le variabili partono a zero (se globali) perciò negative=0=falso

nid ... su questo NON metterci la mano sul fuoco ... potresti perdercela ! Non hai idea dei compilatori che ho incontrato che se ne fregano altamente di inizializzare loro le variabili. Il loro compito è allocare l'area di memoria ... e, se non ti preoccupi tu di dare un valore iniziale ... quello che c'è dentro ti trovi ;)

E' difatti buona norma, ove occorra, assegnare sempre un valore iniziale ad una variabile ... si evitano sgradite sorprese e ... malfunzionamenti poi difficili da diagnosticare.

Guglielmo

Ma più che dal compilatore, non dovrebbe dipendere dall'hardware? Cioè dipendere da dove sono allocate le variabili globali e perciò al reset o riavvio dell'HW la zona di memoria "dovrebbe" essere azzerata ?

nid69ita: Ma più che dal compilatore, non dovrebbe dipendere dall'hardware? Cioè dipendere da dove sono allocate le variabili globali e perciò al reset o riavvio dell'HW la zona di memoria "dovrebbe" essere azzerata ?

No, non ci sperare ... :grin: ... la memoria, se non te la inizializzi, te la puoi trovare con valori completamente casuali ...

Guglielmo

Concordo con Guglielmo. Mai fidarsi di avr-gcc. ;) Dai sempre un valore di inizializzazione, tanto non costa nulla.