Was ist das Speicherlayout eines Delphi dynamischen Arrays von dynamischen Arrays von X?

StackOverflow https://stackoverflow.com/questions/1519016

  •  19-09-2019
  •  | 
  •  

Frage

Ich versuche, eine Prozedur in einem Delphi-DLL von C # zu nennen. Das Verfahren geht davon aus den Anrufern ein array of array of TSomeRecord vorzuzubelegen und Eingang, von dem es dann die TSomeRecord Elemente als ein Mittel der Ergebnisse manipulieren. Also muss ich Hand-craft Delphi dynamische Arrays von Arrays von X.
Nun Ich habe hier gefunden , dass eine dynamische array of X auf das erste Element des dynamischen Array einen Zeiger besteht, und daß das erste Element hat einen Referenzzähler und die Länge (Anzahl der Elemente) des Feldes vorangestellt (jeweils 32-Bit-Ganzzahlen), und dass die Elemente gespeichert werden Inline- und zusammenhängend, so dass die ganze Sache sieht wie folgt aus Speicher:

rrrrllll000...000111...12...
        ^

rrrr mit den Referenzzähler, llll die Länge, die die Elemente 0123 und ^, wo der Zeiger auf. Dies trägt out; Ich habe es getestet und es funktioniert.
Für mehrdimensionale dynamische Arrays Ich habe angenommen, dass ich array of Y für die X in array of X, mit anderen Worten, dass die äußere Dimension einfach ein dynamisches Array von (Zeigern auf) dynamische Arrays, wie so ist ersetzen kann:

rrrrllll000011112222...
        ^

, wo die Elemente 0000, 1111 usw. sind nun 32-Bit-Zeiger auf unabhängig zugewiesen dynamische Arrays. es auf diese Weise zu tun, verdient mich für meine Mühen eine Zugriffsverletzung jedoch. Dies ist offensichtlich nicht, wie Delphi erwartet, dass ich es tun. Kann jemand mir erklären, wie ich am sollte dies tun?

War es hilfreich?

Lösung

ein dynamisches Array ist ein Zeiger auf einen gepackte Block von Elementen.

So Array von Array von TSomeRecord ist ein Zeiger auf ein Feld von Zeigern, welche jeweils Punkte auf einen Blockspeicher mit einer Länge (array [First]) Elementen oder NIL, wenn es keine gibt.

Mit anderen Worten, was Sie davon ausgehen, ist in etwa richtig, mit dem Zusatz, dass Arrays mit Null-Elementen Null ist. Beachten Sie, dass Sie sollen nicht zu ändern Referenzzahl und Länge selbst wenn Sie wirklich wissen, was Sie tun.

Die Bestimmung, was bewirkt, dass Ihr Absturz wird ohne Beispiel-Code hart sein. Denken Sie daran, dass wie bei ALL automatisierte Delphi-Typen (außer Wide), alle dynamischen Speicher muss vom delphi Speichermanager zugewiesen werden.

Versuche, dass mit Hilfe der Speicher-Manager von welcher Sprache Sie Schnittstellen sind nicht möglich.

Andere Tipps

Language Guide (einmal als sehr nützlich gedruckte Handbücher, jetzt diese Informationen in der Online-Hilfe zu finden, ist sehr schwer) heißt es:

"Ein mehrdimensionales Array mit der am weitesten rechts liegende Dimension zunehmenden ersten gespeichert ist."

Dabei AFAIK haben Sie nicht ein Array von Zeigern - einfach jede Dimensionsdaten nacheinander aus dem ganz rechts beginnend, ich denke, es schneller ist, weil es nicht mehr Indirekt ist

.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top