Forum Moderator
Italy
Offline
Brattain Member
Karma: 219
Posts: 16462
Don't know what I do
|
 |
« Reply #45 on: April 27, 2012, 11:15:32 am » |
Sarebbero da disassemblare i 2 firmware creati ma mi pare una cosa un po' pacco per un problema così banale, si mette unsigned long e siamo tutti felici 
|
|
|
|
|
Logged
|
|
|
|
|
Rome (Italy)
Offline
Tesla Member
Karma: 74
Posts: 7358
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
|
 |
« Reply #46 on: April 27, 2012, 11:19:17 am » |
leo ha testato questo con successo, quindi il casting avviene, bisognerebbe capire se esistono casi particolari
Non è vero che funziona, o meglio ti funziona su Arduino che non ti fa vedere le warning, se provi a compilare una cosa simile con AvrStudio ottieni subito una bella warning sul cast e una sulla if stessa, viene compilato lo stesso, ma è una forzatura e lo fai a tuo rischio e pericolo, ovvero poi non lamentarti se il programma fa cose strane 
|
|
|
|
|
Logged
|
|
|
|
|
Offline
God Member
Karma: 4
Posts: 873
|
 |
« Reply #47 on: April 27, 2012, 11:21:23 am » |
siete tutti bocciati per il semplice fatto che nell'embedded i cast NON si devono MAI fare!
|
|
|
|
|
Logged
|
|
|
|
|
Rome (Italy)
Offline
Tesla Member
Karma: 74
Posts: 7358
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
|
 |
« Reply #48 on: April 27, 2012, 11:26:23 am » |
siete tutti bocciati per il semplice fatto che nell'embedded i cast NON si devono MAI fare!
In embedded il cast si usa eccome, anzi è uno degli strumenti messi a disposizione dal C e non c'è alcun motivo per non usarlo. Ovviamente tocca ricordarsi di accendere il cervello quando si utilizza il cast perché è facile creare casini immensi se usato male, ma la stessa cosa si applica a maggior ragione ai puntatori, alle strutture/unioni etc.
|
|
|
|
|
Logged
|
|
|
|
|
Rome (Italy)
Offline
Tesla Member
Karma: 74
Posts: 7358
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
|
 |
« Reply #49 on: April 27, 2012, 12:12:02 pm » |
mega rofl, adesso il Misra e' inutile perche' lo dice astro.
Dove direbbero le regole del MISRA C che non si deve usare il casting ? A me risulta che dicono come e quando deve essere impiegato il cast e quando non deve essere impiegato e che deve essere sempre esplicito, ovvero non usare mai il cast implicito dei compilatori che è una cosa ben diversa dal non usarlo in assoluto.
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Faraday Member
Karma: 17
Posts: 3918
Arduino rocks
|
 |
« Reply #50 on: April 27, 2012, 01:33:49 pm » |
ci mancava il troll di turno, ma questo e' sempre il solito ? devo segnalarlo ai moderatori  tornando alla questione mi fa piacere che con un mio semplice esempio abbia montato tutta sta storia, quindi una domanda secca - visto che non e' che vi seguo molto, nel senso che l'argomento e' per me difficile, usare nel mio esempio due unsigned long, sia per Time che per ScrollTime, evita problemi ? nel senso che l'overflow che comunque avverra' piu' in la nel tempo, non mi blocchera' lo scroll del display ? il mio dubbio deriva da questo, cosi' come la INT diventa magicamente negativa e poi il cast fa casino, perche' non dovrebbe avvenire anche quando la unsigned long diventa negativa, il cast la inverte ecc ecc ? non e' che si sposta solo il problema piu' avanti ?
|
|
|
|
« Last Edit: April 27, 2012, 01:41:17 pm by Testato »
|
Logged
|
|
|
|
|
Offline
God Member
Karma: 4
Posts: 873
|
 |
« Reply #51 on: April 27, 2012, 01:54:38 pm » |
ci mancava il troll di turno, ma questo e' sempre il solito ? devo segnalarlo ai moderatori  ho segnalato il tuo intervento molesto ed offensivo, oltre al fatto che e' detto a sproposito perche' ci sono tutta una serie di ragioni che non cito dietro all'intervento di prima, pero' tu mi hai confermato che ho fatto bene a cancellarlo segno che ho valutato per me non interessante ulteriori discussioni.
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Faraday Member
Karma: 17
Posts: 3918
Arduino rocks
|
 |
« Reply #52 on: April 27, 2012, 02:00:04 pm » |
ci mancava il troll di turno, ma questo e' sempre il solito ? devo segnalarlo ai moderatori  ho segnalato il tuo intervento molesto ed offensivo, oltre al fatto che e' detto a sproposito perche' ci sono tutta una serie di ragioni che non cito dietro all'intervento di prima, pero' tu mi hai confermato che ho fatto bene a cancellarlo segno che ho valutato per me non interessante ulteriori discussioni. quote cautelativo:)
|
|
|
|
|
Logged
|
|
|
|
|
0
Online
Tesla Member
Karma: 82
Posts: 8221
:(){:|:&};:
|
 |
« Reply #53 on: April 27, 2012, 02:01:26 pm » |
il mio dubbio deriva da questo, cosi' come la INT diventa magicamente negativa e poi il cast fa casino, perche' non dovrebbe avvenire anche quando la unsigned long diventa negativa, il cast la inverte ecc ecc ?
non e' che si sposta solo il problema piu' avanti ?
"unsigned" vuol dire proprio SENZA segno, come può diventare negativa?!
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Faraday Member
Karma: 17
Posts: 3918
Arduino rocks
|
 |
