«Заголовки библиотечных процедур и функции»
Procedure P1(x:byte);
Procedure P1 (x:byte);
Function F1 (ch:char):byte;
……………..
Раздел реализации.
Этот раздел модуля начинается с ключевого слова Implementation. Этот раздел состоит из тел процедур и функций, заголовки которых объявлены в разделены объявлений. Процедуры и функции, в этом разделе должны описываться в той же последовательности, что и в разделе объявлений. Причем заголовки процедур и функций могут описываться в сокращенном виде, то есть без указания параметров, но если заголовок описывается полностью, то список формальных параметров должен совпадать со списками параметров, в разделе объявлений.
В этот разделе могут также описываться типы, константы, переменные, которые буду считаться локальными по отношению к этому модулю и не будут доступны из программы, подключающей этот модуль.
Если в процедурах необходимо использовать переменные, объявленные в других модулях, то иcпользуется директива Uses
В этом разделе могут быть описаны процедуры и функции, которые не были объявлены в интерфейсной части (в разделе объявление) раздела объявленный. Эти процедуры не будут доступны программе
|
|
, подключающей модуль, но будут доступны внутри модуля.
Unit modul_1;
Interface
….
Procedure P1 (x:byte);
Procedure P1 (x,y:byte);
Function f1 (ch:char):byte;
Implementation
Uses
Type «Локальные типы»
const «локальные константы»
Var
«локальные переменные»
Procedure P1;
Begin
«тело Р1»;
End;
Procedure P2;
Begin
«тело Р2»; «Библиотечные процедуры»
End;
Function F1;
Begin
«тело F1»;
End;
Procedure L1;
Begin «Локальная процедура»
End;
4. Раздел инициализации. Этот Раздел является завершающей частью модуля.Часто эта часть в модуле отсутствует тогда модуль завершается словом End..
Если же эта часть существует, то она начинается с ключевого Begin, после которого указываются операторы, составляющие фрагменты программы.
Эти операторы будут выполнятся перед выполнением программы, подключающей модуль. Обычно эта часть модуля используется для подготовки работы основной программы, в этой части инициализируются переменные, открываются (инициируются файлы) и т.д.
ЛЕКЦИЯ № 17
Модульность программ. Правила подключения модулей, загрузка в память, перекрытие библиотечных данных. Закольцованность модулей.
Компиляция модулей.
В отличие от программы, модуль нельзя запустить на выполнение как самостоятельную программу. Модуль компилируют не зависимо от программы, которая его использует. Компилировать модуль необходимо на диск, а не в память. После компиляции модуля создается файл с расширением.tpu и именем эквивалентным имени. раs-файла, в котором находится исходный текст модуля. После компиляции модуля можно запустить программу, которая его использует, но при этом необходимо в пункте Options, Directories,unit directorec указать путь где находится tрu-файл. после каждого изменения в тексте модуля его необходимо перекомпилировать.
|
|
Существует 3 типа компиляции:
1. Compile (alt-F9)
2. Make (F9)
3. Build – в меню ‘Compile’
1. Если компилировать программу в режиме Compile, в которой подключено ряд модулей uses M1, M2, то эти модули должны быть предварительно откомпилированы в tpu – файлы.
2. Если компилировать основную программу в режиме Make, то компилятор проверяй наличие Tpu – файлов для каждого модуля. Если какой – либо из файлов не обнаружен, то ищется одноименный файл с расширением.раs и если файл найден, то он компилируется. Таким образом если произведены изменения в раs-файле, то независимо от того есть ли в каталоге tpu – файл или нет, система осуществляет его компиляцию перед компиляцией основной программы.
3. В режиме Build существующие tpu – файла игнорируется и система пытается отыскать и откомпилировать соответствующие раs- файлы для каждого подключаемого к программе модуля. В этом случае можно быть уверенным, что учтены все сделаны изменения в модулях.
Подключение модулей
К основной программе модули подключаются в порядке их перечисления в директиве Uses, то есть с лева на право. В этом же порядке будут срабатываться и блоки инициализации. Блоки инициализации работают только при подключение модулей к основной программе.Если при подключение модуля к модулю, то инициализации не будет.
Под каждый подключенный к программе модуль в ОЗУ отводиться блок памяти. При чем, модуль в процессе выполнения программы находится в памяти даже если в программе не используется ни одной библиотечной процедуры модуля. Потому чем больше модулей подключаются к программе,тем больше памяти расходуется.
Порядок подключения модулей оказывает влияние на доступность библиотечных типов данных, переменных, процедур и функций. Библиотечныминазывают те типы переменных и подпрограмм, которые описаны в интерфейсных частях модуля. Они являются доступными в подключающих их программах и модулях.
Пусть модуль М1 и М2 в своих интерфейсных частях содержат такие одноименные элементы, как типы данных, переменные и подпрограммы и их реализуют по разному. Если в основной программе подключающий эти модули будет происходить обращение к этим элементам, то обращение будет эквивалентно обращению к элементам последнего из подключенных модулей М1, М2. Если такие же одноименные элементы описаны и в основной программе, то они перекрывают элементы модулей.
Это правило не обходимо учитывать для того чтобы гарантировать корректность обращения между модулями и основной программой.
В Паскале допускается возможность обращения к библиотечным типам данных, процедурам, функциям и переменным из основной программы непосредственно указывая к какому модулю они принадлежат.
«имя модуля». «имя типа»
«имя модуля». «имя переменой»
«имя модуля». «имя подпрограммы»
Пример построения модулей.
{Модуль М1, М1.pas M1.tpu }
Unit M1;
Interface
Type
M_type=Boolean;
Var
M,n:char;
Procedure add- (x1,x2:m_type; var rez:m_type);
Procedure mul_1 (x1,x2:m_type; var rez:m_type);
Procedure out_1 (rez:m_type);
Implementation
Uses crt;
Var
J:integer;
Procedure add_;
Begin
Rez:=x1or x2;
End;
Procedure Mul_1 (x1,x2:m_type; var rez:m_type);
Begin
Rez:=x1*x2;
End;
Procedure Out _1;
Begin
Write(rez);
Readkey;
End;
Begin
M:=’a’;
N:=’$’;
j:=1;
End.
{Модуль М2, М2.pas M2.tpu }
Unit M2;
Interface
Type
M_type=real;
Var
M,n:byte;
Procedure add- (x1,x2:m_type; var rez:m_type);
Procedure mul_2 (x1,x2:m_type; var rez:m_type);
Implementation
Uses crt;
Var
J:integer;
Procedure Out _1(rez:m_type);
Begin
Write(rez:4:2);
Readkey;
End;
Procedure add_;
Begin
Rez:=x1+x2;
Out_2(rez);
End;
Procedure Mul_2;
Begin
Rez:=x1*x2;
Out_2(rez);
End;
Begin
M:=22;
N:=1;
J:=2;
|
|
|
{основная программы М12.pas V12.exe }
Uses M2,M1;
Var
C:m_type; из М1 Boolean
C1:M2.M_type; из М2 Real
M:Boolean; переписывает м в М1и М2
Begin
M:=true;
Write (n); ‘$’ из М1
Write(M2.n); 1 из М2
Write(m); True из основной программы
Write(m1.m); ‘а’ из М1
Add_ (false,false,c); из М1
Out_1(c); false
M2.add_(2,2,c1); из М2 4.00
Mul_1 (true,false,c); из М1
M1.out_1(c); False из М1
Mul_2(2,3,c1); 6.00 изМ2
{недопустимые}
Write(j); - неизвестный идентификатор
Out_2(c1); - неизвестный индекс
Add_(false, true,c1); несовместимость типов
End.
Модули М1 и М2 имеют одноименный библиотечный тип M_type, переменные m,n, процедуру Add_. Переменная J- локальная. В модуле М2 локальной является процедура Out_2, которая недоступна в основной программе