Модуль в паскале как пишется

Модуль (unit) представляет собой набор констант, типов данных, переменных, процедур и функций. Каждый модуль аналогичен отдельной программе на Паскале: он может иметь основное тело, которое вызывается перед запуском Вашей программы и осуществляет необходимую инициализацию. Короче говоря, модуль представляет собой библиотеку описаний, которую можно вставить в свою программу и которая позволит разбить программу на части, компилируемые отдельно.

Турбо-Паскаль обеспечивает Вам доступ к большому числу встроенных констант, типов данных, переменных, процедур и функций. Некоторые из них специфичны для Турбо-Паскаля; другие специфичны для персонального компьютера РС фирмы IBM (и совместимых с ним компьютеров) или для операционной системы MS-DOS. Их количество велико, однако, в своей программе Вы редко используете их все сразу. Поэтому они разделены на связанные группы, называемые модулями. В этом случае Вы можете использовать только те модули, которые необходимы в программе.

Структура модуля

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

Структура модуля аналогична структуре программы, однако есть несколько существенных различий. Например, рассмотрим модуль:

unit <идентификатор>;
interface
uses <список модулей>; {Необязательный}
{открытые описания}
implementation
{закрытые описания процедуры и функции }
begin
{код инициализации }
end.

Заголовок модуля начинается зарезервированным словом unit, за которым следует имя модуля (идентификатор) точно так же, как и в случае имени программы. Следующим элементом в модуле является ключевое слово interface. Оно обозначает начало секции интерфейса модуля — секции, видимой всем другим модулям или программам, в которых он используется.

Модуль может использовать другие модули, для этого они определяются в предложении uses. Предложение uses, если имеет место, то следует сразу после ключевого слова interface. Отметим, что здесь выполняется общее правило использования предложения uses: если модуль, имя которого указано в предложении uses, использует другие модули, то имена этих модулей также должны быть указаны в предложении uses, причем до того, как они будут использованы.

Стандартные модули

Turbo

Файл TURBO.TPL содержит все стандартные пакеты, кроме Graph и пакетов совместимости (Graph3 и Turbo3): System, Overlay, Crt, Dos и Printer. Эти пакеты загружаются в память вместе с Турбо-Паскалем и всегда вам доступны. Обычно файл TURBO.TPL хранят в одном каталоге с TURBO.EXE (или TPC.EXE). Вы можете хранить его и в другом каталоге, если он описан как каталог Турбо-Паскаля. Для этого необходимо с помощью TINST.EXE установить этот каталог в файле TURBO.EXE.

System

Используемые пакеты: нет

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

Dos

Используемые пакеты: нет

DOS определяет многочисленные паскалевские процедуры и функции, которые эквивалентны наиболее часто используемым вызовам DOS, как например, GetТime, SetТime, DiskSize и так далее. Кроме того, он определяет две программы низкого уровня МsDos и Intr, которые позволяют активизировать любой вызов MS-DOS или системное прерывание. Registers представляет собой тип данных для параметра в МsDos и Intr. Кроме того, определяются некоторые другие константы и типы данных.

Overlay

Используемые пакеты: нет

Overlay — содержит инструменты для создания оверлейных программ. Программа OVERKAY — программа, которая загружается не вся , а по частям.

Crt

Используемые пакеты: нет

Crt обеспечивает набор специфичных для РС описаний констант, переменных и программ для операций ввода/вывода. Последние можно использовать для работы с экраном (задание окон, непосредственное управление курсором, цвет текста и фона). Кроме того, Вы можете осуществлять «необработанный» ввод с клавиатуры и управлять платой генерации звукового сигнала персонального компьютера. Этот модуль обеспечивает множество подпрограмм, которые были стандартными в версии 3.0.

Printer

Используемые пакеты: Crt

В модуле Printer дано описание переменной текстового файла Lst, которая связывается с драйвером устройства, позволяющим направлять стандартный для Паскаля вывод на печатающее устройство с помощью Write и Writeln. Например, включив Printer в свою программу, Вы можете сделать следующее:

Write(Lst,'Сумма ',A:4,' и ',B:4,' равна ');
C:=A + B;
Writeln(Lst,C:8);

Graph3

