2009-10-05 14 views
5

私はC#からDelphi DLLのプロシージャを呼び出そうとしています。このプロシージャは、呼び出し側が事前に割り当ててarray of array of TSomeRecordを入力することを前提としています。その結果、結果を返す手段としてTSomeRecord要素を操作します。したがって、私は、Xの配列のデルファイ動的配列を手にする必要があります
ここで、I have found here動的array of Xは、動的配列の最初の要素へのポインタで構成され、最初の要素は参照カウントと長さ全部がメモリ内に次のように見えるように、要素は、インラインと連続して格納され、その付加配列の(32ビット整数)(要素の数):参照カウントRRRRとXの動的配列のDelphi動的配列のメモリレイアウトとは何ですか?

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

長さはllll、要素は0123、ポインタが指す場所は^です。これは傷つきます。私はそれを試して、それは動作します。

 
rrrrllll000011112222... 
     ^

:外寸法は、単に(へのポインタ)は等ダイナミックアレイの動的配列である私は、他の言葉で、array of XXためarray of Yを置換することができると仮定した多次元動的配列のため
ここで、要素0000,1111などは、独立に割り当てられた動的配列に対する32ビットポインタとなります。しかし、このようにすると、私のトラブルのアクセス違反が発生します。これは明らかに、デルファイが私にそれを期待している方法ではありません。誰も私にどのように説明することができますはこれを行う予定ですか?

答えて

8

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

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

つまり、ゼロ要素の配列がnilであることに加えて、大まかに言って正しいと思います。あなたが何をしているのか本当に分かっていない限り、あなたは参照カウントと長さを自分で変更してはならないことに注意してください。

クラッシュの原因を特定することは、サンプルコードなしでは難しくなります。 ALL自動化されたDelphiの型(widestringを除く)については、すべての動的メモリをdelphiのメモリマネージャによって割り当てる必要があることに注意してください。

あなたがインターフェイスしている言語のメモリマネージャを使用しようとする試みは不可能です。

+0

あなたの答えをありがとう。私はこれが(例)コードで診断する方が簡単かもしれないことに気付いていますが、私には何もありません。プロシージャの署名のみ。 DLLはサードパーティのブラックボックスです。 –

+0

それから、私が与えることができる唯一のアドバイスは、誰でも割り振る者がDelphiデルファイでDLLを割り当て解除するか、またはラップする必要があるという原則に固執することです。インターフェイスから自動化されたタイプを削除するexe(comserver)またはdll最初に –

0

言語ガイドは、(非常に便利な印刷マニュアルとして一度利用できる、オンラインヘルプでこの情報を見つけることは非常に困難である)状態:

を「多次元配列は、右端の次元が最初の増加に伴って保存されています。」

AFAIKにはポインタの配列がありません。各次元のデータが順番に並んでいます。一番右のものから順に、これ以上の回帰がないため、より高速です。

+0

LGフラグメントは静的な配列に関するものですが、質問は動的配列に関するものです。 –

+0

あなたはそうです。私はマニュアルをチェックしていますが、ダイナミック配列のメモリレイアウトは詳細ではありませんが、dynarrayは「非長方形」になる可能性があると私はそれを実現する唯一の方法は、アレイ。しかし、内部のものにアクセスするのはかなり遅いです。 –