![]() |
C++ Struct nach Delphi portieren
Hey,
ich habe hier ein etwas komplexeres C++ Struct, welches ich gerne nach Delphi portieren würde:
Code:
Allerdings habe ich keine Ahnung, was die wiederholte deklaration von HPOLY im Struct selbst bedeuten soll und ebenso weiß ich nicht, wie die Struct Operatoren in Delphi umgesetzt werden können.
struct HPOLY
{ HPOLY() : m_nWorldIndex(0xFFFFFFFF), m_nPolyIndex(0xFFFFFFFF) {} HPOLY(__int32 nWorldIndex, __int32 nPolyIndex) : m_nWorldIndex(nWorldIndex), m_nPolyIndex(nPolyIndex) {} HPOLY(const HPOLY& hPoly) : m_nWorldIndex(hPoly.m_nWorldIndex), m_nPolyIndex(hPoly.m_nPolyIndex) {} HPOLY &operator=(const HPOLY &hOther) { m_nWorldIndex = hOther.m_nWorldIndex; m_nPolyIndex = hOther.m_nPolyIndex; return *this; } bool operator==(const HPOLY &hOther) const { return (m_nWorldIndex == hOther.m_nWorldIndex) && (m_nPolyIndex == hOther.m_nPolyIndex); } bool operator!=(const HPOLY &hOther) const { return (m_nWorldIndex != hOther.m_nWorldIndex) || (m_nPolyIndex != hOther.m_nPolyIndex); } __int32 m_nPolyIndex, m_nWorldIndex; }; Ich hoffe irgendein C Kenner kann mir da weiterhelfen. Viele Grüße Zacherl |
AW: C++ Struct nach Delphi portieren
Also, der Record selber sieht so aus, von den Daten her:
Delphi-Quellcode:
HPOLY() wäre wohl eine Art Constructor, welches bei Delphi-Records nicht gibt, bzw. welches nicht nötig ist, da man es ja manuell aufrufen muß, denn eine automatische Initialisierung gibt es leider nicht :cry:
HPOLY = record
m_nPolyIndex, m_nWorldIndex: LongInt; end; Da wirst'e dir wohl besser eine Init-Prozedur draus machen müssen. Die nächsten zwei HPOLY( sind och sowas, nut mir Parametern zur Initialisiereung, also nochein Init, aber mit
Delphi-Quellcode:
als Parameter,
m_nPolyIndex, m_nWorldIndex: LongInt;
das 3. HPOLY( kannst'e eigentlich weglassen, da es nur den record kopiert, was Delphi automatisch macht. und danach kommen dann ein paar Klassenoperatoren ( ![]() [add]
Delphi-Quellcode:
HPOLY = record
FPolyIndex, FWorldIndex: LongInt; procedure Init; procedure Init(PolyIndex, WorldIndex: LongInt); procedure Init(const Source: HPOLY); //class operator Implicit(const Source: HPOLY): HPOLY; class operator Equal (const Source: HPOLY): Boolean; class operator NotEqual(const Source: HPOLY): Boolean; end;
Delphi-Quellcode:
HPOLY = record
FPolyIndex, FWorldIndex: LongInt; class function Init: HPOLY; class function Init(PolyIndex, WorldIndex: LongInt): HPOLY; class function Init(const Source: HPOLY): HPOLY; //class operator Implicit(const Source: HPOLY): HPOLY; class operator Equal (const Source: HPOLY): Boolean; class operator NotEqual(const Source: HPOLY): Boolean; end;
Delphi-Quellcode:
HPOLY = record
FPolyIndex, FWorldIndex: LongInt; constructor Create; constructor Create(PolyIndex, WorldIndex: LongInt); constructor Create(const Source: HPOLY); //class operator Implicit(const Source: HPOLY): HPOLY; class operator Equal (const Source: HPOLY): Boolean; class operator NotEqual(const Source: HPOLY): Boolean; end; |
AW: C++ Struct nach Delphi portieren
Vielen Dank für deine Erklärung. Dass es sich um Konstruktoren handelt, da wär ich nie drauf gekommen :D Hatte da eher spontan auf variante Records getippt ^^
|
AW: C++ Struct nach Delphi portieren
Hab oben mal was nacheditiert.
PS: Warum werden beim Editieren über den Inlineeditor keine neuen Beiträge geladen, wenn zwischendurch geantwortet wurde? Nee, das Meiste sind einfach nur "Methoden"/Funktionen. Du kannst das Verhalten aber auch gerne in einen eigenen Variant-Typ verpacken, aber dein D2010 kennt ja schon die Record-Operatoren, so daß man es quasi fast komplett direkt übersetzen und so belassen kann. |
AW: C++ Struct nach Delphi portieren
Wow danke dir recht herzlich :) Ich teste das zu Hause direkt mal im Einsatz. Beeinflussen class operator Felder eigentlich die Größe des Records?
Würde ich z.b. jetzt einen Record mit einer normalen Methode erstellen, wäre dieser ja 4 Bytes groß. Ich frage nur, weil dieser Record zu einer anderen Anwendung kompatibel gelesen / gespeichert werden soll. Da wäre es natürlich blöd, wenn durch die class operators die Größe verfälscht wird. |
AW: C++ Struct nach Delphi portieren
Hallo,
Delphi-Quellcode:
:arrow: Nein, die Größe wird nicht verändert ;)
type
TTest = record A: Integer; procedure Blubb; class function X: Integer; static; end; // SizeOf(TTest) = 4 |
AW: C++ Struct nach Delphi portieren
Perfekt danke dir! Konnte leider nicht selbst testen, da hier kein Delphi installiert ist :P
Edit: Moment das verwundert mich jetzt, dass die procedure die Größe auch nicht beeinflusst. :? Argh achso ne da war ich wohl in Gedanken bei den VTable Functions. |
AW: C++ Struct nach Delphi portieren
Zitat:
|
AW: C++ Struct nach Delphi portieren
@Deep-Sea: Njain, es kennt Konstruktoren, aber es nutzt diese nicht automatisch.
Wäre zu schön, wenn bei
Delphi-Quellcode:
Delphi automatisch den Contructor aufruft, wenn die Variable Initialisiert wird, ebenso den Destructor beim Freigeben und ein "Clone" beim Kopieren.
var X: HPOLY;
Technisch wäre es möglich, und ich hatte (vor)letzes Jahr Emba auch diesbezüglich einen Eintrag im QC spendiert, wo ich sogar zeigte, daß es eigentlich sehr einfach zu implementieren wäre und wo man was ändern/erweitern müßte, da Delphi die Grundvoraussetungen schon besitzt (siehe String, dynArray und Interface), aber leider gab es da nie eine Reaktion. @Zacherl: Nee, es ändert nicht die Größe. Diese Operatoren und Record-Methoden sind quasi statische Prozeduren, welche nur über den Typen im Compiler verlinkt sind, aber am Typen sonst Speichertechnisch nichts verändern. PS: virtuelle Methoden gibt es nicht, welche da was verändern/vergrößern könnten, da Records eh keine Vererbung kennen. |
AW: C++ Struct nach Delphi portieren
@himitsu:
Das stimmt natürlich - leider. Aber Konstruktoren an sich gibt es halt schon :-D |
AW: C++ Struct nach Delphi portieren
Zitat:
Wenn ich jedoch schreibe:
Code:
ist das im Grunde (bis auf die Typisierung) das gleiche wie:
class foo
{ public: foo() {} }
Code:
struct foo
{ public: foo() {} } |
AW: C++ Struct nach Delphi portieren
Und was ich in Delphi grade wieder liebe, sind diese Meldungen, für Konstructoren, mit keinen oder nur varianten Parametern:
Delphi-Quellcode:
Wo mir auch noch keiner plausibel erklären konnte, warum das nicht erlaubt ist.
[DCC Fehler] Unit3.pas(25): E2394 Parameterlose Konstruktoren sind für Record-Typen nicht zulässig
[DCC Fehler] Unit3.pas(37): E2471 Möglicherweise parameterlose Konstruktoren sind in Record-Typen nicht zulässig |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:21 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-2025 by Thomas Breitkreuz