Используемые пакеты: Crt

Graph3 поддерживает полный набор графических подпрограмм для версии 3.0 — для обычной, расширенной графики и графики, использующей относительные команды. Они идентичны по имени, параметрами функции подпрограммам версии 3.0.

Turbo3

Используемые пакеты: Crt

Этот модуль содержит две переменные и несколько процедур, которые больше не поддерживаются Турбо-Паскалем. Они включают встроенную файловую переменную Кbd, булеву переменную CBreak и первоначальные целочисленные версии MemAvail и MaxAvail (которые возвращают размер свободной памяти в параграфах, а не в байтах, как это делают настоящие версии).

Graph

Используемые пакеты: Crt

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

Этот модуль реализует независимый от устройства графический драйвер фирмы «Борланд», позволяющий поддерживать графические адаптеры типа СGА, ЕGА, Hercules, АТТ 400, МСGА, 3270 РС и VGА.

Написание собственных модулей

Допустим, Вы написали модуль IntLib, записали его в файл INTLIВ.PAS и оттранслировали на диск; получившийся в результате код находится в файле INTLIВ.ТРU. Для использования этого модуля в программе необходимо включить в нее оператор uses, указывающий компилятору, какой модуль используется. Ваша программа может выглядеть следующим образом:

program MyProg;
uses IntLib;

Отметим, что Турбо-Паскаль предполагает, что файл, в котором находится модуль, имеет такое же имя, что и сам модуль. Если имя Вашего модуля МyUtilities, то Турбо-Паскаль будет искать файл с именем МYUTILIТ.PAS.

Компиляция модуля

Модуль компилируется точно так же, как компилируется программа: он создается с помощью редактора, а затем вызывается команда Соmpile/Соmpile (Компилировать/ Компилировать) (или нажимаются клавиши Аlt-С). Однако, вместо файла с расширением .ЕХЕ Турбо-Паскаль создает файл с расширением .ТРU (Turbо Раscal Unit — модуль Турбо-Паскаля). После этого Вы можете оставить этот файл как есть или же вставить его в ТURВО.TPL с помощью TPUMOVER.ЕХЕ.

В любом случае имеет смысл переслать файлы с расширением *.ТРU (вместе с исходными файлами) в каталог модулей, который определен с помощью команды О/D/Unit directories (Каталоги модулей). В одном исходном файле может находиться только один модуль, поскольку компиляция прекращается, как только обнаружен завершающий оператор end.

Пример:

Напишем небольшой модуль. Назовем его IntLib и вставим в него две простые подпрограммы для целых чисел — процедуру и функцию:

unit IntLib;
interface
procedure ISwap(var I,J: integer);
function IMax(I,J: integer): integer;
implementation
procedure ISwap;
var
Temp: integer;
begin
Temp:=I;
I:=J;
J:=Temp
end; {конец процедуры ISwap }
function IMax;
begin
if I > J then IMax:=I else IMax:=J
end; {конец функции IMax }
end. {конец модуля IntLib }

Введем эту подпрограмму, запишем ее в файл INTLIВ.PAS, а затем оттранслируем на диск. В результате получим код модуля в файле INTLIВ.ТРU. Перешлем его в каталог модулей. Следующая программа использует модуль IntLib:

program IntTest;
uses IntLib;
var
A,B: integer;
begin
Write('Введите два целочисленных значения: ');
Readln(A,B);
ISwap(A,B);
Writeln('A=',A,' B=',B);
Writeln('Максимальное значение равно ',IMax(A,B));
end. {конец программы IntTest }

Все описания внутри модуля связаны друг с другом. Например, модуль Crt содержит все описания, необходимые для подпрограмм работы с экраном на Вашем персональном компьютере.

Модули в Паскале по отношению к основной части программы напоминают подпрограммы (процедуры и функции). Но по определению они являются самостоятельными программами, ресурсы которых могут быть задействованы в других программах. Кроме того описание модулей происходит вне вызывающего приложения, а в отдельном файле, поэтому модуль – это отдельно компилируемая программа. Файл скомпилированного модуля (именно такой нужен для использования) будет иметь расширение предусмотренное средой программирования (например, .tpu, .ppu, .pcu).

