Quelle est la structure de la mémoire d'un tableau dynamique Delphi de tableau dynamique de X?

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

  •  19-09-2019
  •  | 
  •  

Question

Je suis en train d'appeler une procédure dans une DLL Delphi de C #. La procédure prévoit que l'appelant Préallouer et l'entrée d'un array of array of TSomeRecord, dont il sera ensuite manipuler les éléments de TSomeRecord comme un moyen de résultats de retour. Donc, je dois la main métier Delphi tableaux dynamiques de tableaux de X.
Maintenant, J'ai trouvé ici qu'une array of X dynamique est constitué d'un pointeur vers le premier élément de la matrice dynamique, et que ce premier élément a un compte de référence et la longueur (nombre d'éléments) du réseau préfixé (tous deux des entiers de 32 bits), et que les éléments sont stockés en ligne et jointive, de sorte que le tout ressemble à ceci en mémoire:

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

rrrr avec le compte de référence, llll la longueur, les éléments 0123 et ^ où le pointeur pointe vers. Cela confirme; Je l'ai testé et il fonctionne.
Pour les tableaux dynamiques multidimensionnels je suppose que je peux substituer array of Y pour le X en array of X, autrement dit que la dimension extérieure est tout simplement un tableau dynamique de (pointeurs) à des tableaux dynamiques, comme suit:

rrrrllll000011112222...
        ^

où les éléments 0000, 1111, etc., sont maintenant 32 pointeurs de bit à des tableaux dynamiques alloués indépendamment. En procédant ainsi, cependant, me rapporte une violation d'accès pour mes ennuis. Ceci est apparemment pas comment Delphi attend de moi de le faire. Quelqu'un peut-il me expliquer comment je h censé le faire?

Était-ce utile?

La solution

Un tableau dynamique est un pointeur vers un bloc emballé d'éléments.

réseau de réseau de TSomeRecord est un pointeur sur un tableau de pointeurs, dont chacun indique une mémoire de bloc de longueur des éléments (array [FirstLevel]), ou zéro s'il n'y en a pas.

En d'autres termes, ce que vous assumez est à peu près correct, avec l'ajout que les tableaux avec zéro éléments sont nuls. Notez que vous n'êtes pas censé changer le nombre de référence et la longueur vous-même si vous savez vraiment ce que vous faites.

Déterminer les causes de votre accident sera difficile sans exemple de code. Gardez à l'esprit que, comme pour tous automatisés types Delphi (sauf WideString), toute la mémoire dynamique doit être attribué par le gestionnaire de mémoire delphi.

Les tentatives de qu'utiliser le gestionnaire de mémoire de la langue que vous interfacez à n'est pas possible.

Autres conseils

Le guide linguistique (une fois disponible sous forme de manuels très utiles, maintenant trouver cette information dans l'aide en ligne est très difficile) déclare:

« Un tableau multidimensionnel est mémorisé avec la dimension la plus à droite augmentant d'abord ».

Ainsi vous n'avez pas AFAIK un tableau de pointeurs - simplement chaque donnée de dimension un après l'autre, à partir d'une extrême droite, je pense qu'il est plus rapide parce qu'il n'y a pas plus indirections

.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top