2

如果类型未命名,AFAIK 编译器不会生成 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

您仍然可以使用内置函数HighLow. 让我们以示例类型为例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)

在后两者中,您可以在索引值中使用任何有效的索引。

于 2010-01-26T08:53:55.360 回答
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 回答