Problem mit struct (Bit Fields)



  • Hallo.

    Erst einmal ein bisschen Quelltext, der für mein Problem relevant ist:

    struct SPackageHeader {
    	unsigned short	isPackageHeader	: 1,
    	                  payloadSize		: 11,
    	                  channel			: 4;
    };
    
    SPackageHeader header;
    header.isPackageHeader = 1;
    header.payloadSize = 2048;
    header.channel = 0;
    

    Sofort nachdem dieser Quelltext abgearbeitet ist, ermittele ich per Debugger, dass der Wert von header.payloadSize "0" ist.
    Was mache ich falsch? Habe ich etwas falsch verstanden bei Bit Fields?^^

    Mfg



  • the[V]oid schrieb:

    Was mache ich falsch? Habe ich etwas falsch verstanden bei Bit Fields?^^

    Nein, aber offensichtlich bei Bit-Berechnungen. 'payloadSize' fasst nur Werte von 0 bis 2047.



  • Ja das war'n peinlicher vergucker ^^ Aber danke, daran lag's... hab' aber ein neues Problem damit:

    struct SUniversalHeader {
    	unsigned short	headerType		 : 2,
    					  size			   : 14;
    	unsigned char	 channel			: 8;
    };
    
    std::cout << sizeof(SUniversalHeader); // gibt 4 aus
    

    Woran kann das liegen? Eigentlich müsste die Größe von SUniversalHeader doch 3 Bytes sein... Ein short ist laut sizeof 2 Bytes groß und ein char logischerweise 1 Byte.

    mfG



  • nennt sich glaub ich byte-alignment. da setzt dein compiler ein paddingbyte dazu. das macht er damit er immer auf 4 byte speicherausrichtung kommt.
    hoffe das das mal so stimmt, sonst berichtigt mich mal bitte.

    Meep Meep



  • Das glaube ich weniger, denn im ersten Beispiel (ich hab den Code nochmal kopiert) liefert ein sizeof(SPackageHeader) 3 Bytes:

    struct SPackageHeader {
    	unsigned short	isPackageHeader	: 1,
    	                  payloadSize		: 11,
    	                  channel			: 4;
    };
    

    Oder ich habe dich nicht verstanden ^^

    EDIT: ich meinte natürlich 2 und nich 3 Bytes 😉



  • re

    the[V]oid schrieb:

    Das glaube ich weniger, denn im ersten Beispiel (ich hab den Code nochmal kopiert) liefert ein sizeof(SPackageHeader) 3 Bytes

    das glaub ich mal fast nicht. ich denke eher das du da 2 bekommst
    zumindest faellt mir jetzt kein plausibler grund ein, warum hier sizeof 3 ausgeben sollte.

    Meep Meep



  • Ja, Tschuldigung, ich meinte natürlich 2 ^^ Aber trotzdem, das würde doch diese Alignment-Sache widerlegen, nich?



  • insofern hast du recht das er scheinbar nicht auf 4 byte sondern auf 2 byte grenzen ausrichtet.

    Meep Meep



  • Meep Meep schrieb:

    insofern hast du recht das er scheinbar nicht auf 4 byte sondern auf 2 byte grenzen ausrichtet.

    Meep Meep

    Da hast du sicherlich völlig recht.

    Mööp Mööp


Anmelden zum Antworten