Frage zu einem bitweise Struct



  • Hallo Ich habe hier ein

    struct mit 16 bit und es braucht 3 byte Speicherplatz warum ?
    Initialisiere ich das gleiche sruct mit 16 Einträgen mit 1 bit ist es richtig mit 2 byte Speicher bei diesem struct nimmt sich src einbit in der nächsten Speicherzelle. Kann mir jemand sagen wo mein Denkfehler liegt ?

    struct frc{
     unsigned  frt:3;
     unsigned  sec:1;
     unsigned  frp:1;
     unsigned  ack:1;
     unsigned  pan:1;
     unsigned  re1:3;
     unsigned  des:2; 
     unsigned  re2:2;
     unsigned  src:2;
    } FRC;
    


  • §9.6.1 schrieb:

    [...] Allocation of bit-fields within a class object is implementation-defined. Alignment of bit-fields is implementation-defined. Bit-fields are packed into some addressable allocation unit. [...]



  • Von oben nach unten in Bytes gepackt, würde 're1' gerade auf einer Grenze liegen, so daß dieses dann wahrscheinlich vom Compiler in ein Byte gepackt wird. Und dasselbe dann auch für 'src'...

    Durch Umsortierung könntest du es auf 2 Byte packen können (wenn die Summe dann immer 8 beträgt).



  • Danke für die Antwort
    Nur Dummerweise
    dachte ich könnte
    http://www.rfwireless-world.com/Tutorials/Zigbee-MAC-layer-frame-format.html
    ein IEEE 15.4 Frame Control Field nachbilden.
    OK mal shen wie ich das mache nochmal Danke 😕



  • Was ist denn bei dir sizeof(unsigned) ?

    Bei einem gcc (win32 Projekt) kommt 4 raus. wenn ich unsigned short nehme, kommt 2 raus, bei char ist es 3.

    Welchen Compiler für welches System nutzt du?



  • Hallo nochmal,

    wenn re1 und re2 sowieso reservierte Felder sind (also bisher unbenutzt), dann nimm doch einfach:

    struct frc
    {
      unsigned  frt:3;
      unsigned  sec:1;
      unsigned  frp:1;
      unsigned  ack:1;
      unsigned  pan:1;
      unsigned  re1_1:1;
      // hier die Bytegrenze
      unsigned  re1_2:2;
      unsigned  des:2;
      unsigned  re2:2;
      unsigned  src:2;
    } FRC;
    

    PS: @DirkB: die Größe von unsigned (in Bytes) sollte doch gar keine Rolle hier bei Bitfeldern spielen 😕
    Du meinst, daß dann der Compiler intern bei "unsigned" ("unsigned int") auch für die Strukturgröße dieses dann benutzt?

    Edit:
    OK, habe ich jetzt mal selber auch bei Ideone überprüft: Code - kriege auch die selben Werte raus: 4, 2 oder 3.

    Also sollte man wohl immer "unsigned char" bei Bitfeldern nutzen. Klappt aber auch nur, solange die Bitanzahl einzelner Felder nicht größer als 7 ist (sonst kommt: "error: exceeds size of type").
    Scheint für mich aber eine Spezialität vom gcc zu sein - habe dies bisher bei anderen Compilern nicht so festgestellt...



  • Th69 schrieb:

    Also sollte man wohl immer "unsigned char" bei Bitfeldern nutzen.

    Nö, man sollte einfach Bitfelder niemals nutzen... 😉



  • Th69 schrieb:

    Also sollte man wohl immer "unsigned char" bei Bitfeldern nutzen.

    Nein. Dann hast du ja das Problem vom TO.

    Bei unsigned short (uint16_t) passt es ja.

    (Da es um Zigbee geht, kann es sich auch um einen Compiler für einen 8-Bit-Mikrocontroller handeln.)



  • Ich meinte "unsigned char", um die Größe generell so klein wie möglich zu halten, denn bei "unsigned short" würde dann ja auch immer mindestens 2 Byte reserviert - auch wenn man nur ein kleines Bitfeld hat:

    struct Test
    {
      unsigned char first:3;
      unsigned char second:1;
    }
    

    Hier will man ja nur 1 Byte (und nicht 2 Byte) für die gesamte Datenstruktur haben: Code (und bei "unsigned short" kommt aber 2 heraus!)


Log in to reply