Как написать модуль на паскале

Модуль (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 содержит все описания, необходимые для подпрограмм работы с экраном на Вашем персональном компьютере.







Deutsch (de)
English (en)

español (es)

suomi (fi)
français (fr)








português (pt)

русский (ru)









Назад к Зарезервированным словам.

A Unit — это файл исходного кода (или двоичный, скомпилированный из этого файла), который был написан с использованием языка программирования Pascal и разработан как отдельный модуль в Приложении или Объектном модуле. Слово Unit — это зарезервированное слово.

Назначение

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

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

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

Модуль, которому требуется доступ, например, процедуры и типы данных в другом модуле, должен указывать те модули, к которым он должен получить доступ, в разделе uses (но связывание выполняется без необходимости писать make-файл, как в C).

Модуль также можно использовать для объявления серии глобальных констант или переменных для использования всем приложением без фактического содержания исполняемого кода. Это похоже на ключевое слово common в языке программирования Fortran.

Формат

Модуль задается с помощью ключевого слова unit, за которым следует идентификатор модуля. Идентификатор модуля (в следующем примере имя модуля — «minimalunit») должен соответствовать имени файла, в котором он записан. Минимальный рабочий пример (который ничего не делает):

unit minimalunit;
interface
        // здесь функционал, которые модуль публикует открыто
implementation
        // здесь идет реализация предлагаемого функционала и, 
        // возможно, внутреннего функционала (видимого только внутри модуля)
end.

где часть после раздела interface соответствует public-части других языков и раздел implementation делает это для private.

Более продвинутая базовая структура:

unit advancedunit;
interface

implementation

initialization
        // здесь может быть размещен код, 
        // который выполняется при загрузке модуля
finalization
	// код, выполняемый по окончании программы

end.

Необязательные разделы initialization и finalization могут следовать за кодом, который выполняется в начале/конце программы.

Подробный пример модуля

Пошаговый пример:

unit randomunit;
// этот модуль что-то делает

// public  - - - - - - - - - - - - - - - - - - - - - - - - -
interface

type
        // тип TRandomNumber становится видимым глобально,
        // поскольку он где-то подключен (в операторе uses)
	TRandomNumber = integer;

// конечно, возможны блоки const и var, также 
// список сигнатур процедур/функций делает 
// их доступными вовне модуля
function getRandomNumber(): TRandomNumber;

// реализация функции/процедуры 
// не должна находиться в разделе interface

// private - - - - - - - - - - - - - - - - - - - - - - - - -
implementation

var
        // var разделе private 
        // => может изменяться только внутри этого модуля
	chosenRandomNumber: TRandomNumber;

function getRandomNumber(): TRandomNumber;
begin
	// возвращаем значение
	getRandomNumber := chosenRandomNumber;
end;

// раздел initialization - это часть, выполняемая 
// при загрузке/включении модуля
initialization
begin
	// выбираем наше случайное число
	chosenRandomNumber := 3;
    // выбранное броском игральной кости, 
    // гарантированно случайное
end;

// finalization запускается по окончанию программы 
finalization
begin
	// этот модуль говорит "пока" по завершению программы
	writeln('пока');
end;
end.

Чтобы подключить модуль, просто используйте оператор uses.

program chooseNextCandidate;
uses
	// подключение модуля
	randomunit;

begin
	writeln('следующий кандидат: №. ' + getRandomNumber());
end.

При компиляции FPC проверяет эту программу на зависимости модулей. Он должен быть в состоянии найти модуль «randomunit».

Самый простой способ удовлетворить это — иметь модуль, имя которого совпадает с именем файла, в котором он записан (добавление .pas — это нормально и приветствуется). Файл модуля может находиться в том же каталоге, где находится исходник программы, или в пути к модулю, по которым FPC ищет модули.

Приоритетность модуля

Когда в разделе uses описано несколько модулей, могут возникнуть конфликты с идентификаторами (процедурами, типами, функциями и т.д.), которые имеют одно и то же имя в нескольких модулях. В FreePascal последний упомянутый модуль становится «победителем» и предоставляет код для модуля, в который он включен.

Если вы хотите добиться другого поведения, вы можете явно добавить unitname.identifier, чтобы указать модуль, который вы хотите использовать, или изменить порядок модулей. Первый вариант часто оказывается наиболее очевидным.

unit interestCalculations;

interface

type
  basisType = currency;

implementation

end.

Явное указание объявленного модуля:

program interestCalculator;

uses
   interestCalculations;

type
   // мы уже загрузили объявление "basicType" 
   // из модуля InterestCalculations, но мы снова 
   // переобъявляем его здесь ("затенение")
   basisType = extended;

var
   // последнее объявление приоритетнее: originalCapital является расширенным
   originalCapital: basisType;
   // указываем область, в которой будет использоваться корректное объявление
   monthlyMargin: interestCalculations.basisType;

begin
end.

Обратите внимание, что модуль interestCalculations по-прежнему будет выполнять свои собственные вычисления со своим собственным basisType (здесь currency). Вы можете изменять («тень») объявления только в текущей области видимости (и по убыванию).

См.также

  • “Unit scope” in the “reference guide” (FPC HTML documentation)
  • “Compiling a unit” in the “users’s guide” (FPC HTML documentation)
  • § “Units” in the WikiBook “Pascal Programming”

Аннотация: В этой лекции мы рассматриваем структуру модулей, их создание и подключение к проекту. На конкретном практическом примере рассматривается работа с модулями.

Цель лекции

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

Модули

Модуль (англ. Unit) — это автономно компилируемая программная единица, которая может включать в себя такие объекты программы, как типы, константы, переменные и подпрограммы (процедуры и функции).

Каждый раз, когда мы создаем какое либо окно, для него автоматически создаются два файла: файл описаний *.lfm и модуль *.pas. В файле описаний в простом текстовом виде содержится описание формы — какие компоненты на ней находятся, как они настроены, какие параметры содержатся у свойств каждого компонента. Редактировать этот файл вручную крайне не рекомендуется, лучше всё сделать в Lazarus, в Инспекторе объектов и Редакторе форм, так вы гарантированно избежите ошибок в описании формы.

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

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

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

Как-то раз один мой ученик спросил, не является ли дурным тоном использовать чужой код. Давным-давно, на заре программирования это было и впрямь не очень принято. Однако теперь все изменилось — программы стали гораздо больше, функциональней, простая программа содержит очень много кода. Например, мы с вами не раз применяли функцию Length(), которая возвращает длину строки в символах или длину массива в элементах. В принципе, мы могли бы поднапрячься, и самостоятельно реализовать эту функцию стандартными средствами Паскаля. Однако это было бы неоправданной тратой времени, ведь эта функция уже реализована и включена в библиотеку Lazarus! Я ответил тому ученику, что дурным тоном будет изобретать велосипед, то есть, впустую тратить время на разработку того, что давным-давно реализовано. Конечно, если вы будете использовать чужой код без ведома и разрешения автора, то это будет плохо. Однако если автор сам выложил свой код, то почему бы им не воспользоваться?
Разумеется, тут остается риск того, что автор — не очень хороший программист, и его код может «глючить» — работать с ошибками. В этом случае могу дать такой совет: ищите исходники на приличных, больших сайтах, которые не заброшены и часто обновляются. В следующей лекции, на лабораторной работе, мы используем один такой чужой модуль.

Сейчас же нас больше интересует, как создать модуль самостоятельно, как поместить в него процедуры и функции, которые могут пригодиться нам в дальнейшем, в различных проектах. Мы реализуем модуль с «защитой от дураков» — с проверкой правильности вводимого пользователем числа. Причем числа могут быть целые беззнаковые (от 0 и выше), целые со знаком (могут быть отрицательными) и вещественные, которые все со знаком.

Структура модулей

Модуль в Паскале имеет следующую структуру:

Unit <имя модуля>;
interface
<интерфейсная часть> //открытая часть
implementation
<исполняемая часть (реализация)> //закрытая часть
initialization
<необязательная инициирующая часть>
finalization
<необязательная завершающая часть>
end.
    

Имя модуля

Имя модуля должно точно соответствовать имени файла этого модуля. То есть, если вы создаете модуль

unit MyUnit;

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

Совет: если при редактировании кода и удерживая нажатой клавишу <Ctrl> вы подведете указатель мыши к имени какого либо подключаемого модуля, его имя превратится в гиперссылку, щелкнув по которой вы откроете этот модуль. Можете посмотреть, как реализуются профессиональные модули, заглянуть «во внутренности» процедур и функций.

Интерфейсная часть

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

Unit MyUnit;
interface
uses windows;
const
   MyPI = 3.1415;
var
   MyGlobalVariable: Integer;
function MyGlobalFunc(a, b: string): boolean;
procedure MyClobalProc;
    

Здесь мы создаем модуль с именем MyUnit, который нужно сохранить в файл с именем MyUnit.pas. Далее, мы объявляем интерфейсную часть. Тут с помощью служебного слова uses (англ. использовать) мы указываем, что к этому модулю нужно еще подключить модуль windows, который входит в стандартную поставку Lazarus.

Далее, мы объявляем константу MyPI, которой сразу присваиваем значение, и переменную MyGlobalVariable. И константой, и переменной можно будет пользоваться извне — там, где будет подключаться этот модуль.

Далее мы объявляем функцию и процедуру. Обратите внимание: только объявляем! Само описание (код) этих функции и процедуры будет в разделе исполняемой части (или разделе реализации). В дальнейшем этими процедурой и функцией мы также сможем пользоваться извне.

Понравилась статья? Поделить с друзьями:
  • Как написать модератору сайта одноклассники
  • Как написать модераторам тик ток
  • Как написать модераторам телеграмм
  • Как написать модельному агентству
  • Как написать модель угроз