¿Cuál es la distribución de la memoria de una matriz dinámica de Delphi matriz dinámica de X?

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

  •  19-09-2019
  •  | 
  •  

Pregunta

Estoy tratando de llamar a un procedimiento en un Delphi DLL de C #. El procedimiento espera que la persona que llama para asignar previamente y la entrada de un array of array of TSomeRecord, de la que entonces manipular los elementos TSomeRecord como un medio de devolver los resultados. Por lo tanto, necesito para hacer a mano Delphi matrices dinámicas de matrices de X.
Ahora, he encontrado aquí que un array of X dinámico consiste en un puntero al primer elemento de la matriz dinámica, y que ese primer elemento tiene un recuento de referencia y la longitud (número de elementos) de la matriz antepuesto (ambos enteros de 32 bits), y que los elementos se almacenan en línea y de forma contigua, por lo que todo el asunto es el siguiente en la memoria:

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

con rrrr el recuento de referencia, llll la longitud, 0123 los elementos, y ^ donde el puntero apunta a. Esto pone de manifiesto; Lo he probado y funciona.
Para matrices dinámicas multidimensionales he asumido que I puede sustituir array of Y para la X en array of X, en otras palabras, que la dimensión exterior es simplemente una matriz dinámica de (punteros a) matrices dinámicas, así:

rrrrllll000011112222...
        ^

donde los elementos 0000, 1111, etc son ahora 32 punteros bits para asignados independientemente matrices dinámicas. Haciéndolo de esta manera, sin embargo, me gana una violación de acceso para mi problema. Esto no es aparentemente la forma en Delphi espera que yo lo haga. ¿Puede alguien explicarme cómo I am se supone que haga esto?

¿Fue útil?

Solución

una matriz dinámica es un puntero a un bloque lleno de elementos.

Así gama de variedad de TSomeRecord es un puntero a una matriz de punteros, cada uno de los cuales apunta a un bloque de memoria con una longitud de elementos (array [firstlevel]), o nil si no hay ninguno.

En otras palabras, lo que supongo que es más o menos correcta, con la particularidad de que las matrices con elementos cero son nulas. Tenga en cuenta que no se supone que cambiar el contador de referencia y la longitud de su cuenta a menos que realmente sepa lo que está haciendo.

La determinación de las causas de su accidente será difícil sin ejemplo de código. Tenga en cuenta que, en cuanto a todos tipos automatizados Delphi (excepto widestring), toda la memoria dinámica debe ser asignada por el administrador de memoria Delphi.

Los intentos de que utilizando el administrador de memoria de cualquier idioma con el que interactúe a no es posible.

Otros consejos

La guía de idiomas (una vez disponible como manuales impresos de gran utilidad, ya la búsqueda de esta información en la ayuda en línea es muy difícil) establece lo siguiente:

"una matriz multidimensional se almacena con la dimensión más a la derecha el aumento de primera."

De esta manera yo sepa que no tiene una matriz de punteros - simplemente cada una dimensión de datos tras otro, comenzando desde el de la derecha, que supongo que es más rápido porque no hay más indirecciones

.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top