Учебник по программированию.

Первые шаги. Язык программирования PascalABC.

 

Предыдущий параграф Назад в содержание Следующий параграф


Глава IV. Модули. Программирование под ОС DOS.


§17. Модули.

До сих пор мы писали программы в одном текстовом файле. Когда нам нужна была процедура из другой программы, то мы просто её копировали. Такой подход не всегда удобен. Для того, что бы не копировать подпрограмму из одной программы в другую, существуют модули. Модуль это отдельный файл, в котором описаны процедуры и функции, и которые можно использовать в другой программе. Так же модуль можно использовать для того, что бы сделать код более читаемым. Если у вас в программе очень много подпрограмм, то их можно поместить в отдельный модуль. Что бы процедуры и функции из модуля были доступны в программе, модуль необходимо подключить к программе.

В простейшем виде модуль выглядит так же как и программа, только в место слова Program пишется слово Unit. Так же как и в обычной программе в модуле могут быть разделы описания переменных, констант, процедур и функций. Так же есть слова begin и end, между которыми находится тело модуля. В конце модуля, после слова end, должна стоять точка. Далее пример простейшего модуля:


Unit M;

procedure vivod;

begin

  writeln('Привет всем!');

end;

begin

  writeln('Модуль загрузился.');

end.


Название модуля (то что находится после слова Unit) должно совпадать с названием файла, в котором хранится модуль. Расширение такого файла должно быть PAS. После компиляции модуль будет содержаться в файле с расширением PCU. Для того, что бы подключить модуль к программе и иметь доступ ко всем его процедурам, функциям, константам и переменным используется слово Uses, после которого следует имя нужного модуля. Если необходимо подключить несколько модулей, то их имена перечисляются через запятую. Для того, что бы эти модули автоматически были найдены, они должны находиться в той же папке, что и программа, или в папке Lib, которая находится там же, где и PascalABC.NET. Пример:


Program Privet;

uses M;


begin

  vivod;

end.

__________________

Модуль загрузился.

Привет всем!


Обратите внимание, строчка «writeln('Модуль загрузился.');», находящаяся в теле модуля, никак не вызывается из основной программы, тем не менее она выполняется. Это потому, что тело модуля выполняется при подключении его к программе. Здесь можно произвести какие-либо подготовительные действия, например: загрузить драйвера или определить параметры компьютера. Если вам подобных действий производить не нужно, то тело модуля можно опустить. В таком случае в конце модуля должно просто находиться слово end с точкой. Далее этот же пример, но без тела модуля:


Unit M;

procedure vivod;

begin

  writeln('Привет всем!');

end;

end.

==========================

Program Privet;

uses M;


begin

  vivod;

end.

__________________________

Привет всем!


Здесь и далее строчка со знаками «равно» будет разделять тексты из различных файлов.

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


Unit M;

procedure vivod;

begin

  writeln('Процедура из модуля. Привет всем!');

end;

end.

==================================================

Program Privet;

uses M;

Procedure Vivod;

begin

  writeln('Процедура из программы. Привет всем!');

end;

begin

  Privet.vivod;

  M.vivod;

end.

__________________________________________________

Процедура из программы. Привет всем!

Процедура из модуля. Привет всем!


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

При полном синтаксисе модуля его структура выглядит следующим образом:


unit Imya_Modula;


interface


//раздел интерфейса


implementation


//раздел реализации


initialization


//раздел инициализации


finalization


//раздел финализации


end.


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

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

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

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

Раздел инициализации. Этот раздел подобен телу модуля в упрощённом синтаксисе. В нём происходит выполнение кода при загрузке модуля.

Раздел  финализации. Этот раздел выполняется при закрытии модуля.

Разделы инициализации и финализации можно опустить. При этом в конце модуля должно стоять слово end с точкой.

Перепишем модуль М в полном синтаксисе:


Unit M;

interface

procedure vivod;


implementation

procedure vivod;

begin

  writeln('Процедура из модуля. Привет всем!');

end;

initialization


  writeln('Модуль М загрузился');


finalization


  writeln('Модуль М выгрузился');

end.

==================================================

Program Privet;

uses M;

Procedure Vivod;

begin

  writeln('Процедура из программы. Привет всем!');

end;

begin

  Privet.vivod;

  M.vivod;

  readln;

end.

__________________________________________________

Модуль М загрузился

Процедура из программы. Привет всем!

Процедура из модуля. Привет всем!


Модуль М выгрузился


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

Один нюанс. В разделе реализации при описании процедур и функций можно не писать их передаваемые параметры, а просто указать имя и возвращаемый тип для функций. Это потому, что передаваемые параметры уже указаны в разделе интерфейса. Пример:


Unit Mat;

Interface

function summ(a,b:real):real;

implementation

function summ:real;

begin

  summ:=a+b;

end;

end.

=============================

uses Mat;

begin

  writeln(summ(2.3,3.4));

end

____________________________

5.7


В первом абзаце данного параграфа было сказано о некоторых предназначениях модуля. Есть ещё одно, причём основное, это возможность передавать процедуры и функции не в исходном коде, а уже в откомпилированном виде. Это очень удобно т.к. вы случайно не сможете изменить код подпрограммы, и вам не нужно задумываться над тем как она работает, вы просто будете ей пользоваться. Так же в уже откомпилированном виде будет сохранён секрет кода, если это необходимо.

В Pascal существует ряд готовых модулей, без которых не возможно представить себе программирование. Так, например, все процедуры и функции, которыми мы уже умеем пользоваться, и которые не были написаны нами, находятся в модуле System. Этот модуль подключается автоматически к любой программе, и его нет необходимости подключать вручную.

Так же есть модуль CRT, который необходим для работы с консольным окном или как написано в нём самом «Модуль для работы с консолью». Данный модуль мы рассмотрим в следующем параграфе.


В данном параграфе мы изучили модули и научились ими пользоваться.


Задача.

Создать функцию округления вещественного числа до нужной степени. Создать модуль Mat и поместить в него данную функцию. Так же поместить в этот модуль подпрограммы, созданные при решении 3 и 4 задач 14-ого параграфа. Создать программу, использующую данный модуль, и демонстрирующую работу данных функций.



Решение.

Решите эту задачу самостоятельно. Думаю, вы с ней легко справитесь.




Предыдущий параграф Назад в содержание Следующий параграф