нет RTTI для неименованных типов данных

Насколько мне известно, компилятор не генерирует 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;

person Henri Gourvest    schedule 26.01.2010    source источник


Ответы (2)


Вы по-прежнему можете получить размеры массива, используя встроенные функции High и Low. Возьмем пример типа 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)

В последних двух вы можете использовать любой допустимый индекс в значении индекса.

person Kornel Kisielewicz    schedule 26.01.2010
comment
Я говорю о новом RTTI в Delphi 2010... Вы уверены, что поняли мой вопрос? - person Henri Gourvest; 26.01.2010
comment
@ Генри: Да, я имею в виду, что вам не нужен RTTI для этой задачи. Если вы настаиваете на интерфейсе RTTI (почему?), то понятия не имею. - person Kornel Kisielewicz; 26.01.2010
comment
потому что я автор суперобъекта, анализатора json: progdigy.com/?page_id=6 Я использую RTTI для автоматической сериализации нативных типов в json. - person Henri Gourvest; 26.01.2010
comment
Для типов массивов для получения RTTI (с использованием модуля typeinfo) вы можете использовать только динамические массивы (tkDynArray). Все остальные типы массивов отключены. - person Ritsaert Hornstra; 26.01.2010
comment
tkArray доступен и работает, я добавил тестовый код в свой вопрос - person Henri Gourvest; 26.01.2010

Да, в настоящее время это ограничение генерируемой информации RTTI, у вас должно быть имя типа.

Такие вещи не будут работать:

var
 StrArray :  Array of String;

Но будет работать следующее:

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

Обычно я переключал свои переключаемые динамические массивы на использование нового синтаксиса TArray, который определен в модуле system.pas as, чтобы убедиться, что у них действительно есть имена.

TArray<T> = array of T;

Таким образом, обходным путем для вашей конкретной проблемы было бы объявить имя типа для этого массива.

type
  TMyArray = array[0..1, 0..1] of Integer;
var
  t : TMyArray;
person Robert Love    schedule 26.01.2010