2

タイプに名前が付けられていない場合、コンパイラは RTTI を生成しません。例: T = 整数の配列 [0..1,0..1]; この場合、配列の合計サイズを知ることはできますが、各次元のサイズを知ることはできません。

T01 = 0..1; という明示的な名前の型を使用する場合にのみ機能します。T = 整数の配列[T01,T01];

私は何かを逃した?

テストコード:

type
  t = array[0..1, 0..1] of Integer;

procedure test;
var
  i: PTypeInfo;
  d: TArrayTypeData;
begin
  i := TypeInfo(t);
  assert(i.Kind = tkArray);
  d := GetTypeData(i).ArrayData;
end;
4

2 に答える 2

1

はい、これは現在、生成される RTTI 情報の制限です。タイプ名が必要です。

次のようなものは機能しません。

var
 StrArray :  Array of String;

ただし、次のように動作します。

type
  TStrArray = Array of String;
var
  StrArray : TStrArray;

私は通常、切り替えた動的配列を切り替えて、system.pas ユニットで定義されている TArray の新しい構文を使用して、それらに名前があることを確認しました。

TArray<T> = array of T;

したがって、特定の問題の回避策は、その配列の型名を宣言することです。

type
  TMyArray = array[0..1, 0..1] of Integer;
var
  t : TMyArray;
于 2010-01-26T17:59:07.293 に答える
1

Highビルトインとを使用して、配列の次元を取得できますLow。type の例を見てみましょうarray[0..1,3..4] of Integer:

Low(T) // low bound of first range (0)
High(T) // high bound of first range (1)
Low(T[Low(T)]) // low bound of second range (3)
High(T[Low(T)]) // high bound of second range (4)

後者の 2 つは、インデックス値に任意の有効なインデックスを使用できます。

于 2010-01-26T08:53:55.360 に答える