Модули создаются, как правило, для обеспечения компактности кода, о чем приходиться заботиться крупным проектам. Стоит также отметить, что использование модулей в каком-то смысле снимает ограничение на сегментацию памяти, так как код каждого модуля располагается в отдельном сегменте.

Структура модуля выглядит так:

Unit <имя модуля>;
Interface
  <интерфейсная часть>
Implementation
  <исполняемая часть>
Begin
  <инициализация>
End.

Далее мы поочередно рассмотрим каждый из данных разделов.

Имя модуля (Unit)

Имя модуля, следующее после ключевого слова Unit, должно совпадать с названием файла (без .pas), в котором находиться его код. Также с помощью имени, модуль подключается к другому модулю, либо к основной программе. Для этого необходимо указать служебное слово Uses, и перечислить через запятую список подключаемых модулей:

Uses <список имен модулей>;

<h3>Интерфейсная часть (Interface)

В интерфейсной части описываются заголовки объектов, к которым будут иметь доступ другие модули и программы. Это константы, типы, переменные и подпрограммы. Например, так может выглядеть интерфейсная часть модуля Search, содержащего в себе алгоритмы поиска элементов в массиве.

unit Search;
Interface
type arr = array[1..5] of integer;
var s: string;
procedure binary_search(x: integer; Ar: arr; var s: string);
procedure line_search(x: integer; Ar: arr; var s: string);

Для объявления данного модуля, в программе нужно указать его имя:

Uses Search;

После чего станет возможным использование всех описанных в интерфейсной части объектов.

Исполняемая часть (Implementation)

Начинается этот раздел со слова Implementation (реализация). Именно здесь нужно описать подпрограммы, объявленные в интерфейсной части. При этом в их заголовках разрешается не указывать формальные параметры, иначе они должны полностью совпадать с таковыми в интерфейсной части. Кроме этого, интерфейсная часть может содержать локальные (недоступные вызывающей программе) для модуля объекты.
Инициирующая часть

Инициирующая часть начинает свою работу до начала выполнения основной программы. В ней (между Begin и End), как правило, описываются операторы, предназначенные для разного рода вспомогательной работы. Данная часть может отсутствовать, либо не иметь в себе никакого кода. В первом случае нужно указать End с точкой, во втором – оставить пустое место внутри Begin и End.

Компиляция модулей

Использовать в программе можно лишь скомпилированные модули, имеющие расширение, предусмотренное вашей средой разработки приложений. Рассмотрим три наиболее популярные из них:

компиляция модулей в Turbo Pascal

Итогом компиляции модуля в Turbo Pascal, будет файл с расширением .tpu (Turbo Pascal Unit), хранящий его код.

компиляция модулей в Free Pascal

После компиляции модуля в среде Free Pascal, создаются два файла с разными разрешениями: .ppu и .o. Первый содержит интерфейсную часть модуля, а второй (необходим для компоновки программы) – часть реализаций.

компиляция модулей в Pascal ABC.NET

Pascal ABC.Net во время компиляции модуля не генерирует код на машинном языке. В случае, если компиляция выполнена успешна код сохраняется в файле с разрешением .pcu.

Для сред программирования Turbo Pascal и Free Pascal предусмотрены три режима компиляции: Compile, Make и Build. В режиме Compile все используемые в программе модули должны быть заранее скомпилированы. Приложение в режим Make-компиляции проверяет все подключенные модули на наличие файлов с соответствующим для среды программирования разрешением (.tpu или .o). Если какой-то из них не найден, то происходит поиск файла с названием ненайденного модуля и расширением .pas. Самый надежный из режимов – Build. Поиск и компиляция файлов (с расширением .pas) в данном режиме происходит даже тогда, когда модульные файлы уже имеются.

Пример: создадим небольшой модуль, содержащий в себе процедуры двоичного и линейного поиска элементов в массиве. Код модуля:

unit Search;
Interface
  type arr = array[1..5] of integer;
  var s: string;
  procedure binary_search(x: integer; Ar: arr; var s: string);
  procedure line_search(x: integer; Ar: arr; var s: string);
Implementation
  var a, b, c, i: integer;
  procedure binary_search(x: integer; Ar: arr; var s: string);
