double arrow

Var «библиотечные переменные »

«Заголовки библиотечных процедур и функции»

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;

{При запуске программы перед выполнением её оперативного блока выполняются блоки инициализации сначала М2, М1, где присваивается переменным значения m,n,j}
End.

{основная программы М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, которая недоступна в основной программе


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



Сейчас читают про: