2009-10-05 14 views
5

Próbuję wywołać procedurę w DLL Delphi z C#. Procedura oczekuje, że osoba wywołująca dokona wstępnej alokacji i wprowadzi numer array of array of TSomeRecord, z którego następnie będzie manipulować elementami TSomeRecord jako sposobem zwracania wyników. Potrzebuję więc ręcznie opracować tablice dynamiczne Delphi z macierzami X.
Teraz, I have found here, że dynamiczne array of X składa się ze wskaźnika do pierwszego elementu tablicy dynamicznej i że ten pierwszy element ma liczbę odniesienia i długość (liczba elementów) z tablicy poprzedzany (obie liczby 32-bitowe), i że elementy są przechowywane inline i zwarty, tak że cała sprawa wygląda w pamięci:Jaki jest układ pamięci dynamicznej macierzy X dynamicznej tablicy X?

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

z rrrr liczenia odniesienia , llll długość,elementy i^gdzie wskazuje wskaźnik. To zanika; Przetestowałem to i działa.
do wielowymiarowej dynamicznych tablic ja założyliśmy, że mogę zastąpić array of Y dla X w array of X, innymi słowy, że zewnętrzny wymiar jest po prostu dynamiczna tablica (wskaźniki do) dynamicznych tablic, tak jak poniżej:

 
rrrrllll000011112222... 
     ^

gdzie elementy 0000, 1111 itd. są teraz wskaźnikami 32-bitowymi do niezależnie przydzielonych dynamicznych tablic. Jednak zrobienie tego w ten sposób daje mi dostęp do moich kłopotów. Wygląda na to, że Delphi tego nie zrobi. Czy ktoś może mi wyjaśnić, jak mam to zrobić?

Odpowiedz

8

Tablica dynamiczna to wskaźnik do spakowanego bloku elementów.

Tablica tablic TSomeRecord jest wskaźnikiem do tablicy wskaźników, z których każda wskazuje na blokową pamięć o długości (element [firstlevel]) lub zero, jeśli nie ma żadnych.

Innymi słowy, zakładamy, że jest z grubsza poprawna, z dodatkiem, że tablice z elementami zerowymi są zerowe. Zauważ, że nie powinieneś sam zmieniać liczby referencyjnej i długości, chyba że NAPRAWDĘ wiesz, co robisz.

Ustalenie, co spowoduje awarię będzie trudne bez przykładowego kodu. Należy pamiętać, że tak jak w przypadku automatycznych typów Delphi (z wyjątkiem najszerszego zakresu), cała pamięć dynamiczna musi zostać przydzielona przez menedżera pamięci delphi.

Próby tego przy użyciu menedżera pamięci dowolnego języka, z którym się łączysz, nie są możliwe.

+0

Dzięki za odpowiedź. Zdaję sobie sprawę, że może to być łatwiejsze do zdiagnozowania za pomocą (przykładowego) kodu, ale nie mam go; tylko podpis procedury. Biblioteka DLL jest czarnym pudełkiem innej firmy. –

+0

Jedyną radą, jaką mogę ci dać, jest trzymanie się zasady, że ktokolwiek przydzieli również musi zwolnić lub zawinąć bibliotekę DLL w Delphi a delphi.exe (comserver) lub dll najpierw usuwa typy automatyczne z interfejsu –

0

Język Guide (niegdyś dostępny jako bardzo przydatnych podręczników drukowanych, teraz znalezienie tych informacji w pomocy online jest bardzo trudne) stwierdza:

„Tablica wielowymiarowa jest przechowywana z skrajna wymiar zwiększenie pierwszy.”

Dzięki temu AFAIK nie macie tablicy wskaźników - po prostu dane każdego wymiaru jeden po drugim, zaczynając od prawej, sądzę, że jest to szybsze, ponieważ nie ma już żadnych pośredników.

+0

Fragment LG jest o statycznych tablicach, podczas gdy pytanie dotyczy dynamicznych tablic. –

+0

Masz rację. Sprawdziłem podręcznik i chociaż układ pamięci dynamicznych tablic nie jest szczegółowy, mówi, że dynarray może być "nie prostokątny", i myślę, że jedynym sposobem na osiągnięcie tego jest posiadanie dynamicznej tablicy anohter jako elementów "zewnętrznego" szyk. Jednak dość powolny dostęp do wewnętrznych. –

Powiązane problemy