Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Универсальные типы - Variant




В переменных типа Variant могут храниться данные любого типа, кроме записей множеств, статических массивов, файлов, классов, ссылок на классы, указателей и Int64. Такие переменные занимают дополнительно два байта и содержат код типа и значение переменной или указатель на это значение. Работа с такими переменными требует больше машинного вре­ме­ни, и ошибки при несоответствии типов значений обнаруживаются толь­ко при выполнении, а не при компиляции программы.

При объявлении универсальным переменным присваиваются спе­циаль­ные значения константой Unassigned. Значение переменной Null оз­на­чает ошибочное значение переменной.

Тип текущего значения можно установить функцией VarType(x), которая возвращает значения, соответственно, в виде именованных кон­стант: varEmpty (состояние Unassigned), varNull (null), varSmallInt, varInteger, varSingle, varDouble, varCurrency, Date (TdateTime), varOLEStr (ссыл­ка на динамически размещенную строку UNICODE), varDispatch, varError (код ошибки операционной системы), varBoolean(WordBool), varUnknown (неизвестный тип), varByte, VarString, varTypeMask (битовая мас­ка для извлечения кода типа), varArray (ссылка на массив Variant), varByRef (ссылка на тип Variant).

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

Переменным типа вариант нельзя присвоить значение обычного статического массива. Для этого существуют функции VarArrayCreate, VarArrayOf:

VarArrayCreate (const Bound: array of Integer,VarType: <тип>): Variant;

Bound - массив пар целых чисел, каждая пара определяет нижнее и верхнее значение индекса одной размерности массива.

VarType - тип массива, равный константам с результатом работы функции VarType (п.1.1.6), кроме VarString, varArray, varRef.

Пример создания массива типа Variant из 6 целых чисел:

Var V: Variant; //объявление переменной типа Variant

V:=VarArrayCreate([0,5], varInteger); //создание массива

Пример создания массива типа Variant из 3 значений типа Variant:

Var M: Variant; //объявление переменной типа Variant

M:=VarArrayCreate([0,2], varVariant); //создание массива

M[0]:=’Иванов И.И.’; M[1]:=’04.05.70’; M[2]:=True; //присвоение значений

VarArrayOf (const Values: array of Variant): Variant;

Values - массив задает число и значения элементов в создаваемом массиве.

Пример. Продолжим предыдущий пример и создадим одномерный массив M[2] из четырех значений: 1,’Факт’, 12, 13:

M[2]:=VarArrayOf([1,'Факт',12,13]); //создание массива M[2] из 4 элементов Label3.caption:=m[2][2]; //вывод третьего значения 12 в метку Label3

Рассмотрим и другие полезные функции (п. 3.8).

VarArray Low/High Bound(x:Variant,N) ‑ возвращает нижнюю/верхнюю границу аргумента.

VarIsArray(x:Variant) ‑ возвращает True, если аргумент является массивом типа Variant.

VarIsNull(x:Variant) ‑ возвращает True, если аргумент равен Null (пустой).

Указатели

Указатель ‑ переменная, которая содержит значение адреса неко­торой другой переменной, структуры или объекта.

Типизированный указатель объявляется следующим образам:

Type < имя типа указателя> = ^ < идентификатор типа данных>;

Var <имя переменной ‑ указателя: <имя типа указателя>; или

Var <имя переменной ‑ указателя: ^ <идентификатор типа данных>.

При объявлении вместо ^<типа указателя> можно использовать специально определенные для указателей типы:

Pointer - нетипизированный указатель, который может указывать на данные любого типа (Var b: Pointer).

PAnsiString, PString - указатель на данные типа AnsiString (Var s: Pstring).

PCurrency (Currency), PExtended (Extended), POleVariant (OleVariant), PShortString (ShortString), PTextBuf (TextBuf), PVarRec (VarRec), PVariant (Variant), PwideString (WideString).

PbyteArray( ByteArray) и PwordArray (TwordArray) для доступа к динамически размещаемым массивам.

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

Если в выражении символ «^» находится справа от указателя, то это ‑ опе­­­рация разадресации: берется значение по этому адресу.

Запись вида @ <переменная>или Addr (<переменная>) означает взятие адреса указанной переменной.

Пример:

Type tu = PInteger; //объявление типа указателя, можно и TU=^Integer

Var a: tu; z1, z2: Integer; //объявление указателя A и переменных

Begin z1:=100; a:=Addr(z1); // можно A:=@Z1, адрес Z1 помещается в A

z2:=a^; //z2:=z1, т.е. z2=100.

End;

Обычно указатели используют для формирования динамических структур типов очередей, списков, стеков, когда число элементов этих структур заранее не известно (п.1.9).

Процедурные типы

Покажем на примере использование процедурных типов (п.1.3.9).

Type TSum=Function(A,B: Integer):Integer; //объявление процедурного типа

Var PSum: TSum; //объявление переменной ‑ указателя процедуры

PSum:=Sum; //переменной PSum присваивается описание процедуры Sum

X:=PSum(1,3); //обращение к функции Sum с аргументами 1, 3

Пример использования подпрограммы в качестве параметра:

Type Tfun=Function(X,Y:Integer):Integer; //объявление процедурного типа

Function Add(X,Y:Integer):Integer; Begin Result:=X+Y; End; //функция Add

Function Sub(X,Y:Integer):Integer; Begin Result:=X‑Y; End; //функция Sub

Function Fun(X,Y:Integer;Proc:Tfun):Integer; Begin Result:=Proc(X,Y); End;

Writeln(Fun(1,2,Add)); //сложение чисел 1+2=3

Writeln(Fun(1,2,Sub)); //вычитание чисел 1‑2=‑1

Для проверки наличия описания в переменной процедурного типа используется функция Assigned (<процедурная переменная>), которая возвращает True, если описание есть.

Процедурные указатели

Рассмотрим использование процедурных указателей на примерах.

Var X:Pointer; … X:=@Sum; //адрес начала процедуры Sum в X

Const U:Pointer=@Sum; //константа ‑ указатель на функцию Sum

Вопросы для самопроверки и контроля

Вопросы для самопроверки

1. Можно ли переносить на другую строку константы, разрывая их?

2. Верно ли написано имя переменной «План»?

3. В чем состоит отличие переменной от константы?

4. Каково назначение встроенных констант?

5. Что содержит указатель?

Контрольные вопросы

1. Какие типы данных хранятся в переменной типа Variant?

2. Должна ли переменная быть объявлена до ее использования?

3. Допускается ли массив записей?

4. Можно ли изменять размер динамического массива при выполнении программы?

5. Могут ли быть в программе одноименные глобальные и локальные переменные?

6. Что указывается в качестве уточнителя поля записи?

7. Что такое указатель‑переменная?

Операции

Арифметические операции

Сложение (+), вычитание (‑), умножение (*), деление (/), деление на ноль запрещено, целочисленное деление (Div), получение остатка от целочисленного деления (Mod, 11 Mod 5 = 1), замена знака значения переменной на противоположный (унарный минус).

Результат деления имеет всегда тип Extended. Для остальных опера­ций ‑ результат типа Extended, если один из операндов имеет тип Real, иначе ‑ Int64, если один из операндов имеет тип Int64 и Integer ‑ в остальных случаях.

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...