http://sulfurzona.com/
News
Service
Magazine
Software (Battle City Game, Wallpaper manager, Superpad, VG-NOW, Puzzle Game, Netler Internet Browser, ..)
Dune Game (Dune III, Dune IV, Cheats, Forum, ..)
Games free
Turbo Pascal (Assembler, Docs, Sources, Debbugers, ..)
Books (Docs for developers)
Guest book
Компьютерная диагностика двигателя автомобиля (адаптер К-линии)Компьютерная диагностика двигателя автомобиля (адаптер К-линии)
 
 
 
 
 

Паскаль для новичков (часть 31)

 

Модули

 
Автор: Владислав Демьянишин
 
Паскаль для новичковРанее я рассказывал о программировании с использованием подпрограмм, которые являют собой обособленный код, направленный на выполнение некоторой локальной задачи. Такой подход в программировании позволяет создавать хорошо структурированные и прозрачные программы с одной лишь оговоркой, что все подпрограммы должны быть объявлены выше и находиться непосредственно в тексте программы. Как бы это всё не выглядело аккуратно, всё равно при большом количестве подпрограмм листинг мог выглядеть достаточно громоздко, не говоря уже о всевозможных константах, типах, переменных.
  
Модульное программирование позволяет группировать константы, описания типов, объявление переменных, подпрограммы по их назначению в отдельные модули. Модуль – это обычный PAS-файл, имеющий структуру, близкую к структуре программы, но он вовсе не является самостоятельной программой, а лишь хранилищем констант, описаний типов, объявлений переменных и исходного кода подпрограмм.
  
Таким образом, введение поддержки модулей в Turbo Pascal ослабило некоторые ограничения на размер PAS-файла (не более 10000 строк или около 256К текста), позволило упростить коллективную разработку и модифицируемость программ.
  
Основная программа может ссылаться на модули, из которых она импортирует код подпрограмм.
  
В данной статье я не буду приводить примеры модулей, так как их в предыдущих практических статьях и так было предостаточно. Кратко расскажу лишь о структуре модуля. Модуль имеет следующую структуру:
 
Unit unitname;
 
Interface
 
{блок описания видимых (экспортируемых) объектов}
 
Implementation
 
{блок описания скрытых (внутренних) объектов}
 
Begin
{блок инициализации модуля}
End.
 
Модуль озаглавливается служебным словом unit, за которым через пробел должно быть указано имя PAS-файла данного модуля без окончания “.PAS”, завершающееся точкой с запятой.
  
Затем следует интерфейсная часть, озаглавливаемая служебным словом Interface. Данный блок может содержать uses-объявление используемых модулей, type-блок описания типов, const-блок описания констант и var-блок объявления переменных, которые войдут в сегмент данных программы, использующей этот модуль,
а так же заголовки экспортируемых подпрограмм. При этом, заголовки подпрограмм в данном блоке равносильны предварительному описанию оных, поэтому необходимость указания служебного слова forward отпадает.
  
Вслед за этим следует блок реализации, предваряемый служебным словом Implementation. Данный блок может содержать uses-объявление используемых модулей, type-блок описания типов, const-блок описания констант и var-блок объявления переменных, которые будут видны только внутри кода данного модуля, и конечно код экспортируемых и внутренних подпрограмм.
  
Завершается модуль блоком инициализации Begin..End, то есть в данном блоке может находиться код, выполняющий начальную установку для внутренних нужд модуля, если в этом есть необходимость. Такая необходимость может возникнуть, например, при предварительном просчёте таблицы синусов-косинусов для математического модуля. Чаще всего этот блок может оказаться пуст, тогда вместо Begin..End можно указать просто End. В любом случае после служебного слова End следует ставить точку.
  
Таким образом, достаточно однажды сформировать интерфейс входных параметров для подпрограмм модуля, и затем при необходимости совершенствовать реализацию кода тела экспортируемых подпрограмм, и при этом не придётся переписывать программу, использующую этот модуль.
  
Так как модуль не является самостоятельной программой, в Turbo Pascal предусмотрено хранить откомпилированный код модуля в одноимённом TPU-файле. Чтобы в программе стало возможным использовать константы, типы, переменные и подпрограммы из модуля, достаточно в ней объявить список используемых модулей при помощи служебного слова uses, и лучше будет это сделать в начале программы, например:
 
