Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Теория 9.doc
Скачиваний:
5
Добавлен:
05.05.2019
Размер:
349.7 Кб
Скачать

V: Variant; ; : rv.

I: Integer; ::::

Begin V := 'a280' ; . "

I := V;

End.

Выполнение такой прогг нием об ошибке: "Сс:1: into type (Integer " -Integer". Эта ошибка : вать строку в числовое ъ\ лить целое число именно

Правила трансформации выражениях приведены 5

Листинг 2.10. Пример безошибочного использования вариантной переменной

Program UsingVariants2; Var

V: Variant;

Правила изменения вариантных :■■

I: Integer; Begin V := v280' ;

I := V;

End.

(Описание вариантной переменной, тип переменной не определен} (Описание переменной типа String}

{Присвоение значения вариантной переменной V, переменной назначается строковый тип данных}

{Целочисленной переменной I присваивается значение вариантной переменной V. Значение переменной I становится равным 2 80}

Но значением переменной V могла бы быть не строка '280', а, напри­мер, строка ‘a28 0' — см. листинг 2.1.1.

Листинг 2.11. Пример возникновения ошибочной ситуации

Program UsingVariants3 ; Var

V: Variant;

I: Integer; Begin V := 'a280';

I := V;

End.

{Описание вариантной переменной, тип переменной не определен} (Описание переменной типа String}

{Присвоение значения вариантной переменной V, переменной назначается строковый тип данных}

{Ошибка времени выполнения — несоответствие типов, так как из строковой вариантной переменной невозможно выделить целочислен­ное значение}

Выполнение такой программы невозможно и будет прервано с сообще­нием об ошибке: "Could not convert variant of type (String) into type (Integer)" — "Невозможно- привести тип String к типу Integer". Эта ошибка появляется не из-за невозможности преобразо­вать строку в числовое значение вообще, а из-за невозможности выде­лить целое число именно из этой строки.

Правила трансформации вариантных значений при использовании их в выражениях приведены в табл. 2.5.

Правила изменения вариантных значений

Таблица 2.5

Тип переменной источника

Тип переменной-приемника

Целочисленные

Вещественные

Строковые

Логические

Целочисленные

без изменения

без изменения

Перевод в строку

0 -> False, иначе True

Вещественные

округление

без изменения

Перевод в строку

0 -> False, иначе True

Строковые

выделение числа с округлением

выделение числа

без изменения

"false" -> False "true" -> True

если можно выделить число:

0 -> False иначе True

Логические

False -> 'О' True -> '-1

False -> '0' True -> '-1

False -> '0' True -> '-1'

без изменения

Значение Unassigned

0

0

Пустая строка

False

Значение Null

Сообщение об ошибке

2.5.5. Вариантные массивы

Как было отмечено выше, значением вариантной переменной не может являться массив, описанный по обычным правилам. Однако Delphi пред­лагает специальный вариантный массив, который можно создать с по­мощью функции VarArrayCreate, описанной в модуле Variants:

Function VarArrayCreate(const Bounds: VarType: TVarType): Variant;

array of Integer;

Параметр Bounds является массивом целочисленных значений, каждая пара которых определяет пределы изменения индексов. Количество из­мерений массива, соответственно, определяется количеством пар значе­ний в этом массиве. Вместо массива, заданного переменной, можно ис­пользовать конструкцию следующего вида:

<А2, В2>,

<An, Bn>j

Вторым параметром задается тип элементов массива. При этом могут использоваться любые константы, приведенные в табл. 2.4, за исключе­нием varstring, однако для формирования массива строковых элемен­тов допустимо использование константы varOleStr.

Рис. 2.1. Непрямоугольный однородный массив (слева) и неоднородный массив (справа)

Заметим, что вне зависимости от количества измерений массива все его элементы имеют один и тот же тип, указываемый при вызове функции VarArrayCreate, но если в качестве типа элементов задать константу varVariant, то элементом вариантного массива будет также являться вариант.

Следовательно, такому элементу можно присвоить вариантный массив, причем тип его элементов также может быть произвольным. Таким об­разом, в Delphi появилась возможность создания неоднородных (состоя­щих из элементов разного типа) массивов, или, например, однородных массивов непрямоугольной формы.

Для получения информации о размерностях и индексации вариантных массивов в модуле Variants предусмотрены следующие функции:

♦ VarArrayDimCount — возвращает размерность заданного вариант­ного масива.

♦ VarArrayLowBound — возвращает нижнюю границу индексов за­данного вариантного массива для заданного измерения.

♦ VarArrayHighBound — возвращает верхнюю границу индексов за­данного вариантного массива для заданного измерения.

Описание этих функций выглядит следующим образом:

Function VarArrayDimCount(const A: Variant) : Integer; Function VarArrayLowBound(const A: Variant; Dim: Integer):

Integer; Function VarArrayHighBound(const A: Variant; Dim: Integer):

Integer;

Пример использования и тех, и других приведен в листинге 2.12.

Листинг 2.12. Работа с вариантными массивами

Var

V: Variant; {Описание вариантной переменной} LI, HI, L2, Н2: Integer;

{Описание четырех целочисленных переменных}

Begin

V := VarArrayCreate ([0, 5, 3, 8], varlnteger) ;

{Создание двухмерного вариантного массива целочисленных элементов, аналогичного по описанию массиву Array[0..5, 3..8] Of Integer}

LI := VarArrayLowBound(V, 1);

{Определение минимально возможного индекса элемента для первого измерения вариантного массива V и занесение его в переменную L1 (значение 0) }

HI := VarArrayHighBound(V, 1);

{Определение максимально возможного индекса элемента для первого измерения вариантного массива V и занесение его в переменную HI (значение 5) }

L2 := VarArrayLowBound(V, 2);

{Определение минимально возможного индекса элемента для второго измерения вариантного массива V и занесение его в переменную L2 (значение 3) }

Н2 := VarArrayHighBound(V, 2) ;

{Определение максимально возможного индекса элемента для второго измерения вариантного массива V и занесение его в переменную Н2 (значение 8) )

2.5.6. Разрушение вариантных переменных

При описании вариантной переменной, а также при создании вариант­ного массива выделяется некоторое количество оперативной памяти. В случае использования локальных вариантных переменных память возвра­щается системе при достижении программой конца области видимости переменной.

В случае глобальных переменных разрушение структур данных происхо­дит при присвоении новых значений вариантным переменным или при завершении программы. Это не всегда правильно, так как неиспользуе­мые глобальные переменные могут неоправданно занимать большой объем памяти, замедляя работу системы в целом. Для немедленного разрушения вариантной переменной предназначена процедура VarClear, по своему дей­ствию эквивалентная присвоению переменной значения Unassigned:

Procedure VarClear(V: Variant); Например:

Var