Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по Паскалю.doc
Скачиваний:
14
Добавлен:
04.11.2018
Размер:
7.76 Mб
Скачать

Взаимное использование модулей

Модули могут обращаться друг к другу косвенно или рекурсивно.

При косвенном использовании модулей один из них использует другой:

Unit A; Unit B;

Interface Interface

Uses B; .....

....... End.

End.

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

Uses CRT, A;

В этом случае нет необходимости указывать и модуль B:

Uses CRT, A, B;

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

Unit A; Unit B;

Interface Interface

Uses B; Uses A;

....... .......

End. End.

Если какой-нибудь из них подключить к программе:

Uses CRT, A;

то будет зафиксирована ошибка:

Error 68: Circular Unit Reference (A)

Взаимное использование возможно, если модули подключить из раздела реализации:

Unit A; Unit B;

Interface Interface

....... .......

Implementation Implementation

Uses B; Uses A;

....... .......

End. End.

Особенности выполнения инициирующих разделов

Если в модуле имеется инициирующий раздел, то его операторы выполняются до операторов программы, к которой данный модуль подключен. Если несколько модулей с инициирующими разделами:

Unit A; Unit B;

Interface Interface

Const x = 1; Const x = 2; x - глобальная

Implementation Implementation переменная

End. End.

подключены к программе:

Program Primer;

Uses WinCRT, A, B;

Begin

ClrScr;

WriteLn('x=', x);

End.

то они выполняются в порядке подключения, и одноименной переменной будет присвоено последнее значение. На экран будет выведено:

x=2

Последним подключен модуль B, в котором глобальная x = 2.

Изменим порядок подключения:

Program Primer;

Uses WinCRT, B, A;

Begin

ClrScr;

WriteLn('x=', x);

End.

В этом случае на экране появится:

x=1

так как в модуле A глобальная x = 1.

Если в программе необходим доступ ко всем переменным, в том числе и одноименным, из интерфейсов всех модулей, то указываются их составные имена, похожие на имена полей записей:

Program Primer;

Uses WinCRT, A, B;

Begin

ClrScr;

WriteLn('A.x=', A.x);

WriteLn('B.x=', B.x);

End.

На экран будет выведено:

A.x=1

B.x=2

Ссылки и динамические переменные

Между объектами реального мира, которые моделируются на компьютерах, существуют разнообразные, постоянно меняющиеся связи. Эти связи, как и сами объекты, могут появляться и исчезать. Поэтому если мы хотим описать в программе группу с переменным числом объектов, связи между которыми тоже подвержены изменениям, нужны соответствующие структуры. Эти структуры должны позволять устанавливать, изменять и разрывать связи между моделируемыми объектами, а также порождать или уничтожать сами объекты.

Для этой цели в Паскале используются ссылки и динамические переменные.

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

Однако при решении многих задач мы заранее, то есть на этапе написания программы, не знаем не только размера того или иного программного объекта (структуры данных), но и даже того, будет ли вообще нужен этот объект. Такого рода программные объекты или структуры данных, возникающие уже в процессе выполнения программы по мере необходимости, размер которых определяется или изменяется при ее выполнении, называются динамическими объектами или структурами.

В Паскале для работы с динамическими объектами предусматривается специальный тип данных – ссылки или указатели. Значениями этого типа данных являются ссылки на какой-либо программный объект. По этим ссылкам осуществляется непосредственный доступ к этому объекту. На машинном языке такая ссылка представляется указанием места в оперативной памяти (адреса ячейки памяти), в котором хранится значение соответствующего объекта.

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

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

Ссылки (указатели) можно описать в программе двумя способами.

При первом способе в разделе определения типов Type указывается имя типа ссылки, ставятся знаки = и ^ (карат), указывается тип переменных, к которому будет относиться эта ссылка:

Type TPntint = ^Integer;

TPntchar = ^Char;

TPntReal = ^Real;

В соответствии с этим описанием TPntint является типом ссылки на динамические объекты целого типа, TPntchar – динамические объекты символьного типа, TPntReal – динамические объекты вещественного типа. Сейчас можно описать переменные, значениями которых являются ссылки – переменные ссылочного типа: