:: PASCAL :: ТЕОРИЯ  
 

 

Лекция 8

 

 

 

Модули в языке Паскаль.

  1. Необходимость использования модулей.  

 

Программа, написанная на языке Паскаль, состоит из главной программы и возможно нескольких модулей. Тексты главной программы и модулей размещаются в различных файлах. Выполнение всегда начинается с главной программы; операционная система осуществляет вызов того файла с расширением .ЕХЕ, который содержит код главной программы.   

 

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

 

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

  2.Структура модуля.  
  В языке Паскаль в состав модуля могут входить несколько процедур и функций. Исполняемый код модуля размещается в отдельном сегменте памяти, а не в сегменте главной программы.    
  Структура модуля напоминает структуру программы, хотя налицо и существенные различия.    

    unit <имя модуля>
Секция               interface
связи
                  uses <список_1 имен модулей>;
               <внешние объявления>
Секция               implementation
реализации
        uses <список_2 имен модулей>;
               <внутренние объявления>
Секция               Begin
инициализации
      <операторы>
                           End.

  Модуль обязательно начинается с ключевого слова unit, за которым следует идентификатор – имя модуля.  
  Замечание.  
  Имя модуля обязательно должно совпадать с именем файла с расширением .pas, в котором хранится модуль.  
  Пример.  
  unit my_library хранится в файле my_library.pas  
  Завершается модуль, так же, как и главная программа, ключевым словом END с точкой.  
  Имя модуля служит для организации связи модуля с главной программой и другими модулями. Связь между модулями устанавливается с помощью оператора USES.  

  

  1. Секция связи.  
  Секция связи начинается с оператора USES, следом за которым должны размещаться так называемые внешние объявления. Внешние объявления описывают элементы, которые считаются известными за пределами модуля. К ним относятся объявления типов, констант, переменных и подпрограмм. Таким образом, после uses мы должны указать имена стандартных или пользовательских модулей, с которыми данный модуль установит связь. Ресурсы этих модулей будут доступны в любой точке данного модуля.  
  При объявлении подпрограмм, т. е. процедур и функций, в секции связи указываются только их заголовки. Полные тексты процедур и функций, заголовки которых находятся в секции связи, размещаются в секции реализации.  
  Пример.  
unit my_library;
   interface
      uses crt;
      const n=5, m=6;
      type mass = array [1..m] of integer;
      matr = array [1..n] of mass;
      procedure gen_1(a,b:integer; k:byte; var t:mass);
      procedure gen_2(a,b:integer; k,l:byte; var tt:matr);
      function prostoe(x: longint): boolean;


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

  ü константы n и m;  
  ü типы mass и matr;  
  ü процедуры gen_1 и gen_2;  
  ü функция prostoe.  
  Секция реализации начинается с ключевого слова IMPLEMENTATION и обязательно включает полные тексты подпрограмм, описанных в секции связи.  
  Секция реализации может содержать оператор USES с набором внутренних объявлений модуля. Как обычно, в операторе USES указываются имена модулей. Внешние объявления этих модулей доступны в секции реализации: во-первых, они могут участвовать в формировании внутренних объявлений модуля и, во-вторых, могут использоваться при описании процедур и функций.  
  В секции реализации в области внутренних объявлений можно описывать константы, типы, переменные, процедуры и функции. Эти объекты считаются известными во всех объектах секции реализации. Но внутренние объявления являются локальными, т. е. действуют только внутри того модуля, в котором они размещаются. Однако эти недоступные извне элементы могут использоваться глобальными процедурами и функциями, заголовки которых присутствуют в секции связи.  
  Замечание.  
  Заголовок процедуры или функции в секции реализации должен либо полностью совпадать с заголовком этой же процедуры или функции в секции связи, либо содержать только имя процедуры или функции.  
  Пример.  
implementation
   uses graph;
   const z=200; z1=300; z2=400;
   var str:string[20];
   function prostoe;
      var q:boolean; i, r: longint;
   begin
      q:=true;
      if x mod 2 =0 then q:=false;
      r:= trunk(sqrt(x));
      i:=3;
      while q and (i<=r) do
      if x mod i =0 then q:=false
      else i:=i+2;
      prostoe:=q
   end;

  3. Секция инициализации.  
     
  Заключительной секцией модуля, которая, впрочем, чаще всего отсутствует, является секция инициализации. Она начинается с ключевого слова BEGIN. Далее обычно следует последовательность операторов языка Паскаль.  
  Секции инициализации всех модулей, входящих в программу, выполняются один раз перед началом работы главной программы. Они используются для подготовки главной программы и модулей к началу работы и могут включать операторы, осуществляющие присваивание начальных значений переменным, открытие файлов, дополнительные проверки паролей пользователей и т.п.  
  В секции инициализации известными считаются внешние объявления секции связи, внутренние объявления секции реализации и внешние объявления всех модулей, имена которых присутствуют в операторах USES этого модуля.  
  Пример.  
unit readfile;  
   interface  
   var t: text;  
   procedure display;  
   implementation  
   var fn:string;  
   procedure display;  
      var a:string;  
   begin  
   readln(t,a);  
   wr1teln(a)  
   end;  
   Begin  
   writeln('Введите имя файла');  
  readin(fn);  
  assign(t,fn);  
  reset(t)  
  End.  

Пример главной программы:
Program P_1;
   uses readfile;
Begin
   display;
End.

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

 

  Замечание.  
  В языке Паскаль недопустимы прямые и косвенные обращения модулей к самим себе!  
  1. Предположим, что в секции связи модуля C объявлена константа x. Эта константа будет размещена в сегменте данных программы до начала работы программы. Но, хотя она будет существовать в течение всего времени работы программы, из главной программы обратиться к ней невозможно, поскольку имени модуля C нет в операторе uses главной программы.  
  2. Пусть в главной программе и в секциях связи модулей A и D объявлена переменная од одним и тем же именем w. Понятно, что каждая из этих переменных доступна тому блоку, где описана. Однако, главной программе доступны и переменные из модулей A и D, только для обращения к ним надо использовать составные имена: A.w и D.w.  
  В модуле A доступна переменная из модуля D. Для работы с ней надо использовать имя D.w.  
 

 

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

   
::  

::


Rambler's Top100 Крапивна
 

(с)2005-2006 Web studio SEDUVAN

Hosted by uCoz