Массивы типа Variant

Begin

N:= 3; m:= 1;

SetLength(arrMatr, N);

For i:= 0 To N-1 Do Begin

SetLength(arrMatr[i], N-i);

For j:= 0 To N-i-1 Do Begin

arrMatr[i, j]:= m;

Inc(m);

End;

End;

End;

В результате выполнения этого фрагмента формируется логическая структура, показанная на рисунке 5.2

Рисунок 5.2 - Логическая структура динамической матрицы arrMatr,
содержащей строки различных размеров

Физическая структура массива приводится на рисунке 5.3. Как показывает этот рисунок, для всего массива в сегменте статических данных для массива выделяется 4-хбайтовая ячейка, в которую помещается указатель (адрес) на вектор (arrMatr[0], arrMatr[1], arrMatr[2]), элементы которого располагаются в куче, занимая последовательные 4-хбайтовые ячейки. В этих ячейках содержатся ссылки на слоты соответствующих строк, а сами слоты размещаются в куче в непредсказуемом «порядке». Элементы каждой строки располагаются в слотах строки последовательно друг за другом. В ячейки элементов заносятся из значения.

Рисунок 5.3 - Физическая структура динамической матрицы arrMatr,
содержащей строки различных размеров

Переменной типа Variant, как указывалось в п. 3.3.10, нельзя присвоить значение обычного статического массива. Это можно сделать только с помощью специальных функций VarArrayCreate и VarArrayOf.

Функция VarArrayCreate определена следующим образом:

Function VarArrayCreate(Const Bounds: Array Of Integer;
VarType: Integer);

Здесь параметр Bounds является массивом, содержащим четное количество целых чисел, каждая пара которых определяет диапазон индекса, соответствующего паре. Параметр VarType определяет тип элементов массива. Он может принимать такие значения, как, например, varInteger, varDouble или varString - соответствие таких значений и определяемых ими типов приводится в пособиях по Object Pascal. Например, для создания вектора V1 из девяти элементов целого типа и матрицы V2 типа Double (размерности 4´6), можно воспользоваться следующими операторами:

Var V1, V2: Variant;

...

V1:= VarArrayCreate([2, 10], varInteger);

V2:= VarArrayCreate([0,3, 0,5], varDouble);

Пример создания и использования массива типа Variant дают следующие строки:

Var A: Variant;

...

A:= VarArrayCreate([0, 2], varVariant);

A[0]:= 12e-6;

A[1]:= 20;

A[2]:= 'Количество = ' + IntToStr(A[1]);

ShowMessage(A[1]); ShowMessage(A[2]);

Label1.Caption:= A[2];

Функция VarArrayOf возвращает одномерный массив элементов, задаваемый параметром Values, и имеет следующий интерфейс:

Function VarArrayOf(Const Values: Array Of Variant): Variant;

Например, можно «превратить» элемент A[2] из вышеприведенного примера в вектор с помощью операторов:

A[2]:= VarArrayOf([-1.5, ’Параметр = ’, 20]);

ShowMessage(A[2][1] + IntToStr(A[2][2]));


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: