Ich habe zwei Arten. Ein Typ A und ein Typ B. Der Problemtyp A enthält Typ B und Typ B enthält Typ A. Eine solche Sache funktioniert nicht:
%Vor%Bearbeiten: Das ist nicht mein Design. Ich konvertiere C-Header-Dateien (um auf eine DLL zuzugreifen), die solche Konstrukte in Delphi enthalten.
Bearbeiten2: "C ++ - Strukturen sind ein anderer Name für Klassen AFAIR. Und es muss Zeiger gegeben haben, nicht Werte selbst. - Arioch 'The 1 min ago" Ja du hast Recht das war ein Zeiger auf einen Typ:
Dort habe ich definiert:
%Vor%Funktioniert das stattdessen?
%Vor%Bearbeiten3: Die C-Strukte:
%Vor% Sie haben missverstanden, was diese C-Strukturen darstellen. Das liegt daran, dass record
ein Werttyp ist: Er wird genau dort gespeichert, wo Sie die Variable deklarieren. Lassen Sie uns also ein paar rekursive Deklarationen machen, und Sie werden verstehen, was ich meine; Angenommen, die beiden Strukturen sind nicht absolut identisch:
Die Struktur TA
könnte umgeschrieben werden, um dies zu bedeuten:
Natürlich haben wir jetzt eine nette rekursive Aufnahme von self in den TA
record, etwas in der Art von:
Wahrscheinlich möchten Sie Referenztypen verwenden, um etwas zu erhalten, das ähnlich aussieht, aber nicht ähnlich. Ein Referenztyp ist immer ein Zeiger, also eine feste Größe; Der Compiler kann sie ohne Probleme zuordnen. Dies wäre gültig, indem man Zeiger auf Datensätze verwendet:
%Vor% Alternativ könnten Sie Klassen verwenden; Das funktioniert aus dem gleichen Grund, Klassen sind Referenztypen; Sie funktionieren genauso wie Zeiger. Wenn Sie eine Variable vom Zeigertyp deklarieren, weist der Compiler SizeOf(Pointer)
bytes zu.
Da Sie die C-Strukturen veröffentlicht haben, kann ich sagen, dass sie zu lang sind, als dass ich eine vollständige Übersetzung versuchen könnte, aber ich kann einige Vorschläge machen: Sie sollten alle Ihre Typen in einem einzigen Type
-Block deklarieren; Schreiben Sie nicht Type
vor jeder Typdeklaration. Dadurch können Sie den Zeigertyp vor dem Datensatztyp wie folgt erstellen:
Deklarieren Sie für jeden Typ, der Zeiger auf Datensätze benötigt, zuerst die Zeiger nach dem Type
-Schlüsselwort, das ist einfacher. Als Nächstes müssen Sie die C-Zeiger identifizieren. Wenn zwischen dem Namen des Datentyps und dem Namen des Feldes ein *
steht, ist das ein Zeiger. Dies wird normalerweise so geschrieben:
Aber diese wären genauso gültig:
%Vor% Schließlich müssen Sie sich mit Ausrichtungsproblemen befassen. Wenn Sie können, überprüfen Sie die Größe der Strukturen auf der C-Seite, und überprüfen Sie dann die Größe auf der Delphi-Seite: Sie sollten die gleiche Größe erhalten. Wenn Sie dies nicht tun, sollten Sie einige zufällige {$ALIGN}
Compiler-Direktiven vor Ihrer Strukturdeklaration versuchen und wiederholen, bis Sie die richtige Ausrichtung getroffen haben. Wenn alles andere fehlschlägt, müssen Sie herausfinden, was falsch ist (welche Felder auf der Delphi-Seite anders ausgerichtet sind) und einige Ausrichtungsbytes einfügen, um es künstlich zu reparieren.
Vielleicht ist die beste Lösung, das Design zu überdenken. Sie könnten aber auch an sogenannten Vorwärtsdeklarationen von Klassen interessiert sein:
%Vor%SIC! Dies funktioniert nur für Klassen, nicht für Datensätze.
Die Delphi-Übersetzung des von Ihnen angezeigten C-Codes würde folgendermaßen aussehen:
%Vor%