2016-09-18 11 views
0

配列項目が別の配列への参照であるか、Singleなどの他の型付き項目であるかをどのように判断できますか?配列項目が他の配列(多次元配列)への参照であるかどうかを調べる方法

配列を持つ次元の数に関係なく、動的多次元配列のすべての項目を反復する一様コードを作成したいので、これを検討しています。

そして、内側の次元を表す配列を反復的に反復する必要があるかどうか、またはすでに内側の次元にあるかどうかを判断するには、これが必要です。

私はRTTIに頼る必要があるかもしれないと思っていますが、これまでRTTIに関する経験はありません。

+4

のアイテムの種類をチェックするために使用することができます。 http://stackoverflow.com/a/554185/33732任意の次元の配列を扱う関数に型情報を渡す例については、RTLの 'SetLength'の実装を参照してください。 –

+0

@RobKennedy私が最初に探していたDelphi 6ではなく、デルファイのそれ以降のバージョンでは、私の答えで見ることができます。 – SilverWarior

答えて

0

私は、このための解決策を発見したが、それは、Delphiの新しいバージョン(デルファイ10シアトルデルファイ10.1にベルリンをテスト)でのみ利用可能であり、それは私がつまずい文書化されていない機能GetTypeKindに依存しています。

if GetTypeKind(SomeVariable) = tkArray then //Returns true if variable references to static array 

if GetTypeKind(SomeVariable) = tkDynArray then //Returns true if variable references to dynamic array 

それも、変数自体からその情報を発見する方法はありません内側の配列

var Dyn2DArray: Array of Array of Integer; 

if GetTypeKind(Dyn2DArray[0]) = tkDynArray then //Returns true since item of outmost array is references to inner array 

if GetTypeKind(Dyn2DArray[0,0]) = tkDynArray then //Returns false since inner array item is of integer type 
+0

それは単に 'TypeInfo(x)^。Kind'以外の何かをしますか?それは実際にその型を知らないあなたの関数から実際に動作しますか?私はあなたの実際のコードは型なしのvarパラメータとしてその入力を取得すると仮定します。上記のデモンストレーションは、あなたが必要なものを得るために宣言を見ることができるので、あなたがそれを必要としないケースです。 –

+0

@RobKennedy私の実際のコードでは、このGetTypeKindを使用して、配列項目が別の配列への参照かどうかを判断します。そうであれば、私はその配列を渡す関数を再帰的に呼び出します。これは、配列に含まれる次元数に関係なく、多次元配列のすべての項目を反復処理する関数を作成するための単なる一歩です。今は、プロシージャの引数として、多次元配列をどのように渡し、最も外側の配列を渡すのかを理解するだけです。 ... – SilverWarior

+0

...そして、私はembarcaderoフォーラムで質問を開きました。なぜなら、一般的に配列を定義するタイプは見つけられなかったので、もっと運があるかもしれないと思うからです。だから私はエンバカデロの人だけがそれが可能なのかどうかを知っていると思う。 – SilverWarior

関連する問題