begin
  a:=1; b:=5; s:='NO';
  while a<=b do
  begin
    c:=a+(b-a) div 2;
    if (x<Ar[c]) then
      b:=c-1
    else if (x>Ar[c]) then
      a:=c+1
    else
    begin s:='YES'; break; end;
  end;
end;
procedure line_search(x: integer; Ar: arr; var s: string);
begin
  s:='NO';
  for i:=1 to 5 do
  begin
    if (Ar[i]=x) then
    begin
      s:='YES'; break;
    end;
  end;
end;
end.

Весь этот код должен находиться в отдельном файле. Теперь напишем основную программу, в которую подключим наш модуль Search.

program modul_search;
  uses Crt, Search;
var
  mas: array[1..5] of integer;
  n, j: integer; str: string;
  y: char;
begin
  clrscr;
  writeln('Enter the array elements');
  for j:=1 to 5 do
    readln(mas[j]);
  write('Enter number search: '); readln(n);
  write('This array is ordered? (y/n) '); readln(y);
  if y='y' then binary_search(n, mas, str)
  else line_search(n, mas, str);
  write(str);
  readkey;
end.

После компиляции файлов данное приложение должно исправно работать. Конечно, если вы, отвечая на вопрос “Этот массив упорядочен?” укажите программе ложную информацию, то и она может ответить тем же.

Глава 3 Более сложные элементы языка

____________________________________________________________________

3.5. Модули в Паскале

Модуль это такая программная единица, которая может и, чаще всего,

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

дур, а также константы, переменные, объявленные типы. Это позволяет разде-

лить работу между программистами при разработке больших и сложных про-

грамм. Например, один программист может разрабатывать один модуль, второй программист – другой модуль, а третий главную программу.

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

ров, как правило, занимается руководитель проекта.

При этом каждый программист пишет и отлаживает свой модуль незави-

симо от других.

Текст модуля на языке программирования называется исходным модулем.

После компиляции создается так называемый объектный модуль. Объектный модуль это такой модуль, который уже переведен на внутренний машинный язык. На этапе компоновки (сборки) необходимые модули включаются в про-

грамму (компонуются) для обеспечения правильных вызовов функций и проце-

дур. Например, главная программа вызывает некую функцию из модуля А, в

модуле В происходит вызов процедуры из модуля С и т.д. Такой процесс назы-

вается разрешением связей. В итоге собирается исполняемая программа.

3.5.1 Структура модуля

Структура модуля имеет вид:

213

3.5 Модули в Паскале

____________________________________________________________________

unit <Имя модуля>;

interface

//

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

<раздел открытых описаний>

implementation

//

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

<раздел закрытых описаний>

initialization

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

finalization

// раздел завершения

end.

Модуль начинается со служебного слова unit, за которым следует имя модуля. В случае если данный модуль использует другие модули, после слова interface необходимо поместить служебное слово uses и список исполь-

зуемых модулей.

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

процедуры и функции, которые доступны для всех программ и модулей, ис-

пользующих данный модуль. Глобальные переменные, помещенные в интер-

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

Раздел реализации модуля начинается служебным словом implementation. В секции реализации могут находиться свои описания, не-

видимые для программ и модулей, использующих данный модуль. Описанные в секции интерфейса константы, типы данных, переменные, процедуры и функ-

ции являются видимыми в секции реализации.

Те процедуры и функции, которые описаны в интерфейсной секции, опи-

сываются еще раз в секции реализации, причем их заголовок должен быть точ-

но таким же, как тот, который указан в секции интерфейса.

В секции инициализации помещаются операторы, выполняющиеся только один раз при обращении к данному модулю основной программы. Эти операто-

214

Глава 3 Более сложные элементы языка

____________________________________________________________________

ры обычно используются для подготовительных операций. Например, в секции инициализации могут инициализироваться переменные, открываться нужные файлы. При выполнении программы, использующей некоторый модуль, секция инициализации этого модуля вызывается перед запуском основного тела про-

граммы. При использовании нескольких модулей, их секции инициализации вызываются в порядке, указанном в uses. Секция инициализации является не-

обязательной и может вообще отсутствовать.

