> Ah, that's interesting. It *definitely* used to use the base type.
A few oddball compilers might do this but every one I've used in 30 years
has packed the bits (at least those that would fit into a byte).
Ardunio = AVR ATMega
They use the Gcc AVR compiler in the development system.
struct received_data {
unsigned int start:1;
unsigned int address:4;
unsigned int command:5;
unsigned int flags:4;
unsigned int padding:1;
unsigned int parity:1;
} __attribute__((packed));
unsigned int
x( char *in )
{
struct received_data *r;
r = (struct received_data *)in;
return r->command;
}
Compiled with no errors with my avr-gcc (4.3.2) and the assembler looks right
(I've no access to hardware at present).
The structure is 2 bytes long, probably because I included the
__attribute__((packed)) hint for Gcc.
However I wouldn't recommened this sort of programming for reassembling data
from multiple bytes, it's highly non-portable. Bit and shift is better.
First though I'd go and shoot the hardware engineer, who splits a bitfield
across adjacent bytes ?
Since this structure contains bit's labled start and parity are you reassembing
data from some hokey koky 15 bit UART or something ? Perhaps you should
treat the raw datastrea as a series of uint16_t rather than chars ?
ATMega is little-endian BTW.
--
Bob Dunlop