Re: ANSI C: accesso ai dati di una union
|
- Subject: Re: ANSI C: accesso ai dati di una union
- From: Francesco Sacchi
- Data: Wed, 02 Jul 2008 09:43:27 +0200
- Newsgroups: it.hobby.elettronica.digitale
Francesco Sacchi wrote:
> Lo so, purtroppo queste pratiche sono diffuse, e si vede tanto codice
> scritto in questo modo perché magari si crede di avere più efficienza ed
> eleganza.
> Però è bene educarsi a *non* usarle e se proprio lo si vuole fare
> (perché si è *strasicuri* che il compilatore che usiamo lo permette)
> bisogna essere consci dei rischi.
Ti propongo un'alternativa per accedere ai singoli bit e ai singoli
byte di un dato:
/* Ritorna lo stato di bit in data */
#define GET_BIT(data, bit) ((data) & (1 << (bit)))
/* Setta il bit in data */
#define SET_BIT(data, bit) ((data) |= (1 << (bit)))
/* Resetta il bit in data */
#define RESET_BIT(data, bit) ((data) &= ~(1 << (bit)))
/* Ritorna il byte indicato, prendendolo da data (byte va da 0 a 3) */
#define GET_BYTE(data, byte) (((data) >> ((byte) * 8)) & 0xff)
/* Setta il byte di data a value */
#define SET_BYTE(data, byte, value) \
do { \
(data) &= ~(0xff << ((byte) * 8)); \
(data) |= ((value) << ((byte) * 8)); \
} while (0)
Le ho scritte al volo e non le ho testate, ma penso che con qualche
aggiustatina dovrebbero funzionare!
--
_|/ Francesco Sacchi - Develer S.r.l., R&D dept.
|\
http://www.develer.com/ -
http://www.bertos.org