« Reply #54 on: April 27, 2012, 02:07:40 pm » |
il dubbio mi viene perche' leo dice: Usando l'unsigned int con il codice di Testato va in blocco dopo un po'
quindi credo sia lecito chiedersi chi mi tutela con unsigned long ? infatti ho provato anche io, ed entrambi si bloccano, con INT si blocca dopo una 30ina di secondi, e con UNSIGNED INT dopo 1 minuto. se con unsigned long non si blocca vuol dire che c'e' un bug solo su int ed unsigned int ?
|
|
|
|
« Last Edit: April 27, 2012, 02:14:14 pm by Testato »
|
Logged
|
|
|
|
|
BZ (I)
Offline
Brattain Member
Karma: 162
Posts: 15712
+39 349 2158303
|
 |
« Reply #55 on: April 27, 2012, 03:19:23 pm » |
... Usando l'unsigned int con il codice di Testato va in blocco dopo un po' ...
Questo effetto é logico perché un Unsigned int ha la possibilitá di memorizzare un numero positivo quasi 2 volte piú grande di un int. (16 bit contro 15 bit). Ciai Uwe
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 219
Posts: 16462
Don't know what I do
|
 |
« Reply #56 on: April 27, 2012, 03:52:06 pm » |
... Usando l'unsigned int con il codice di Testato va in blocco dopo un po' ...
Questo effetto é logico perché un Unsigned int ha la possibilitá di memorizzare un numero positivo quasi 2 volte piú grande di un int. (16 bit contro 15 bit). Ciai Uwe Appunto.
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Faraday Member
Karma: 17
Posts: 3918
Arduino rocks
|
 |
« Reply #57 on: April 27, 2012, 04:42:30 pm » |
appunto, ma non e' questo il punto  mi sembra che lesto dica che gli Unsigned, non avendo segno, dovrebbero regolarmente andare in overflow, e ripartire da zero, cosa che io mi aspettavo, invece non lo fa. si incarta sia con int che con unsigned int, perche' con unsigned long non si blocca ? Sia unsigned int che unsigned long vanno in overflow, se si comportano allo stesso modo dovrebbero : - O funzionare entrambi, semplicemente andado in overflow in momenti diversi e ripartendo da zero - Oppure bloccarsi entrambi nel momento dell'overflow, che capitera' in momenti diversi l'attuale situazione invece e' che Unsigned Int blocca il codice all'overfow, Unsigned Long non lo blocca mai, nemmeno dopo l'overflow
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 219
Posts: 16462
Don't know what I do
|
 |
« Reply #58 on: April 27, 2012, 05:01:11 pm » |
appunto, ma non e' questo il punto  mi sembra che lesto dica che gli Unsigned, non avendo segno, dovrebbero regolarmente andare in overflow, e ripartire da zero, cosa che io mi aspettavo, invece non lo fa. si incarta sia con int che con unsigned int, perche' con unsigned long non si blocca ? Sia unsigned int che unsigned long vanno in overflow, se si comportano allo stesso modo dovrebbero : - O funzionare entrambi, semplicemente andado in overflow in momenti diversi e ripartendo da zero - Oppure bloccarsi entrambi nel momento dell'overflow, che capitera' in momenti diversi l'attuale situazione invece e' che Unsigned Int blocca il codice all'overfow, Unsigned Long non lo blocca mai, nemmeno dopo l'overflow E' il casting. Avevo ragione io. Ed anche lesto aveva visto bene con la storia del complemento a 2. Ho usato questo codice: unsigned long Tempo; int ScrollTime; const byte LED=13; boolean stato=true; unsigned long secondi;
void setup () { delay(2000); pinMode(LED, OUTPUT); digitalWrite(LED, stato); Serial.begin(19200); Serial.println("Partito"); secondi=seconds(); }
void loop () { Tempo=millis();
if (secondi!=seconds()) { secondi=seconds(); Serial.println(ScrollTime + 300, DEC); } if (Tempo > ScrollTime + 300) { stato ^= true; digitalWrite(LED, stato); ScrollTime = millis(); } } (usa la funzione seconds() che ho presentato alcuni giorni fa). Dopo una trentina di secondi sul terminale compare SEMPRE il valore -32527. Usando questo codice, con unsigned int ScrollTime si ha un risultato inatteso. unsigned long Tempo; unsigned int ScrollTime; const byte LED=13; boolean stato=true; unsigned long secondi;
void setup () { delay(2000); pinMode(LED, OUTPUT); digitalWrite(LED, stato); Serial.begin(19200); Serial.println("Partito"); secondi=seconds(); }
void loop () { Tempo=millis();
if (Tempo > ScrollTime + 300) { Serial.println(ScrollTime, DEC); stato ^= true; digitalWrite(LED, stato); ScrollTime = millis(); } } Dopo circa 60 secondi, durante i quali la stampa è cadenzata a circa 0,3s di intervallo, il codice arriva a passare 65535 (il max valore di un unsigned int) e sul terminale l'Arduino comincia a stampare TUTTI i valori di ScrollTime. In pratica entra infinite volte nel ciclo, dando l'apparenza di essere bloccato (perché il Led è acceso fisso) ma in realtà ne cambia lo stato talmente in fretta che l'occhio umano non riesce a distinguere il passaggio.
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Faraday Member
Karma: 17
Posts: 3918
Arduino rocks
|
 |
« Reply #59 on: April 27, 2012, 05:25:39 pm » |
Confermo i due test, invece del led ho usato lo scroll di un display, con int si blocca e con unsigned int lo scroll parte a razzo ed il display e' illeggibile.
Non ho capito ancora se questi comportamenti sono normali, e perché con unsigned long non capita.
3 variabili, 3 comportamenti diversi in zona overflow
|
|
|
|
|
Logged
|
|
|
|
|
|