Xの動的配列のデルファイ動的配列のメモリレイアウトとは何ですか?

StackOverflow https://stackoverflow.com/questions/1519016

  •  19-09-2019
  •  | 
  •  

質問

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

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

参照カウントRRRRと、長さ、0123素子、及び^ポインタが指すLLLL。これはアウトクマ。私はそれをテストしているし、それが動作します。

:多次元動的配列のために、私は、外側寸法が(へのポインタ)動的配列、そうなどの動的配列は、単純である言い換えれば、array of YXためarray of Xを置換することができると仮定しています
rrrrllll000011112222...
        ^

ここで、要素0000、1111など今独立にダイナミックアレイを割り当てする32ビット・ポインタです。このようにそれをやって、しかし、私は私の悩みのために、アクセス違反を稼いでいます。これは、Delphiは、私はそれを行うことを期待かは明らかではありません。誰もが、私はどのように私に説明することができますの午前のこれを行うことになって?

役に立ちましたか?

解決

ダイナミックアレイは、要素のパックされたブロックへのポインタである。

そこでTSomeRecordの配列の配列はいずれも存在しない場合の長さ(配列[第1レベル])要素、又はゼロでブロックメモリを指す各々がポインタの配列へのポインタです。

言い換えれば、何を仮定すると、ゼロ要素を持つアレイがゼロであることを加えて、概ね正しいです。あなたは、あなたが本当に何をしているか知っている限り、参照カウントと長さを自分で変更することになっていないことに注意してください。

あなたのクラッシュの原因を決定することは、サンプルコードなしでは難しいでしょう。 (は、widestring除く)のすべてのの自動化されたDelphiの種類に関しては、すべての動的メモリは、Delphiメモリマネージャによって割り当てられなければならない、ということ。

を覚えておいてください あなたは可能ではないとのインターフェイスされているどんな言語のメモリマネージャを使用した場合と、

試みます。

他のヒント

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

「多次元配列は右端寸法が最初の増加と共に記憶される。」

これにより私の知る限り、あなたはポインタの配列ではない持っている - 別の後に、単純に各ディメンションデータ1、右端の1から始まるが、私はより多くの間接をありませんので、それは速いですね。

scroll top