2009-10-05 23 views
5

Estoy tratando de llamar a un procedimiento en una DLL de Delphi desde C#. El procedimiento espera que la persona que llama preasigne e ingrese un array of array of TSomeRecord, del cual manipulará los elementos TSomeRecord como medio para devolver los resultados. Por lo tanto, tengo que crear manualmente matrices dinámicas de Delphi de matrices de X.
Ahora, I have found here 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 números 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:¿Cuál es el diseño de memoria de una matriz dinámica Delphi de una matriz dinámica de X?

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

con rrrr la cuenta de referencias , llll la longitud,los elementos y^a donde apunta el puntero. Esto confirma; Lo he probado y funciona.
Para matrices dinámicas multidimensionales he asumido que puedo 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. ahora son punteros de 32 bits para matrices dinámicas asignadas de forma independiente. Sin embargo, hacerlo de esta manera me genera una infracción de acceso a mis problemas. Aparentemente, no es así como Delphi espera que lo haga. ¿Alguien puede explicarme cómo se supone que debo hacer esto? am

Respuesta

8

Una matriz dinámica es un puntero a un bloque de elementos empaquetados.

Así que la matriz de matriz de TSomeRecord es un puntero a una matriz de punteros, cada uno de los cuales apunta a una memoria de bloque con elementos de longitud (matriz [primer nivel]), o nula si no hay ninguno.

En otras palabras, lo que asumes es más o menos correcto, con la adición de que las matrices con cero elementos son nulas. Tenga en cuenta que no debe cambiar el recuento de referencias y la longitud usted mismo a menos que realmente sepa lo que está haciendo.

Determinar las causas de su bloqueo será difícil sin un código de ejemplo. Tenga en cuenta que, como para TODOS tipos automatizados de Delphi (excepto en banda ancha), toda la memoria dinámica debe ser asignada por el administrador de memoria delphi.

Se intenta utilizar el administrador de memoria de cualquier idioma con el que esté interactuando.

+0

Gracias por su respuesta. Me doy cuenta de que esto podría ser más fácil de diagnosticar con código (ejemplo), pero no tengo ninguno; solo la firma del procedimiento. La DLL es una caja negra de terceros. –

+0

Entonces, el único consejo que puedo darle es que siga el principio de que quien lo asigne también debe desasignar, o envolver la DLL en Delphi a delphi.exe (comserver) o dll primero que elimina los tipos automáticos de la interfaz –

0

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) afirma:

"una matriz multidimensional se almacena con la dimensión más a la derecha cada vez mayor en primer lugar."

De esta manera, AFAIK no tiene una matriz de punteros, simplemente cada uno de los datos de cota, comenzando por el más a la derecha, supongo que es más rápido porque no hay más indirecciones.

+0

El fragmento de LG trata de arreglos estáticos, mientras que la pregunta es acerca de las matrices dinámicas. –

+0

Tienes razón. He revisado el manual y aunque el diseño de memoria de las matrices dinámicas no está detallado, dice que dynarray puede ser "no rectangular", y supongo que la única forma de lograrlo es tener una matriz dinámica análoga como elementos del "exterior" formación. Bastante lento para acceder a los interiores, sin embargo. –

Cuestiones relacionadas