Модули.
Лекция № 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 }