Uses Crt, Dos;
begin
end.
 
после чего в программе становятся видимыми (известными) все описания интерфейсной части используемого модуля, что позволяет обращаться к экспортируемым константам, типам, переменным и подпрограммам как если бы они были объявлены в самой этой программе.
 

Области действия имён

 
Может случиться так, что идентификаторы интерфейсной части одного модуля пересекаются с идентификаторами интерфейсной части другого модуля, и оба они используются в программе. Тогда основной блок программы перекрывает своими идентификаторами остальные одноимённые идентификаторы, импортируемые из модуля, указанного в uses-описании первым. В свою очередь модуль, указанный первым перекрывает своими идентификаторами остальные одноимённые идентификаторы следующего в uses-описании модуля. Чтобы получить доступ к перекрытому идентификатору достаточно перед ним через точку указать имя модуля, из которого он импортируется. Для примера, предположим, что в программе описана процедура ClrScr для очистки графического экрана, и что данная программа импортирует одноимённую процедуру из стандартного модуля CRT для очистки текстового экрана. Тогда данный код
 
Uses Crt;
 
procedure ClrScr;
end;
 
begin
ClrScr;
end.
 
приведёт к вызову процедуры ClrScr, описанной в основном блоке программы и очистке графического экрана. В то время, как следующий код
 
 
 
 
 
Uses Crt;
 
procedure ClrScr;
end;
 
begin
Crt.ClrScr;
end.
 
приведёт к вызову процедуры ClrScr, импортируемой из модуля Crt и очистке текстового экрана. Как может быть видно, в этом примере просматривается способ указания принадлежности импортируемого элемента аналогичный способу указания принадлежности поля некоторой записи.
  
Аналогичный способ можно применить при косвенном импортировании, то есть когда один модуль в своём интерфейсном uses-описании ссылается на другой модуль, например:
 
Unit MyCrt;
 
interface
 
Uses Crt;
implementation
begin
end.
 
тогда следующая программа будет выполнена корректно.
 
Uses MyCrt;
 
begin
Crt.ClrScr;
end.
 
При этом следует помнить, что нельзя допускать прямого или косвенного обращения модуля к самому себе, например, таким образом, когда первый модуль ссылается на второй модуль, который в свою очередь ссылается на первый.
 

Инициализация

 
Инициализация используемых в программе модулей проводится перед выполнением основного блока программы, при этом блоки инициализации модулей выполняются в том порядке, в котором они перечислены в uses-описании. За исключением модуля SYSTEM, который всегда инициализируется первым.
 

Поиск модулей

 
При трансляции перед компиляцией программы или модуля, использующего иные модули, компилятору необходимо найти TPU-файлы, содержащие код подключаемых модулей. Для этого компилятор первым делом просматривает системный библиотечный файл TURBO.TPL на наличие искомого модуля. Если искомый модуль не найден или не найден сам файл TURBO.TPL, то поиск необходимого TPU-файла продолжается в текущей папке с компилируемой программой. Если всё же компилятор и здесь постигла неудача, то поиск продолжается по пути, указанному в настройках Options > Directories > Unit Directories оболочки TURBO.EXE или в параметре /U вызова компилятора командной строки TPC.EXE. Если вопреки всем стараниям компилятора искомый модуль не найден, то будет выдано сообщение “Error 15: File not found (имя_модуля.TPU).” (не найден файл модуля с именем “имя_модуля.TPU”).
 
Очень удобно хранить листинги всех необходимых для программы модулей в папке с ней же, что позволит быстро обратиться к любому модулю, чтобы восстановить в памяти программиста интерфейс той или иной подпрограммы. При этом, если помимо окна с листингом программы открыто несколько окон с листингами используемых модулей, то при первой же компиляции будут сформированы TPU-файлы для всех задействованных модулей.
  
