Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
4.13. Модули.
Модуль - это отдельно компилируемая, специальным образом оформленная программная единица, которая может содержать описание типов данных, описание переменных процедуры и функции. Модуль - это мощное средство для создания библиотек прикладных подпрограмм.
Расположение модуля и ссылка на него.
Модуль транслируется отдельно от программы и размещается в отдельном сегменте памяти. Для того чтобы можно было использовать в программе тот или иной модуль, необходимо указать его имя в разделе модулей, который располагается сразу после заголовка программы и обозначается ключевым словом 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. Интерфейсная секция.
Эта секция предназначена для связи модуля с программой, которая использует этот модуль. В ней можно указывать:
модули, используемые данным модулем;
константы , типы данных, переменные;
заголовки процедур и функций.
Все эти описания делаются по правилам языка ТР. Все, что указано в интерфейсной секции является видимым для программы, поэтому данные указанные в этой секции являются глобальными.
При описании процедур и функций в интерфейсной секции записываются только заголовки процедур и функций.
4.13.3. Секция реализации (implementation).
В этой секции размещаются тексты процедур и функций, объявленных в интерфейсной секции, а также здесь можно объявлять локальные для модуля объекты вспомогательные типы, константы, переменные и подпрограммы
При записи подпрограмм заголовки процедур и функций можно указывать без описания списка формальных параметров. Но если заголовок подпрограммы приводится в полном виде (со списком формальных параметров) он должен совпадать с заголовком, объявленным в интерфейсной секции. Запись текста подпрограммы без указания списка формальных параметров является плохим стилем программирования использовать такой способ записи в серьезных программах не рекомендуется. Указание перечня формальных параметров непосредственно в заголовке подпрограммы облегчает чтение кода и понимание алгоритма.
Инициализирующая секция предназначена для размещения операторов, которые выполняются до передачи управления основной программе и обычно используются для подготовки ее работы (например, инициализация переменных, открытие нужных файлов и т.п.)
Завершающая секция предназначена для указания операторов, которые выполняются после завершения работы основной программы (освобождение ресурсов, закрытие файлов). Если эти две секции пустые, то зарезервированные слова initialization и finalization не указываются.
Пример. Запишем модуль в котором:
определяется константа МУ = 900;
реализуется процедура (имя PV) перестановки двух переменных Р1 и Р2;
реализуется функция (имя Мах) определения максимального значения из двух переменных Р3 и Р4.
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 }
4.14. Типизированные константы
В Delphi (и в Турбо Паскале) можно использовать типизированные константы. В отличие от нетипизированных констант, объявляемых в разделе CONST, типизированные константы можно изменять в процессе выполнения программы. Фактически они представляют собой переменные, которые получают начальные значения до начала выполнения программы. В процессе выполнения программы им можно присваивать новые значения также как и обычным переменным соответствующего типа.
Замечание. Изменять значения типизированных констант можно во всех версиях Delphi, но в версиях 6 и 7 надо установить флажок Assignable typed constants на вкладке Project>options>compiler.
Типизированная константа приобретает указанное в ее объявлении значение только один раз до начала выполнения программы. При повторном входе в блок, в котором она объявлена, инициализация не производится и она сохраняет то значение, которое имела к моменту выхода из данного блока.
Типизированные константы объявляются в разделе Const. Форма объявления имеет вид
<идентификатор> : < тип> = <значение>
Здесь <идентификатор> - имя константы; < тип> -тип константы; <значение> - значение константы.
Пример. X : Extended = 1.25;
Max : Integer = 50;
Sm : char = 'Y' ;
St : String = '*****';
Правила. Нельзя использовать типизированные константы в качестве границ диапазона. Нельзя указывать в левой части список идентификаторов.
Следующие записи является ошибочными
Ms : Array [0 .. Max] of Extended;
M, N, J : Integer = 1;
При объявлении констант массивов список начальных значений элементов массива заключается в круглые скобки. Разделителем значений в скобках является символ "запятая".
Пример. Const
Msa : Array [1 . . 4 ] Of Integer = (0, 1, 2, 3);
При объявлении многомерных констант массивов самый правый индекс изменяется быстрее всего. Множество констант, соответствующих каждому измерению, заключается в дополнительные круглые скобки и отделяется от соседнего множества запятыми.
Пример.
Const
Msb : Array [ 1 .. 3, 1 .. 4 ] of Integer =
((1, 2, 3, 4),
(5, 6, 7, 8),
(9, 10, 11, 12));
Нетрудно заметить, что набор значений для двумерного массива располагается по строкам.