Листинг 2.7. Пример работы с типизированной ссылкой

Program UsingTypedPointers; Type

pDouble= "Double;

Var

MyPDouble: pDouble;

{Описание типа данных — указателя на переменную типа Double}

(Описание переменной — типизированного указателя на переменную типа Double}

Begin

New(MyPDouble);

{Выделение места в динамической памяти под одну переменную типа Double (размер необходимой памяти определяется автоматически) , адрес выделенной памяти заносится в переменную MyPDouble}

MyPDoubleA= 12.8;

{Присвоение переменной, на которую ссылается переменная-указатель значения 12.8}

Dispose(MyPDouble);

{Освобождение памяти, занятой под переменную, на которую указывает переменная MyPDouble. Адрес освобожденной памяти остается в переменной MyPDouble, но его использование недопустимо} End.

2.4.3. Динамические массивы

В Delphi добавлена интересная возможность описания массивов без ука­зания размерностей и, соответственно, пределов изменения индексов:

Var

IntArray: Array OfInteger;

Такие массивы являются динамическими6 и изначально имеют нулевую длину. Установка размера массива и определение его во время выполне­ния программы производится так же как и для строк, с помощью функ­ций SetLength и Length, соответственно. Элементы в данном случае ну­меруются от нуля.

Program UsingDynamicArraysl; Var

А, В: Array of Integer;

{Описание двух переменных — динамических массивов целочисленных элементов}

Begin

SetLength(A, 5)

А[0]:= 1;

End.

{Установка размера массива А (5 элементов)}

{Присвоение значения I элементу массива А с номером 0}

Заметим, что в Turbo Pascal также существовала возможность использования динамических массивов через типизированные указатели, под которые память выделяется процедурой FreeMem, а не New. Однако о безопасности использования таких структур должен был заботиться программист. Также неудобства доставляла необходимость указания размерностей таких массивов и ограничение максимального числа элементов. В Object Pascal реализована более удобная схема работы с динамическими массивами.

Листинг 2.7. Пример работы с типизированной ссылкой - student2.ru

Вариантные структуры данных

2.5.1. Общие понятия

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

Однако при программировании под Windows довольно часто встречают­ся задачи, в которых переменные должны изменять свой тип во время выполнения программы, соответственно, нельзя на этапе написания про­граммы указать, какого именно типа должна быть та или иная перемен­ная. В основном такие возможности требуются от программы, работаю­щей с базами данных и использующей технологию СОМ.

В Delphi введена поддержка переменных, которые не имеют конкретно­го типа данных на этапе компиляции, а в процессе выполнения програм­мы могут хранить данные разных типов. Такие переменные называются вариантными (англ. Variant — вариантный, различный) и описываются по обычным правилам с указанием в качестве типа данных ключевого сло­ва Variant:

Var

<Назвак/!е

леременной>: Variant;

Во время выполнения программы в вариантных переменных могут хра­ниться данные любого типа, за исключением структурных (записей и статических массивов) и ссылочных (типизированные и нетипизирован-ные указатели, метаклассы и указатели на экземпляры классов7). Также в вариантных переменных не могут находиться значения множественных типов данных. Неинициализированной переменной автоматически при­сваивается специальная константа Unassigned,описанная в модуле

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

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

Наши рекомендации