![]() |
Union in Delphi
Hi,
ich bin gerade dabei, ein c++ struct in Delphi zu übernehmen. Jedoch scheitere ich gerade an dem union Teil. Soweit ich weiß, darf der "Variante Teil" nur am ende eines records stehen. Da ich dieses Record für eine DLL brauche, muss dies 1:1 zu dem c++ Beispiel stimmen, ich kann doch nicht einfach die Reihenfolge von dem Union ändern bzw. nach ganz unten schieben? Hat hier jemand einen Vorschlag? :D ![]()
Code:
Delphi Code (Mein Ansatz):
struct SDK_GPSConfig
{ SDK_HDRINFO size; SDK_HDRINFO version; const SDK_WCHAR_T* pDeviceName; const SDK_WCHAR_T* pSimFileName; const SDK_WCHAR_T* pLogFileName; SDK_INT4 LogFileFormat; SDK_INT4 baudRate; SDK_UINT4 flags; SDK_BOOL readOnly; SDK_BOOL GNSTMCDevice; const SDK_WCHAR_T* pDeviceName2; const SDK_WCHAR_T* pSimFileName2; const SDK_WCHAR_T* pLogFileName2; SDK_INT4 minDirVelo; union { SDK_BOOL m_bCalcMissing; SDK_BOOL bCalcMissing; }; SDK_BOOL shortTimeExtrapolator; SDK_BOOL useLocationDirectly; };
Code:
type SDK_GPSConfig=record
size: SDK_HDRINFO; version: SDK_HDRINFO; pDeviceName: ^SDK_WCHAR_T; pSimFileName: ^SDK_WCHAR_T; pLogFileName: ^SDK_WCHAR_T; LogFileFormat: SDK_INT4; baudRate: SDK_INT4; flags: SDK_UINT4; readOnly: SDK_BOOL; GNSTMCDevice: SDK_BOOL; pDeviceName2: ^SDK_WCHAR_T; pSimFileName2: ^SDK_WCHAR_T; pLogFileName2: ^SDK_WCHAR_T; minDirVelo: SDK_INT4; //union? case? shortTimeExtrapolator: SDK_BOOL; useLocationDirectly: SDK_BOOL; end; |
AW: Union in Delphi
|
AW: Union in Delphi
Hallo,
oder hier ![]()
Delphi-Quellcode:
TMessage = packed record
Msg: Cardinal; case Integer of 0: ( WParam: Longint; LParam: Longint; Result: Longint); 1: ( WParamLo: Word; WParamHi: Word; LParamLo: Word; LParamHi: Word; ResultLo: Word; ResultHi: Word); end; |
AW: Union in Delphi
Zwei mal der gleiche Typ - Was macht diese Union für einen Sinn? 🤔
|
AW: Union in Delphi
Nja, die einfachste Idee:
Den letzten Teil einfach in beide varianten Teile mit rein. Da mußt du die Felder aber umbenennen, da Namen ja nicht doppelt sein können. Aber ist eh nicht nötig, also einfach nur in einen der Teile rein, bzw. wenn die Teile unterschiedlich groß sind, dann in den Größten rein, oder z.B. in den Ersten und dann Dummyfelder (Platzhalter) davor. |
AW: Union in Delphi
Hallo,
frag doch mal den Hersteller (PTVGroup?), ob er eine Pascal-Implementierung hat. |
AW: Union in Delphi
Code:
Hat sich mal jemand angesehen was im Union eigentlich steht?
struct SDK_GPSConfig
{ SDK_HDRINFO size; SDK_HDRINFO version; const SDK_WCHAR_T* pDeviceName; const SDK_WCHAR_T* pSimFileName; const SDK_WCHAR_T* pLogFileName; SDK_INT4 LogFileFormat; SDK_INT4 baudRate; SDK_UINT4 flags; SDK_BOOL readOnly; SDK_BOOL GNSTMCDevice; const SDK_WCHAR_T* pDeviceName2; const SDK_WCHAR_T* pSimFileName2; const SDK_WCHAR_T* pLogFileName2; SDK_INT4 minDirVelo; union { SDK_BOOL m_bCalcMissing; SDK_BOOL bCalcMissing; }; SDK_BOOL shortTimeExtrapolator; SDK_BOOL useLocationDirectly; }; Wenn das Orginal ist macht das ja nichtmal Sinn. |
AW: Union in Delphi
Hallo,
doch, laut Hersteller ist m_bCalcMissing deprecated und es soll jetzt bCalcMissing benutzt werden. Damit man den Quellcode, also den Variablennamen auf der Client-Seite nicht ändern muss, wurde das union eingeführt. Trotzdem sehr merkwürdig ;) |
AW: Union in Delphi
Das ist vielleicht eine kreative Art Variablen umzubenennen, und gleichzeitig die alten Namen beizubehalten.
Sehr merkwürdig bemerkenswert :stupid: |
AW: Union in Delphi
Also im Prinzip ist es kein "richtiger" varianter Teil, sondern nur eine Namensänderung.
Du kannst dir also einfach einen der Namen aussuchen und fertig. Die Union ist nur dafür da, damit der Record abwärtskompatibel bleibt, also noch der alte Name genutzt werden kann, während man schon den neuen Namen verwenden kann sollte. Ansonsten würde ich es eher so übersetzen.
Delphi-Quellcode:
type
SDK_GPSConfig = record size: SDK_HDRINFO; version: SDK_HDRINFO; pDeviceName: ^SDK_WCHAR_T; pSimFileName: ^SDK_WCHAR_T; pLogFileName: ^SDK_WCHAR_T; LogFileFormat: SDK_INT4; baudRate: SDK_INT4; flags: SDK_UINT4; &readOnly: SDK_BOOL; // oder diesen Namen etwas ändern GNSTMCDevice: SDK_BOOL; pDeviceName2: ^SDK_WCHAR_T; pSimFileName2: ^SDK_WCHAR_T; pLogFileName2: ^SDK_WCHAR_T; minDirVelo: SDK_INT4; bCalcMissing: SDK_BOOL; shortTimeExtrapolator: SDK_BOOL; useLocationDirectly: SDK_BOOL; property m_bCalcMissing: SDK_BOOL read bCalcMissing write bCalcMissing; // oder weglassen, wenn der alte Name nicht nötig ist end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:56 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz