AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Union in Delphi

Ein Thema von dtpfl · begonnen am 17. Nov 2021 · letzter Beitrag vom 20. Nov 2021
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von dtpfl
dtpfl

Registriert seit: 19. Jan 2018
Ort: Bayern
20 Beiträge
 
Delphi 12 Athens
 
#1

Union in Delphi

  Alt 17. Nov 2021, 14:30
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?

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;
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.490 Beiträge
 
Delphi 7 Professional
 
#2

AW: Union in Delphi

  Alt 17. Nov 2021, 14:34
Eventuell sowas?

https://www.delphipraxis.net/147752-union-c-delphi.html
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Union in Delphi

  Alt 17. Nov 2021, 14:37
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;
Heiko
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.159 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Union in Delphi

  Alt 17. Nov 2021, 22:10
Zwei mal der gleiche Typ - Was macht diese Union für einen Sinn? 🤔
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#5

AW: Union in Delphi

  Alt 17. Nov 2021, 23:31
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Union in Delphi

  Alt 18. Nov 2021, 05:34
Hallo,
frag doch mal den Hersteller (PTVGroup?), ob er eine Pascal-Implementierung hat.
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von Sinspin
Sinspin

Registriert seit: 15. Sep 2008
Ort: Dubai
677 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: Union in Delphi

  Alt 18. Nov 2021, 07:31
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.
Stefan
Nur die Besten sterben jung
A constant is a constant until it change.
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Union in Delphi

  Alt 18. Nov 2021, 07:39
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
Heiko
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.093 Beiträge
 
Delphi 12 Athens
 
#9

AW: Union in Delphi

  Alt 18. Nov 2021, 08:12
Das ist vielleicht eine kreative Art Variablen umzubenennen, und gleichzeitig die alten Namen beizubehalten.
Sehr merkwürdig bemerkenswert
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#10

AW: Union in Delphi

  Alt 18. Nov 2021, 08:49
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;
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (18. Nov 2021 um 09:47 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:15 Uhr.
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