5

C#からDelphiDLLのプロシージャを呼び出そうとしています。このプロシージャは、呼び出し元がを事前に割り当てて入力することを想定しており、その結果を返す手段として要素をarray of array of TSomeRecord操作します。TSomeRecordしたがって、Xの配列のDelphi動的配列を手作りする必要があります。
ここで、動的配列は動的配列の最初の要素へのポインターで構成され、その最初の要素には参照カウントと長さが含まれていることがわかりましたarray of X。 (要素の数)先頭に追加された配列(両方とも32ビット整数)、および要素がインラインで連続して格納されるため、全体がメモリ内で次のようになります。

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

rrrrを使用して、参照カウント、llllの長さ、0123の要素、および^ポインターが指す場所。これは裏付けられます。私はそれをテストしました、そしてそれは働きます。多次元動的配列の場合、inの
代わりに使用できると仮定しました。言い換えると、外側の次元は、次のように、動的配列(へのポインター)の動的配列にすぎません。 array of YXarray of X

rrrrllll000011112222..。
        ^

ここで、要素0000、1111などは、独立して割り当てられた動的配列への32ビットポインタになりました。ただし、このようにすると、問題が発生したためにアクセス違反が発生します。これは明らかに、Delphiが私にそれを期待する方法ではありません。誰かが私にこれを行うことになっている方法を説明できます

4

2 に答える 2

8

動的配列は、要素のパックされたブロックへのポインターです。

したがって、TSomeRecordの配列の配列は、ポインタの配列へのポインタであり、各ポインタは、length(array [firstlevel])要素を持つブロックメモリを指します。存在しない場合はnilを指します。

言い換えると、要素がゼロの配列はnilであることに加えて、あなたが想定していることは大まかに正しいということです。自分が何をしているのかを本当に理解していない限り、自分で参照数と長さを変更することは想定されていないことに注意してください。

サンプルコードがないと、クラッシュの原因を特定するのは困難です。すべての自動Delphiタイプ(ワイドストリングを除く)の場合、すべての動的メモリはdelphiメモリマネージャによって割り当てられる必要があることに注意してください。

インターフェースしている言語のメモリマネージャを使用してそれを試みることはできません。

于 2009-10-05T09:44:53.780 に答える
0

言語ガイド(かつては非常に便利な印刷されたマニュアルとして利用可能でしたが、現在はオンラインヘルプでこの情報を見つけるのは非常に困難です)は次のように述べています。

「多次元配列は、右端の次元が最初に増加するように格納されます。」

これにより、ポインタの配列がなくなります。右端から順に、各ディメンションデータが次々に表示されます。間接的なものがなくなるため、より高速になると思います。

于 2009-10-05T22:29:32.543 に答える