Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Casting in C

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[1] Casting in C

Messaggioda Foto Utentelorenrus » 4 ago 2021, 16:18

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
Allegati
10.JPG
Avatar utente
Foto Utentelorenrus
5 2
New entry
New entry
 
Messaggi: 74
Iscritto il: 30 ott 2018, 18:30

1
voti

[2] Re: Casting in C

Messaggioda Foto Utentebanjoman » 4 ago 2021, 16:27

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
Se funziona quasi bene, è tutto sbagliato. A.Savatteri/M.Mazza
Avatar utente
Foto Utentebanjoman
12,2k 5 11 12
G.Master EY
G.Master EY
 
Messaggi: 1623
Iscritto il: 19 set 2013, 19:27

0
voti

[3] Re: Casting in C

Messaggioda Foto Utentelorenrus » 4 ago 2021, 17:15

Ciao e grazie per la risposta.

Il first byte citato sarebbe l'MSB e last byte sarebbe LSB, giusto ?
Avatar utente
Foto Utentelorenrus
5 2
New entry
New entry
 
Messaggi: 74
Iscritto il: 30 ott 2018, 18:30

0
voti

[4] Re: Casting in C

Messaggioda Foto Utentebanjoman » 4 ago 2021, 17:24

: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.
Se funziona quasi bene, è tutto sbagliato. A.Savatteri/M.Mazza
Avatar utente
Foto Utentebanjoman
12,2k 5 11 12
G.Master EY
G.Master EY
 
Messaggi: 1623
Iscritto il: 19 set 2013, 19:27

0
voti

[5] Re: Casting in C

Messaggioda Foto Utentelorenrus » 4 ago 2021, 17:29

Ok chiaro molte grazie
Avatar utente
Foto Utentelorenrus
5 2
New entry
New entry
 
Messaggi: 74
Iscritto il: 30 ott 2018, 18:30

0
voti

[6] Re: Casting in C

Messaggioda Foto UtenteGioArca67 » 4 ago 2021, 18:15

Perché il puntatore è di tipo uint32_t??
Perché il casting a void*?
Avatar utente
Foto UtenteGioArca67
4.570 4 6 9
Master EY
Master EY
 
Messaggi: 4591
Iscritto il: 12 mar 2021, 9:36

0
voti

[7] Re: Casting in C

Messaggioda Foto Utentexyz » 4 ago 2021, 18:25

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.
Avatar utente
Foto Utentexyz
6.864 2 4 6
G.Master EY
G.Master EY
 
Messaggi: 1778
Iscritto il: 5 dic 2009, 18:37
Località: Italy Turin


Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 4 ospiti