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?

È stato utile?

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

.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top