В комплекте Turbo Pascal имеется программа TPUMOVER.EXE, позволяющая компоновать (дополнять или создавать с нуля) библиотечный файл TURBO.TPL так, что можно добавить в него все необходимые модули. Но при этом следует учесть, что оболочка TURBO.EXE загружает файл TURBO.TPL в память и, следовательно, чем больше будет размер файла TURBO.TPL, тем меньше свободной памяти останется под запуск программы в среде TURBO.EXE, что может сделать невозможным запуск программы в режиме отладки из-за нехватки свободной оперативной памяти. Поэтому я рекомендую не дополнять файл TURBO.TPL.
 

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

 
В комплекте Turbo Pascal содержаться 6 основных модулей, которые обеспечивают поддержку базовых возможностей языка, а так же некоторые системно зависимые расширения. Это следующие модули: System, Dos, Crt, Printer, Overlay, Graph. Из них модули System, Dos, Crt, Printer и Overlay собственно и составляют системный библиотечный файл TURBO.TPL.
Модуль System присутствует в каждой Паскаль-программе незримо, поэтому нет нужды его указывать в uses-объявлении. Он содержит все системные переменные, подпрограммы стандартного Паскаля, а так же вспомогательные.
Модуль Dos предоставляет необходимый набор подпрограмм по взаимодействию с операционной системой MS-DOS.
Модуль Crt предоставляет набор подпрограмм по взаимодействию с BIOS клавиатуры и BIOS видеодисплея.
Модуль Printer содержит необходимую файловую переменную, связанную с печатающим устройством (принтером).
Модуль Overlay представляет собой систему обеспечения оверлейной подкачки программы на этапе её функционирования.
Наконец модуль Graph содержит систему поддержки BGI-драйверов для работы с графическим выводом на дисплей.
 

Оптимизация ресурсов

 
На этапе разработки сложной и громоздкой программы рано, или поздно, но приходит момент, когда необходимо выполнить программу в отладочном режиме в среде TURBO.EXE, но не хватает памяти для этого. В данном случае арифметика проста. Файл TURBO.TPL занимает 45Кб. Если для компиляции модули Crt (4Кб) и Overlay (3.8Кб) не нужны, то будет напрасно занято 7.8Кб памяти.
Иногда сэкономить память можно, если спрятать файл TURBO.TPL в папку, где компилятор его искать не будет, а вместо него разместить TPU-файлы основных модулей System, Dos, Crt, Printer, Overlay, Graph из комплекта Turbo Pascal. Тогда компилятор загрузит в память лишь те модули, которые требуются для компиляции программы.
  
Когда EXE-файл откомпилированной программы получается около 100Кб и более можно применить режим компиляции не в память, а на диск. Для этого достаточно в меню Compile установить параметр Destination в значение Disk. Прочесть об этом можно, выбрав пункт Destination и, нажав клавишу помощи F1. Там всё доступно написано.
 
На этом сказание о земле сибирской, то бишь о модулях, разрешите закончить.
 
Продолжение следует…
 
© Владислав Демьянишин
 
Вы находитесь на официальном сайте Владислава Демьянишина - разработчика игры Dune IV (Dune 4). На нашем сайте Вы можете бесплатно скачать игры Dune IV (Dune 4), Battle City (Танчики с Dendy/Nintendo), читы к играм и многое другое. Также Вы можете скачать бесплатно программы и полезные утилиты. Все программы чистые, т.е. не содержат вирусов и иного вредоносного ПО.
 
Среди доступных программ есть мобильная читалка книг, менеджер переноса файлов с фото- и видеокамер на компьютер, текстовый редактор, WYSIWYG редактор, 3D аниматор, GIF аниматор, AVI аниматор, пакетный конвертор изображений, редактор электрических схем, программа для скриншотов, диспетчер тем рабочего стола и другие.
 
На нашем сайте можно не только бесплатно скачать игры, но и документацию и книги по программированию на MIDLetPascal, Turbo Pascal 6, Turbo Pascal 7, Borland Pascal, по программированию устройств Sound Blaster, Adlib, VESA BIOS, справочник Norton Guide и много другой полезной информации для программистов, включая примеры решения реальных задач по созданию резидентных программ. Предлагаю также посетить Марья искусница - сайт о рукоделии (http://mariya-iskusnica.ru).
 
 

Журнал > Программирование > Паскаль для новичков (Turbo Pascal, Assembler) > Паскаль для новичков (часть 31): Модули
 
 
 
705
 
ВКонтакте
Facebook
 
 
 
На главную страницу На предыдущую страницу На начало страницы
 
 
Рейтинг@Mail.ru Рейтинг Сайтов YandeG