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:- 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ß!
- Suche nach #pragma pack, was Dein Compiler anbietet. Nachteil: Implementation wird compilerabhängig.
-
Super Danke!
#pragma pack(1) typedef struct .. #pragma pack()
funktioniert!
-
pointercrash() schrieb:
- 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.
- Suche nach #pragma pack, was Dein Compiler anbietet. Nachteil: Implementation wird compilerabhängig.
-
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.