Qual è il layout di memoria di un array dinamico Delphi di matrice dinamica di X?
-
19-09-2019 - |
Domanda
Sto cercando di chiamare una procedura in una DLL Delphi da C #. La procedura prevede il chiamante per preallocare e inserire un array of array of TSomeRecord
, di cui sarà poi manipolare gli elementi TSomeRecord
come mezzo di restituire i risultati. Così, ho bisogno a portata di mano-craft matrici dinamiche Delphi di array di X.
Ora, ho trovato qui che un array of X
dinamico costituito da un puntatore al primo elemento della matrice dinamica, e che tale primo elemento ha un conteggio di riferimento e la lunghezza (numero di elementi) della matrice anteposto (entrambi interi a 32 bit), e che gli elementi sono memorizzati in linea e contiguo, in modo che il tutto si presenta come questo in memoria:
rrrrllll000...000111...12... ^
con rrrr il conteggio di riferimento, llll la lunghezza, 0123 gli elementi, e ^ cui punta il puntatore a. Questo porta fuori; Ho testato e funziona.
Per array dinamici multidimensionali ho assunto che può sostituire array of Y
per la X
in array of X
, in altre parole che la dimensione esterna è semplicemente un array dinamico di (puntatori a) array dinamici, in questo modo:
rrrrllll000011112222... ^
dove gli elementi 0000, 1111 ecc sono ora 32 bit puntatori al assegnate indipendentemente matrici dinamiche. Facendo in questo modo, però, mi fa guadagnare una violazione di accesso per i miei guai. Questo non è apparentemente come Delphi mi aspetta a farlo. Qualcuno può spiegare a me come I am dovrebbe fare questo?
Soluzione
Un array dinamico è un puntatore a un blocco ricco di elementi.
Così array di array di TSomeRecord è un puntatore a un array di puntatori, ciascuno dei quali indica un blocco di memoria con lunghezza elementi (array [FirstLevel]), o nullo se ce ne sono.
In altre parole, quello che presumo sia o meno corretta, con l'aggiunta che array con zero elementi sono pari a zero. Si noti che è non si dovrebbe cambiare contatore di riferimento e la lunghezza da soli se non si sa realmente che cosa si sta facendo.
Determinare quali sono le cause crash sarà difficile senza esempio di codice. Tenete a mente che, come per tutti tipi automatizzati Delphi (eccetto WideString), tutta la memoria dinamica deve essere allocata dal gestore della memoria Delphi.
I tentativi di che utilizzando il gestore della memoria di qualsiasi lingua cui si è interfacciati a non è possibile.
Altri suggerimenti
La Guida linguistica (una volta disponibile come manuali stampati molto utili, ora trovando queste informazioni nella guida in linea è molto difficile) afferma:
"Un array multidimensionale è memorizzato con la dimensione più a destra crescente prima."
In tal modo per quanto ne so non si dispone di un array di puntatori - semplicemente ogni Dimension Data una dopo l'altra, a partire da quella più a destra, credo che sia più veloce perché non ci sono più indirections
.