Go Down

Topic: Ram+Seriale+Overflow (Read 9449 times) previous topic - next topic

leo72

Però lasciando ScrollTime di tipo signed int continuerai per forza ad avere problemi. Se ScrollTime è negativo, quando lo converti a unsigned long, hai tutti i bit "rovesciati" per via del complemento a 2.

Testato


per distrazione ti ho scritto di fare il cast ad "unsigned long" invece devi farlo a "long", oppure dichiara Tempo direttamente come long.

modifica un attimo il mio codice come dici te, e lo posti e lo testo subito, Tempo non lo devi toccare come variabile, e nemmeno Scroll time
il tutto deve essere chiaro e funzionale con Tempo Unsigned long e ScrollTime INT
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

astrobeed

Eccolo, ti ho aggiunto delle print per vedere come varia ScrollTime

Code: [Select]

unsigned long Tempo;
//unsigned int  ScrollTime; // TUTTO OK
int  ScrollTime; // SI BLOCCA

void setup ()
{
pinMode(13, OUTPUT);  
Serial.begin(19200);
}

void loop ()
{

Tempo=millis();

if ((long) Tempo > (ScrollTime + 300))
   {
    digitalWrite(13, HIGH);  
    delay (300);
    ScrollTime = millis();
    Serial.print(ScrollTime, DEC);
    Serial.print(" ");
    Serial.println(ScrollTime+300, DEC);
   }
else
   digitalWrite(13, LOW);  
}


Testato

questo e' un trucco, prima dichiari tempo unsigned e poi nell'IF la fai diventare Signed.

Questa e' la soluzione ?

Cioe' la risposta finale e': Quando si usa un IF le due variabili in gioco devono essere entrambe Signed o entrambe Unsigned. Non possono essere una Signed ed un'altra Unsigned ?
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

astrobeed


Cioe' la risposta finale e': Quando si usa un IF le due variabili in gioco devono essere entrambe Signed o entrambe Unsigned. Non possono essere una Signed ed un'altra Unsigned.


Vedo che non ci arrivi da solo, prova a dichiarare Tempo come unsigned int, vedrai che tutto funziona come si deve, vediamo se dopo questa "imbeccata" ci arrivi da solo.
Indizio 2, prova pure ad eseguire queste poche righe di codice nella setup e valuta bene il risultato che ottieni, poi fai 1+1 = 10 e hai la soluzione  :)

Code: [Select]

int a = -32700;
unsigned long b;
b = a;
Serial.println(b, DEC);


Testato

dopo pranzo, dopo un sonnellino, ci lavoro

grazie per avermi seguito in queste mie elugubrazioni mentali  :)
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

astrobeed


dopo pranzo, dopo un sonnellino, ci lavoro


Mi sa tanto che adesso andiamo tutti a pranzo, io sto per sfornare una lasagna che non vedo l'ora di addentare  :smiley-mr-green:

Testato

4294934596
questo e' definitivamente chiarificatore  :)

grazie ancora a te, leo e lesto  :)

- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

Testato

#113
Apr 30, 2012, 11:10 am Last Edit: Apr 30, 2012, 11:14 am by Testato Reason: 1
scusate se continuo a testare, mi manca un ultimo elemento, vediamo se ho capito
nel mio esempio
Code: [Select]
Tempo=millis();

if (Tempo > ScrollTime + 300)  
   {
    digitalWrite(13, HIGH);  
    ScrollTime = millis();
   }
else
   digitalWrite(13, LOW);  


Quando SrollTime, che e' INT, va in overflow diventa -32768, pero' l'operazione da fare nell'if automaticamente costringe a promuovere la Int ad Unsigned Long, per poi fare l'operazione ?
Quindi oni volta che si fa un'operazione le variabili in gioco vengono prima "Castate" ad un unico tipo ?

Se e' cosi', perche' non posso vederlo con gli occhi questa cosa, intendo se faccio il print di ScrollTime, perche' mi stampa -32768, invece di 4Giga ?

questo e' un esempio di stampa, da quale uno poi non capisce che succede
Quote
T=33004  ST+=-32571  ST=32665
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

Go Up