PDA

View Full Version : [C]Delucidazioni sul casting


scaram
01-07-2008, 09:44
Salve a tutti,

vorrei che qualcuno mi interpretasse questa riga perche' io proprio non ci sono riuscito nonostante le ricerche piu' svariate...

CODICE:
*(volatile unsigned short *)&(((volatile unsigned char *)&(IMMV->out_proc))[30]) = SWAPWORD(DacMax+DACAdj1);


L'unica cosa che so e' che la funzione SWAPWORD scambia tra loro la parte alta e quella bassa della Word passata come argomento. Il resto, ovvero quello strano casting iniziale e quella specie di assegnazione " -> " , non riesco ad inquadrarne bene il senso.

Se qualcuno mi puo' aiutare, magari e' semplicissimo e sono un asino io :P, gli sarei molto grato

CIAO!

banryu79
01-07-2008, 10:59
L'unica cosa che so e' che la funzione SWAPWORD scambia tra loro la parte alta e quella bassa della Word passata come argomento.

Beh, se hai accesso al sorgente naturalmente puoi andare a leggere la dichiarazione della funzione SWAPWORD per controllare che tipo di dato ritorna, così sai cosa restituisce nell'espressione che hai postato (e intanto hai una base su cui partire per capire cosa succede a sinistra :) )


Il resto, ovvero quello strano casting iniziale e quella specie di assegnazione " -> " , non riesco ad inquadrarne bene il senso.

il segno "->" in C è l'operatore di accesso ad un campo di una Struct o di un Union tramite un puntatore a quella Struct/Union :)

Quindi IMMV è un puntatore a una Struct/Union e con "->" si vuole dereferenziarlo (indirizzo base dove è stata allocata la particolare istanza della Struct puntata + offset del campo desisderato) per accedere al campo "out_proc".

Questo è il massimo dell'aiuto che posso offrirti, per quello che ricordo del C ::):

scaram
01-07-2008, 11:17
Grazie tante, sei stato molto chiaro... ;)

SWAPWORD per la cronaca e' definita cosi':

#define SWAPWORD(w) (HIBYTE((w)) | (LOBYTE((w)) << 8)

dove

#define LOBYTE(w) ((unsigned char)((unsigned long)(w) & 0xff))
#define HIBYTE(w) ((unsigned char)((unsigned long)(w) >> 8))

Da quel che si capisce la funzione prende la parte alta e quella bassa della word e le scambia una con l'altra, no? :)