Модули.

Лекция № 19

. . . . . . . . . .

Var

Za , Zb : ^ real;

k,f,g : Real;

Begin {главная программа}

New (Za) ; New (zb) ;

Za ^ : = 10.5 ; Zb ^ : = 15.2 ;

f : = Zb ^ + Za ^ ; { f = 25.7 }

Zb : =Za;

k : = Zb ^ + Za ^ ; { k = 21 !! }

 

4.12.4. Объявление указателей.

 

Как объявить указатели простых типов было показано выше. Для сложных типов указатели можно объявлять по разному. Обычно используют известный способ - в разделе типов объявляют идентификатор типа, который используют в разделе переменных.

Пример. Type Sm = Array[1..100] Of Integer;

Var Myk : ^ Sm ;

(можно и так Var PT : Array [1..20] Of ^Real; ).

 

4.12.5. Операции с указателями.

 

К динамическим переменным можно применять все операции, которые определены для обычных переменных соответствующих типов.

К самим указателям можно применять:

n операцию присваивания. В этом случае указатель получает значение адреса. Правило: указатели связанные операцией присваивания должны быть одного типа.

n операции сравнения = и <> .

Замечание - обращение к элементам массива Ms[k,n]^ , то есть символ ^ записывается после квадратных скобок.

Создание массива указателей For j : = 1 To N Do

New( Mp[j] );.

Параметром процедуры New() может быть только типизированный указатель. Для работы с нетипизированными указателями предназначены процедуры:

- GetMem(Z, Size) – для резервирования памяти;

- FreeMem(Z, Size) - для освобождения памяти.

Здесь Z – нетипизированный указатель; Size – размер (в байтах) резервируемой или освобождаемой динамической памяти.

 

Модуль - это отдельно компилируемая, специальным образом оформленная программная единица, которая может содержать описание типов данных, описание переменных процедуры и функции. Модуль - это мощное средство для создания библиотек прикладных подпрограмм.

Расположение модуля и ссылка на него.

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

Например, запись вида

Program Pm1;

Uses Mtx, Mfa ;

означает, что в программе Pm1 используется два модуля : Mtx и Mfa.

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

Структура модуля.

Unit <имя> ; - заголовок модуля

interface

. . . . . . . . . . . интерфейсная часть

implementation

. . . . . . . . . . . . исполняемая часть

initialization

. . . . . . инициирующая часть (необязательна)

finalization

. . . . . . . . . . завершающая часть

END.

Здесь Unit (единица) – зарезервированное слово; <имя> - имя модуля (формируется пр общим правилам); interface (интерфейс), implementation (выполнение), initialization (инициализация), finalization (завершение) – зарезервированные слова, открывающие соответствующие разделы модуля. Как видно из структуры модуль состоит из заголовка и четырех разделов любой из которых может быть пустым.

 

4.13.1. Составные части модуля.

Заголовок модуля состоит из ключевого слова UNIT и имени модуля. Имя формируется по общим правилам. Для правильной работы среды ТР имя модуля должно совпадать с именем дискового файла в котором располагается исходный текст модуля. Например, если заголовок модуля имеет вид

Unit Global ;

то текст модуля должен быть помещен в файл

Global . pas .

Модуль может использовать другие модули. Как и в случае главной программы, используемые модули объявляются с помощью ключевого слова Uses. Объявление используемых модулей может располагаться после зарезервированных слов interface и implementation.

Пример.

Unit MyMod;

interface

Uses ModA, ModB;

. . . . . . . . . . .

implementation

Uses ModC, ModD;

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

4.13.2. Интерфейсная секция.

Эта секция предназначена для связи модуля с программой, которая использует этот модуль. В ней можно указывать:

n модули, используемые данным модулем;

n константы , типы данных, переменные;

n заголовки процедур и функций.

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

При описании процедур и функций в интерфейсной секции записываются только заголовки процедур и функций.

 

4.13.3. Секция реализации (implementation).

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

При записи подпрограмм заголовки процедур и функций можно указывать без описания списка формальных параметров. Но если заголовок подпрограммы приводится в полном виде (со списком формальных параметров) он должен совпадать с заголовком, объявленным в интерфейсной секции. Запись текста подпрограммы без указания списка формальных параметров является плохим стилем программирования – использовать такой способ записи в серьезных программах не рекомендуется. Указание перечня формальных параметров непосредственно в заголовке подпрограммы облегчает чтение кода и понимание алгоритма.

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

Завершающая секция предназначена для указания операторов, которые выполняются после завершения работы основной программы (освобождение ресурсов, закрытие файлов). Если эти две секции пустые, то зарезервированные слова initialization и finalization не указываются.

Пример. Запишем модуль в котором:

n определяется константа МУ = 900;

n реализуется процедура (имя PV) перестановки двух переменных Р1 и Р2;

n реализуется функция (имя Мах) определения максимального значения из двух переменных Р3 и Р4.

n

Unit Prs;

Interface

Const My = 900;

Procedure Pv( Var P1, P2 : Integer);

Function Max (P3, P4 : Extended) : Extended;

Implementation

Procedure Pv( Var P1, P2 : Integer);

Var S : Integer;

Begin

S := P1 ; P1 : = P2 ; P2 : = S

End ; {конец процедуры PV}

Function Max (P3, P4 : Extended) : Extended;

Begin

If P3 >P4 Then Max : = P3

Else Max : = P4

End ; {конец функции Max}

END .

В процедуре Pv используется внутренняя переменная для запоминания значения переменной P1.

Пример программы использующей модуль PRS. Пусть в программе РХ надо поменять местами переменные К и М целого типа и вычислить переменную У как сумму переменной Z и максимального значения из переменных А и В. Фрагмент такой программы можно записать так

 

Program MOD;

Uses PRS ;

. . . . . . .

Var Y , A , B , Z : Real ;

K , M : Integer ;

. . . . . . .

Begin

. . . . . .

PV ( K , M ) ;

Y : = Z + MAX ( A , B ) ;

. . . . .

Вопрос ? Что будет если в модуле и программе определяются переменные с одинаковыми именами?

Правило. Если в модуле и программе, использующей этот модуль, объявляются одинаковые имена (переменные, константы, подпрограммы), то при использовании в тексте программы действует последнее объявление, то есть объявление в программе. Чтобы можно было использовать подобные имена из модуля необходимо записывать составное имя в виде

имя модуля . имя переменной

Пример.

Program USMOD ;

Uses PRS ;

Const My = 200 ;

Var Tk , Mz : Integer ;

Begin

. . . . . . .

Tk : = My + 25 ; {Tk = 225}

Mz : = Prs . My + 25 ; { Mz = 115 }