Brauche Hilfe für typedef struct von Delphi



  • Hi,

    ich habe hier ein Problem mit einer Delphi DLL!

    Diese gibt mir in einer CallBack diese Type struct:

    type
      TDB_Data = packed record
        ID : Byte;
        Line1 : Word;
        Line2 : Word;
        Quote : Byte;
      end;
    

    In C sollte die typdef dann ja so aussehen:

    typedef struct
    {
    	BYTE ID;
    	WORD Line1;
    	WORD Line2;
    	BYTE Quote;
    } DB_DATA;
    

    Die DLL schickt mir nun die Daten:

    ID 0x02
    Line1 = 0x1000
    Line2 = 0x0013
    Quote = 0x00
    

    Jedoch bekomme ich das Ergebnis:

    -		db_data	{ID='' Line1=0x1310 Line2=0x0000 ...}	DB_DATA
    		ID	0x02 ''	unsigned char
    		Line1	0x1310	unsigned short
    		Line2	0x0000	unsigned short
    		Quote	0x00	unsigned char
    

    Wenn ich die typdef struct so mache:

    typedef struct
    {
    	unsigned char test[6];
    } DB_DATA;
    

    sehe ich diesen Inhalt:

    -		test	0x03fffdac ""	unsigned char [6]
    		[0x0]	0x02 ''	unsigned char
    		[0x1]	0x00	unsigned char
    		[0x2]	0x10 ''	unsigned char
    		[0x3]	0x13 ''	unsigned char
    		[0x4]	0x00	unsigned char
    		[0x5]	0x00	unsigned char
    

    Da ist irgendwas verdreht und ich komm nicht drauf!
    Scheint irgendwas mit MSB LSB zu sein.
    Kann mir da jemand helfen?

    Danke!



  • Ganz simpel, Du stolperst gerade über das "padding" byte- Problem. Du kannst nicht ganz genau sagen, ob ein char in einer struct auch wirklich nur ein Byte einnimmt. Statt des char wird ein 16- Bit- Short eingelesen. Danach stimmt nix mehr.
    Abhilfe:

    1. Suche nach #pragma pack, was Dein Compiler anbietet. Nachteil: Implementation wird compilerabhängig.
      2)Als char- Paket einlesen und selber die Werte zurechtfummeln. Nachteil: Meist langsamer.

    Viel Spaß! 😃



  • Super Danke!

    #pragma pack(1)
    typedef struct
    ..
    #pragma pack()
    

    funktioniert!



  • pointercrash() schrieb:

    1. Suche nach #pragma pack, was Dein Compiler anbietet. Nachteil: Implementation wird compilerabhängig.
      2)Als char- Paket einlesen und selber die Werte zurechtfummeln. Nachteil: Meist langsamer.

    Und wenn man pech hat, läuft das Programm EXTREM langsamer, weil die Struktur nicht gepaddet ist. Methode 2 ist immer noch die saubere Lösung.



  • Janjan schrieb:

    Und wenn man pech hat, läuft das Programm EXTREM langsamer, weil die Struktur nicht gepaddet ist. Methode 2 ist immer noch die saubere Lösung.

    Toll, Du Schlauli 🤡 , er kriegt's ja schon als packed record von der Delphi-DLL reingedrückt!
    Wenn er die Definition mitm #pragma pack gebacken bekommt, ist das mit Sicherheit die schnellere Lösung.



  • pointercrash() schrieb:

    Janjan schrieb:

    Und wenn man pech hat, läuft das Programm EXTREM langsamer, weil die Struktur nicht gepaddet ist. Methode 2 ist immer noch die saubere Lösung.

    Toll, Du Schlauli 🤡 , er kriegt's ja schon als packed record von der Delphi-DLL reingedrückt!
    Wenn er die Definition mitm #pragma pack gebacken bekommt, ist das mit Sicherheit die schnellere Lösung.

    Die schnellere Lösung zum einlesen vielleicht, du Schlaui, aber sicher nicht der ganze Rest.


Anmelden zum Antworten