Structanordnung fehlerhaft



  • Nabend.

    Habe folgendes Problem ... betrachten wir erst mal ne vereinfachte Form meines Sourcecodes:

    #include <stdio.h>
    #include <windows.h>
    
    struct test
    {
    	BYTE x1;
    	DWORD x2;
    };
    
    int main( void )
    {
    	BYTE byteArr[] = { 0x10, 0x11, 0x12, 0x13, 0x14 };
    
    	test *tStruct = ( test * )byteArr;
    
    	printf( "x1: %X\nx2: %X\n\n", tStruct->x1, tStruct->x2 );
    
    	system( "pause" );
    
    	return 0;
    };
    

    Erwartete Ausgabe wäre nach meinem Erachten folgende:

    x1: 10
    x2: 14131211
    
    Drücken Sie eine beliebige Taste . . .
    

    Leider bekomme ich nur folgendes:

    x1: 10
    x2: CCCCCC14
    
    Drücken Sie eine beliebige Taste . . .
    

    Als ich den ganzen Kram noch etwas komplexer in meinem eigentlichen Sourcecode hatte, dachte ich, es läge an dem BYTE-Array, was ich bis dahin noch nutze.

    Erst die vereinfachte Form zeigt mir, dass ich irgendwas übersehe...

    Hat jemand ne Idee?

    Wäre echt dankbar!!

    Gruß, paSe



  • Padding 😉



  • Padding? ^^

    Meinst du ich soll das mit memset auf 0 setzen?

    Edit:

    Oder meinst du, dass ich hinter die 0x10 3 mal 0x0 quetschen muss, weil DWORD 4*8 BYTE groß ist und demnach in 4er Schritten einliest?

    Das würde dann evtl erklären wieso ich bei

    BYTE byteArr[9] = { 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17 };
    

    so eine Ausgabe bekomme:

    x1: 10
    x2: 17161514
    
    Drücken Sie eine beliebige Taste . . .
    

    ... kann mir das aber eigentlich nicht vorstellen.

    Das muss auch anders gehen die 11 - 14 in DWORD zu quetschen ohne das mit Nullen aufzufüllen nur damits jeweils 4 BYTE sind.



  • Entschuldige, ich war ein wenig wortkarg 😃 Ich meine, dass die BYTE-Variable in deiner Struktur wahrscheinlich durch Padding 4 Bytes an Platz beansprucht. Als Lösung könntest du die Reihenfolge der Variablen umtauschen, für die Struktur Padding per Compiler-Schalter ausschalten oder dich damit abfinden.
    Übrigens gibt's sogar nen Wikipedia-Artikel zu "Padding" 🙂



  • Na Ahnung wo ich das in VS 05/08 abschalte?

    Ich nehme an in den Projekteigenschaften?

    Die Reihenfolge kann ich leider nicht ändern, da das BYTE-Array empfangene Datenpackete sind und die Struktur vom Server vorgegeben ist. 😉



  • unlimieD.paSe schrieb:

    Na Ahnung wo ich das in VS 05/08 abschalte?

    Ich glaube, es war sowas wie "pragma pack".
    edit: Hinter "pragma pack" kommt noch ein Parameter, frag einfach mal Google.



  • Danke!

    Edit: #pragma pack(push, 1)



  • Und nicht vergessen wieder anzuschalten:

    #pragma pack(pop)
    


  • David_pb schrieb:

    Und nicht vergessen wieder anzuschalten:

    Du meinst sicher abzuschalten. 😉

    Aber man sollte daran denken, dass #pragma -Direktiven womöglich nicht mehr funktionieren, wenn man sie auf einen anderen Compiler portiert. Wobei bei einem sinnvollen Compiler (genauer gesagt Präprozessor) eine Warnung entstehen sollte, wenn das #pragma unbekannt ist.



  • Nexus schrieb:

    David_pb schrieb:

    Und nicht vergessen wieder anzuschalten:

    Du meinst sicher abzuschalten. 😉

    Kommt auf den Blickwinkel an! 😉


Anmelden zum Antworten