Раздел finalization также является необязательным. В нем выполня-

ются различные действия перед закрытием программы, например закрытие файлов баз данных, освобождение динамически распределенной памяти и т.д.

С целью уменьшения размера основной программы, улучшения читабель-

ности готовые подпрограммы рекомендуется оформлять в виде модуля. Со временем у вас появится своя собственная библиотека модулей.

Имя библиотечного модуля должно совпадать с именем файла, под кото-

рым хранится текст модуля на диске. Исходный текст библиотечного модуля имеет расширение *.pas (<имя модуля>.pas).

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

3.1.1.3 в виде модуля.

В меню Файл выберите пункт Создать модуль. В окне редактора исходного кода появится заготовка кода для модуля. Очистите окно редактора и введите текст модуля:

unit my_module;

interface

function No_standard_sin(x:real):real;

implementation

{повторяем заголовок функции точно таким

что и в разделе interface}

function No_standard_sin(x:real):real;

var eps,s,t: real;

215

3.5 Модули в Паскале

____________________________________________________________________

n: integer; begin

s:= x; t:= x; n:= 2; eps:= 1e-7; repeat

t:= -t * (sqr(x)/(n * (n + 1))); s:= s + t;

n:= n + 2; until abs(t)< eps;

No_standard_sin:= s; end;

end.

Сохраните модуль обязательно с тем же именем, что указан в заголовке модуля, т.е. my_module.pas в какой-нибудь папке. Откомпилируйте модуль на-

жав клавиши Ctrl+F9 или меню Запуск-> Собрать. Для каждого модуля созда-

ются два файла: двоичный файл описания модуля с расширением (.ppu) и объ-

ектный с расширением (.o). Таким образом, в вашей папке создадутся два файла my_module.ppu и my_module.o

Создайте консольное приложение и введите текст программы:

program project_with_my_module; {$mode objfpc}{$H+}

uses

CRT, FileUtil,SysUtils, my_module; // указываем имя модуля var x, y, dx: real;

begin x:= 0;

dx:= 0.1; while x <= 1 do

begin

216

Глава 3 Более сложные элементы языка

____________________________________________________________________

y:= No_standard_sin(x);

writeln(‘x= ‘, x:0:1, ‘ y= ‘, y:0:7,

‘ sin(x)= ‘, sin(x):0:7);

x:= x + dx;

end;

writeln(UTF8ToConsole(‘Нажмите любую клавишу‘));

readkey;

end.

Сохраните проект в той же папке, где вы сохранили модуль или скопируй-

те файлы my_module.ppu и my_module.o в папку с текущим проектом. Нажмите клавишу F9. Начнется компиляция и сборка (компоновка) программы. На этапе сборки ваш модуль будет автоматически добавлен в исполняемую программу.

После выполнения программы вы получите те же самые результаты, что и в разделе 3.1.1.3.

Если вы хотите, чтобы ваш модуль был доступен и в других программах,

то проще всего поступить следующим образом:

1.Создайте папку, например с именем my-units

2.Перенесите в эту папку файлы my_module.ppu и my_module.o;

3. Скопируйте саму папку my-units в системный каталог

«C:lazarusfpc2.2.4unitsi386-win32» если вы работаете в Windows или в ката-

лог «/usr/lib/fpc/2.2.4/units/i386-linux», если вы работаете в Linux.

Теперь ваш модуль будет автоматически подключаться в ваши программы

(разумеется, надо прописать имена модулей в объявлении uses). Почему именно в этот каталог? Потому что компилятор если не найдет модуль в папке с вашим проектом, он будет искать его по умолчанию в этой системной папке.

Если же вы разместили папку my-units в другом месте, то вам придется прописывать путь к этой папке, либо в инспекторе проекта, либо непосредст-

венно в объявлении uses вот таким образом:

uses my_module in ‘<путь к папке с исходным кодом модуля>

217

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]

  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #

Понравилась статья? Поделить с друзьями:

Не пропустите также:

  • Модны ли вредные привычки сочинение рассуждение 10 предложений
  • Модное сабо как пишется
  • Модничает как пишется правильно
  • Модифицированная методика родительское сочинение о а карабановой
  • Модерн токинг как пишется на английском

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии