This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Struct in union

Hi
I have some problems with struct inside a union
This is my code.

union{
	unsigned char id_byte[2];

	struct {
			unsigned char DLC:4;
			unsigned char RTR:1;
			unsigned int identifier:11;
			}del_element;
}can_descriptor;

when I write an_descriptor.del_element.identifier=0x0A;

nothing comes in id_byte array why?
The values I put in DLC and RTR are placed correct.

If i change the code to
union{
	unsigned char id_byte[2];

	struct {
			unsigned int identifier:11;
			unsigned char DLC:4;
			unsigned char RTR:1;
			}del_element;
}can_descriptor;
And writes 0x0A to identifier:
id_byte[0]=0
id_byte[1]=0x0A

but i shoud be
id_byte[0]=0x80
id_byte[1]=0x01

why?
This program is part of an CAN program for SJA1000, this funktion i made make it easy to write the CAN iddentifiers DLC and RTR bit in the controller.....if it worked.

Best Regrads
Soren

Parents Reply Children
  • "You say that i shoud use mask and shift?
    dose't it give more code?"


    Try re-reading the previous posts!

    Here's a reminder of what's been said so far:

    "many compilers generate poor code for bitfields. It's more portable and often more efficient just to use the & and | operators directly."

    "I don't think there's any reason to believe that bitfields will give you (significantly) better code than shifts and masks and some bitfield implementations are notoriously inefficient - so shifts and masks can actually be better!"

    "[shift & mask] is probably how the compiler actually implements the bitfields!"

    That should answer your question!

    And again, shifts & masks are portable; bitfields are not.