Wie definiert man Typ A in Typ B und Typ B in Typ A?

7

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%     
frugi 21.01.2013, 11:16
quelle

3 Antworten

14

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:

%Vor%

Die Struktur TA könnte umgeschrieben werden, um dies zu bedeuten:

%Vor%

Natürlich haben wir jetzt eine nette rekursive Aufnahme von self in den TA record, etwas in der Art von:

%Vor%

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:

%Vor%

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:

%Vor%

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.

    
Cosmin Prund 21.01.2013, 11:38
quelle
11

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.

    
Andreas Rejbrand 21.01.2013 11:20
quelle
1

Die Delphi-Übersetzung des von Ihnen angezeigten C-Codes würde folgendermaßen aussehen:

%Vor%     
Remy Lebeau 21.01.2013 20:30
quelle

Tags und Links