Отправляет email-рассылки с помощью сервиса Sendsay

Всё о работе в Интернет

  Все выпуски  

Занятие 32.


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

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

МОДУЛИ

1. Основные понятия.

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

Модулем (Unit) называется оформляемая по определённым правилам и автономно компилируемая  совокупность описаний типов, констант, переменных и подпрограмм.

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

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

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

Наиболее полное описание стандартных модулей ИСП можно найти в книге “Справочник по процедурам и функциям Borland Pascal with Objects 7.0” составителей И. Дериева, С. Токаря, изданной в 1993 году в киевском издательстве “Диалектика”.

Наиболее интересные и практически значимые стандартные модули: System, Dos, Strings, Graph, Crt, Overlay и Printer.

Основные стандартные модули, используемые ИСП, находятся в общем файле с расширением TPL (системная библиотека). Некоторые стандартные модули, а также модули программиста располагаются в файлах с расширением TPU.

2. Оформление модуля программиста.

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

Любой модуль программиста выстраивается по одной и той же схеме:

   UNIT <имя модуля>;                       {1}
     
Interface
                             {2}
        
Uses
...;                          {3}
        
Type
...;                          {4}
        
Const
...;                         {4}
        
Var
...;                           {4}
        
Procedure
...;                     {4}
        
Function
...;                      {4}
     
Implementation
                        {5}
        
Type ...; Const ...; Var
...;      {6}
        
Procedure ...; Function
...;       {7}
         ...
        
Procedure
...;                     {8}
        
Function
...;                      {8}
  
Begin
                                    {9}
      ...                                   {10}
  
End.                                     {11}

Описание составляющих модуля:

{1} – заголовок модуля, содержащий его имя. С одной стороны, имя модуля должно быть уникальным, то есть не совпадать ни с каким другим, указанным в его пределах. С другой стороны, оно просто обязано совпадать с именем файла, в котором модуль сохраняется (без учёта расширения). Именно поэтому при выборе имени модуля, в отличие от имени программы, нельзя нарушать известные соглашения MS DOS в отношении имён файлов. Отсутствие неприятностей гарантировано, если просто ограничиться восемью знаками латиницы.  

{2} – начало интерфейсной секции. Всё, что указано в интерфейсной секции, считается доступным в первичной программе, к которой это модуль подключен.

{3} – перечень модулей подключаемых к данному.

{4} – совокупность описаний типов, констант и переменных, а также заголовков подпрограмм, которые должны быть доступными в первичной программе.

{5} – начало секции реализации.

{6} – совокупность описаний типов, констант и переменных, используемых исключительно для внутренних нужд модуля;

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

{8} – описание подпрограмм, полные заголовки которых представлены в интерфейсной секции. Поэтому, описывая подпрограмму в секции реализации, в заголовке достаточно указать только её имя. Именно эти подпрограммы должны быть доступными в первичной программе.

{9} – начало секции инициализации.

{10} – операторы секции инициализации. Эти операторы будут однократно выполнены в начале работы первичной программы, к которой модуль подключён. С их помощью могут быть реализованы операции общего назначения, в том числе, установка начальных значений тех или иных переменных, установка режима работы экрана, открытие нужных файлов и т. п. Эти операторы – не обязательны. В частности, если они отсутствуют, то начало секции инициализации Begin можно не указывать.

{11} – конец модуля.

Основные особенности использования модулей программиста:

-       Если один и тот же идентификатор X описан и в первичной программе A, и в подключённом модуле B, то в каждой из этих программных единиц непосредственно доступен только “свой” идентификатор X.

-       Если один и тот же идентификатор X описан и в первичной программе A, и в подключённом модуле B, то и в первичной программе A “чужой” идентификатор X станет доступным, если снабдить его квалификатором, то есть придать ему вид B.X.  

3. Пример модуля программиста.

В качестве примера создан модуль Problem, в котором размещена процедура решения квадратного уравнения (см. материалы занятия 24):

   Unit Problem;
     
Interface
  
      Uses Crt;
  
      Procedure Square_Equation(a,b,c:Real; Var x1,x2:Real; Var z:Boolean);
     
Implementation
         Procedure Square_Equation;
            Var D: Real;
     
   Begin
            D := b*b - 4*a*c; D := Int(D*1E10)/1E10;
            z := D>=0; If Not z Then Exit;
  
         x1 := ( -b + Sqrt(D) ) / (2*a); x2 := -b/a - x1
  
      End;
  
Begin
      TextBackground(1); ClrScr; TextColor(13)
  
End.

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

Нижеследующая первичная программа показывает, как воспользоваться “услугами” модуля Problem:

   {$B+,D+,E+,I+,L+,N+,Q+,R+,X-}
  
Program Example_Module
;
     
Uses Problem
;
     
Var a,b,c: Real; x1,x2: Real; z: Boolean
;
  
Begin

     
Write('Введите коэффициенты уравнения a,b,c: '); ReadLn(a,b,c);
     
Square_Equation(a,b,c,x1,x2,z
);
     
If z Then WriteLn( 'x1=', x1:0:4, ', x2=', x
2:0:4 )
          
Else WriteLn
('Действительные корни отсутствуют!')
  
End.

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

Уважаемые подписчики! На следующем занятии мы рассмотрим технологию работы с модулями программиста в рамках ИСП.

Уважаемые подписчики! При необходимости задать вопрос, проконсультироваться, уточнить или обсудить что-либо обращайтесь через Гостевую книгу моего персонального сайта http://a-morgun.narod.ru. При этом настоятельно рекомендую пользоваться браузером Internet Explorer.

С уважением, Александр.


В избранное