Pagina 1 di 1

Casting in C

MessaggioInviato: 4 ago 2021, 16:18
da lorenrus
Ciao

sono qui a chiedervi una cosa, ho letto la seguente porzione di codice:

Codice: Seleziona tutto

uint8_t rx_buff[DIM];

uint16_t numReceivedByte = read(openAmpFd, (void*)rxBuff, MSG_HEADER_BYTELEN);

uint32_t* p = (uint32_t*) rx_buff;



Con l'ultima assegnazione in pratica voglio creare un alias di rx_buffer, così da poterci accedere utrilizzando il puntatore p.
Quello che non mi è chiaro, avendoci messo un cast che lo trasforma in puntatore di dimensione unit32_t da uint8_t, vuol dire che se io richiamassi p[0] in realtà è come se stessi accedendo alle prima 4 locazioni dell'originario rx_buffer ?

Quindi avrei quello in allegato ? Anche con lo stesso ordine ?


Grazie

Re: Casting in C

MessaggioInviato: 4 ago 2021, 16:27
da banjoman
Utilizzando il puntatore p accedi effettivamente a 4 byte alla volta.
Pero' devi considerare se la CPU su cui viene eseguito il codice e' Big Endian o Little Endian.

Questo articoletto spiega la differenza con piccoli esempi di codice concreti, che fa proprio al caso tuo.

O_/
Max

Re: Casting in C

MessaggioInviato: 4 ago 2021, 17:15
da lorenrus
Ciao e grazie per la risposta.

Il first byte citato sarebbe l'MSB e last byte sarebbe LSB, giusto ?

Re: Casting in C

MessaggioInviato: 4 ago 2021, 17:24
da banjoman
:ok:
Effettivamente "first byte" e' un po' fuorviante. Molto piu' corretto parlare di LSB e MSB come dici tu.
Se a me dicono "first byte" di una costante scritta in esadecimale in un codice sorgente, io penso istantaneamente al byte piu' a destra (LSB appunto), mai a quello piu' a sinistra.

Re: Casting in C

MessaggioInviato: 4 ago 2021, 17:29
da lorenrus
Ok chiaro molte grazie

Re: Casting in C

MessaggioInviato: 4 ago 2021, 18:15
da GioArca67
Perché il puntatore è di tipo uint32_t??
Perché il casting a void*?

Re: Casting in C

MessaggioInviato: 4 ago 2021, 18:25
da xyz
lorenrus ha scritto:Con l'ultima assegnazione in pratica voglio creare un alias di rx_buffer, così da poterci accedere utrilizzando il puntatore p.

Non crei un alias ma un variabile nello stack o in memoria dipende dove hai messo quel codice, sarà poi compito del compilatore se riesce a ottimizzare l'uso di quella variabile. Se vuoi un alias si usa il preprocessore con un define.