Go Down

Topic: Rendere un ciclo infinito (Read 6162 times) previous topic - next topic

MasterArchi


Code: [Select]

byte = dataFromSerial = Serial.read(); // solo arduino, non C/C++



Quindi in arduino le dichiarazioni di cast esplicite si possono effettuare anche con espressioni tipo:
Code: [Select]
Tipo_destinazione = Variabile_sorgente
???


Il codice sorgente può contenere dei commenti e sarebbe il caso di usufruirne, in modo da legare il codice sorgente
e descrizione di ciò che deve o dovrebbe fare in un unico documento.

Provvedo subito ad aggiungere commenti nel codice allegato. Vanno bene?

Maurotec

Ora vado di fretta.

Il cast implicito viene eseguito dal compilatore quando si ritrova a lavorare con due variabili di tipo differente.
Il cast esplicito e qualcosa di simile a questo:
Code: [Select]

void *voidPtr = (void*) &myVar;

Vado di fretta e ho usato i puntatori che non conoscete, l'esplicitazione del cast è (void*).
Si fa cast esplicito quando si suggerisce al compilatore il tipo a cui convertire.

Ciao.

PaoloP



Code: [Select]

byte = dataFromSerial = Serial.read(); // solo arduino, non C/C++



Quindi in arduino le dichiarazioni di cast esplicite si possono effettuare anche con espressioni tipo:
Code: [Select]
Tipo_destinazione = Variabile_sorgente
???


No, li Mauro ha dimenticato un = di troppo.
Il codice corretto è
Code: [Select]

byte dataFromSerial = Serial.read(); // solo arduino, non C/C++


Il cast esplicito lo puoi fare anche così:
Code: [Select]

byte dataFromSerial; // Dichiarazione di variabile di tipo byte
dataFromSerial = (byte) Serial.read(); // Assegnamento alla variabile del risultato della funzione Serial.read, con cast esplicito

MasterArchi


Code: [Select]

void *voidPtr = (void*) &myVar;


I puntatori (siccome sto leggendo una guida C per conto mio) li conosco approssimativamente, quindi da quello che posso dedurre in teoria si potrebbe lavorare con qualsiasi tipo che non provochi un format overflow ritornando direttamente l'indirizzo fisico?


No, li Mauro ha dimenticato un = di troppo.
Il codice corretto è
Code: [Select]

byte dataFromSerial = Serial.read(); // solo arduino, non C/C++


Il cast esplicito lo puoi fare anche così:
Code: [Select]

byte dataFromSerial; // Dichiarazione di variabile di tipo byte
dataFromSerial = (byte) Serial.read(); // Assegnamento alla variabile del risultato della funzione Serial.read, con cast esplicito



Ok grazie Paolo! :)

Maurotec

Si ho sbagliato a scrivere, segui quello che ha detto PaoloP.
Avevo un appuntamento e ho scritto il post in 30 secondi, e la prima cosa che mi è venuta in mente è stato l'esempio con i puntatori, che non è il migliore.

Quote
I puntatori (siccome sto leggendo una guida C per conto mio) li conosco approssimativamente, quindi da quello che posso dedurre in teoria si potrebbe lavorare con qualsiasi tipo che non provochi un format overflow ritornando direttamente l'indirizzo fisico?


Caspita, pensiero furbo. Purtroppo il C/C++ si mette di traverso e non ti permette di manipolare l'informazione puntato se prima non fai un cast ad uno specifico tipo.
Nell'esempio con i puntatori accade questo:
myVar è una variabile dichiarata e inizializzata a tempo di compilazione, il compilatore deve metterla in una locazione di memoria in RAM, quindi esso ne conosce  l'indirizzo di memoria che ricaviamo con l'operatore "&".
L'indirizzo 127 (o altro numero) viene allora salvato nella variabile voidPtr (che anche essa risiede in ram di cui il compilatore conosce l'indirizzo). Se voglio accedere al valore di myVar attraverso il puntatore voidPtr devo esplicitare un cast compatibile, in ogni caso non posso usare *voidPtr = *voidPtr + 5, perché il compilatore non conosce quanto grande è il dato e come codificarlo.

Quindi da voidPtr cast a variabile di tipo compatibile al cast:
Code: [Select]

uint32_t myVarValue = *(uint32_t*)voidPtr;


Si legge da destra verso sinistra: voidPtr castato a puntatore di tipo uint32_t*. Il *(uint.. opera al contrario di &, cioè ricava il dato da un indirizzo di memoria.

Ciao.


Go Up