Struct / Enum werden unterschiedlich behandelt?



  • Hallo,

    schreibe gerade ein kleines Tool zur Netzwerkkommunikation. Dazu versende ich structs und enums Bsp:

    enum PacketType{
     TYP1, TYP2}
    
    enum SenderType{
      SENDER1, SENDER2}
    
    struct MyData{
        int nSize;
        PacketType paket;
        SenderType typ;
    }
    

    das ganze wird dann als Mydata versendet und auch wieder in einer MyData Variable empfangen. das int wird noch richtig "wückgewandelt" allerdings stimmen die Werte in PacketType und SenderType nicht.

    Es handelt sich um einen Borlandcompiler auf Senderseite und eine MS auf Empfängerseite.

    Jemand ne Idee?

    LG



  • Was genau kommt denn an? Zeig mal einen Hexdump von dem was kommt und dem was du erwartest.

    Achtung, blindes Rumgestochere: ich hatte vor vielen Jahren mal bei einem Borland-Compiler das Problem, dass enums nur so groß wie nötig waren, statt so groß wie ein int.
    Füg mal bei den enums einen Dummywert hinzu, um int-Größe zu erzwingen:

    enum PacketType{
     TYP1, TYP2, TYP_SIZE_DUMMY = 0xffffffff }
    
    enum SenderType{
      SENDER1, SENDER2, SENDER_SIZE_DUMMY = 0xffffffff }
    

    Edit: und dafür sorgen, dass das Padding auf beiden Seiten übereinstimmt, in den Compilereinstellungen oder mit #pragma pack .



  • Registrierter Troll schrieb:

    Was genau kommt denn an? Zeig mal einen Hexdump von dem was kommt und dem was du erwartest.

    Achtung, blindes Rumgestochere: ich hatte vor vielen Jahren mal bei einem Borland-Compiler das Problem, dass enums nur so groß wie nötig waren, statt so groß wie ein int.
    Füg mal bei den enums einen Dummywert hinzu, um int-Größe zu erzwingen:

    enum PacketType{
     TYP1, TYP2, TYP_SIZE_DUMMY = 0xffffffff }
    
    enum SenderType{
      SENDER1, SENDER2, SENDER_SIZE_DUMMY = 0xffffffff }
    

    Edit: und dafür sorgen, dass das Padding auf beiden Seiten übereinstimmt, in den Compilereinstellungen oder mit #pragma pack .

    das mit den Dummywerten wars schon. Vielen vielen Dank! 👍



  • Beim Borland-Compiler kann man auch mit einem Compiler-Switch erzwingen, daß enums immer die Größe eines 'int' haben (jedoch ist ja eigentlich der MS Compiler nicht standardkonform, da dessen 'enum' immer die Größe eines 'int' hat).



  • Th69 schrieb:

    (jedoch ist ja eigentlich der MS Compiler nicht standardkonform, da dessen 'enum' immer die Größe eines 'int' hat).

    Beides ist konform, weil der Standard keine Mindestgröße vorschreibt.

    It is implementation-defined which integral type is used as the underlying type for an enumeration except that the underlying type shall not be larger than int unless the value of an enumerator cannot fit in an int or unsigned int.



  • Überhaupt sollte man sich nicht auf ein bestimmtes Klassen-Layout verlassen. Das ist nicht standardisiert und kann sich von Rechner zu Rechner und Compiler zu Compiler unterscheiden, inklusive solcher Dinge wie die Byte-Reihenfolge.

    Wenn man an einem größtenteils "portablen" Netzwerkprotokoll interessiert ist, baut man sich die Nachrichten per Hand in einem unsigned char Array zusammen und schreibt dann noch so etwas

    #include <climits>
    #if CHAR_BIT != 8
    #error "Diese Implementierung ist auf 8bit-Bytes ausgelegt"
    #endif
    

    um "ungewöhnliche" Fälle abzufangen, die eventuell eine Sonderbehandlung benötigten.

    Gruß,
    SP


Anmelden zum Antworten