Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Union in Delphi (https://www.delphipraxis.net/209278-union-delphi.html)

dtpfl 17. Nov 2021 13:30

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

C++ Code:
Code:
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;
};
Delphi Code (Mein Ansatz):
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;

Delphi.Narium 17. Nov 2021 13:34

AW: Union in Delphi
 
Eventuell sowas?

https://www.delphipraxis.net/147752-union-c-delphi.html

hoika 17. Nov 2021 13:37

AW: Union in Delphi
 
Hallo,
oder hier

https://www.delphipraxis.net/154106-case-integer.html

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;

Der schöne Günther 17. Nov 2021 21:10

AW: Union in Delphi
 
Zwei mal der gleiche Typ - Was macht diese Union für einen Sinn? 🤔

himitsu 17. Nov 2021 22:31

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.

hoika 18. Nov 2021 04:34

AW: Union in Delphi
 
Hallo,
frag doch mal den Hersteller (PTVGroup?), ob er eine Pascal-Implementierung hat.

Sinspin 18. Nov 2021 06:31

AW: Union in Delphi
 
Code:
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;
};
Hat sich mal jemand angesehen was im Union eigentlich steht?
Wenn das Orginal ist macht das ja nichtmal Sinn.

hoika 18. Nov 2021 06:39

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 ;)

Rollo62 18. Nov 2021 07:12

AW: Union in Delphi
 
Das ist vielleicht eine kreative Art Variablen umzubenennen, und gleichzeitig die alten Namen beizubehalten.
Sehr merkwürdig bemerkenswert :stupid:

himitsu 18. Nov 2021 07:49

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 09:08 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz