Структура модулів



Скачати 76.06 Kb.
Дата конвертації27.03.2017
Розмір76.06 Kb.
Лекція 10
Модулі

Модулі призначені для підтримки принципів модульного програмування при розробці програм, основним з яких є принцип утаєння інформації. Згідно цьому принципу взаємовплив логічно незалежних фрагментів програми повинен бути зведений до мінімуму. Принцип утаєння інформації, підтримуваний модулями, дозволяє створювати порграми, які надійно працюють і легко модифікуються. У мові Borland Pascal модулі використовуються переважно для створення бібліотек процедур, функцій і об'єктів, які потім можуть використовуватися в програмах, що розробляються користувачем.
Структура модулів
Модуль складається з 4 частин:

  • Заголовка модуля;

  • Розділу оголошень або інтерфейсу;

  • Розділу реалізації;

  • Розділу ініціалізації.

UNIT M;


INTERFACE

IMPLEMENTATION

END.

Заголовок модуля починається із зарезервованого слова UNIT, за яким слідує ім'я модуля.


Інтерфейсний розділ позначається словом INTERFACE, після чого при необхідності можуть розташовуватися:

розділ підключення модулів

розділ опису констант

розділ опису типів змінних

розділ опису змінних

розділ заголовків процедур і функцій.

Розділ реалізації починається словом IMPLEMENTATION, який у свою чергу при необхідності може складатися з розділів:

розділ підключення модулів

розділ опису міток

розділ опису констант

розділ опису типів змінних

розділ опису змінних

розділ описів процедур і функцій.
Розділ ініціалізації закінчується, словом END.

У ньому можуть знаходитися оператори, задаючі стартові значення для викликаючої програми.


Використовуючи модулі важливо правильно указувати їх імена.

При підключенні стандартні модулі досить коректно записати їх ідентифікатори в USES.

При розробці власних модулів необхідно пам'ятати деякі особливості:

| не допускається одночасне використання модулів з однаковими іменами;

| ідентифікатор модуля, вказаний в заголовку (UNIT), повинен співпадати з іменами файлів, що містять початковий (.РАS) і об'єктний (.ТРU, .ТРР, .ТРW) код;

| якщо ідентифікатор модуля довший за вісім символів, то він повинен співпадати з іменами файлів по перших восьми символах.


Загальна структура модуля, доповнена коментарями, що пояснюють сенс і призначення кожного розділу модуля.
UNIT Ідентіфікатормодуля;

{ Інтерфейсний розділ }

INTERFACE

{ У цьому розділі описується взаємодія даного модуля з іншими призначеними для користувача і стандартними модулями, а також з головною програмою. Іншими словами — взаємодія модуля з "зовнішнім світом"}


{ Список імпорту інтерфейсного розділу. }

USES {У цьому списку через коми перераховуються ідентифікатори модулів, інформація інтерфейсних частин яких повинна бути доступна в даному модулі.

Тут доцільно описувати ідентифікатори тільки тих модулів, інформація з яких використовується в описах розділу INTERFACE даного модуля.}
{ Список експорту інтерфейсного розділу.}

{Список експорту складається з підрозділів опису констант, типів, змінних, заголовків процедур і функцій, які визначені в даному модулі, але використовувати які дозволено у всіх інших модулях і програмах, що включають ім'я даного модуля в своєму рядку uses. Для процедур і функцій тут описуються тільки заголовки, але з обов'язковим повним описом формальних параметрів.}


UNIT MODUL;

INTERFACE

USES CRT; {імпорт модулів}

CONST N=10; { експорт const, type.}

Type

Tvector =array [1.N] of integer;



Procedure MAX (i: integer, vect: TVector);

Procedure MIN (i: integer, vect: TVector);


{ Розділ реалізації }

IMPLEMENTATION

{ У цьому розділі указується реалізаційна (особиста) частина описів даного модуля, яка недоступна для інших модулів і програм. Іншими словами — "особиста частина" модуля.}


{ Список імпорту розділу реалізації.}

{ У цьому списку через коми перераховуються ідентифікатори модулів, інформація інтерфейсних частин яких повинна бути доступна в даному модулі.

Тут доцільно описувати ідентифікатори всіх необхідних модулів, інформація з яких не використовується в описах розділу INTERFACE даного модуля і про використання яких не повинен звати жоден інший модуль}.


{ Підрозділи внутрішніх для модуля описів.}

{ У цих підрозділах описуються мітки, константи, типи, змінні, процедури і функції, які описують алгоритмічні дії, що виконуються даним модулем, і які є "особистою власністю" виключно тільки даного модуля. Ці описи недоступні жодному іншому модулю. Заголовки процедур і функцій в цьому підрозділі допускається указувати без списку формальних параметрів. Якщо Заголовки вказані все ж таки з параметрами, то список формальних параметрів повинен бути ідентичний такому ж списку для відповідної процедури (функції) в розділі INTERFACE}

{ Розділ ініціалізації}

Розділ ініціалізації завершує текст модуля, якщо він відсутній, то ставиться слово ‘END.’ Після розділу реалізації. Інакше ставиться слово BEGIN.

Зазвичай в розділі ініціалізації відбувається заповнення початковими (стартовими) значеннями бібліотечних змінних і які-небудь одноразові дії, які повинні виконуватися на початку програми.
Приклад модуля користувача.
UNIT MODUL;

INTERFACE

USES CRT; {імпорт модулів}

CONST N=10; { експорт const, type.}

Type

Tvector=array[1.N] of integer;



Procedure MAX (N: integer, vect: TVector);

Procedure MIN (N: integer, vect: TVector);

IMPLEMENTATION

USES PRINTER;

Procedure PRINTVECT (N: integer, vect: TVector);

{ заголовки описуються повністю (з параметрами)}

Var i: integer;

Begin


For i: =1 to N do write (vect’ [i] ‘);

End;


{ процедури, заголовки які описані в розділі Interface}

Procedure MAX (N; integer, Vect: tvector);

Var MAX: integer;

i: integer;

Begin

MAX: = VECT [1];



For i:=2 to N do

If Vect [i]>MAX then MAX: =Vect [i];

Clrscr;

PRINTVECT (N, Vect);



WRITELN (‘MAX=’, MAX);

End;


Procedure MIN (N; integer, Vect: TVector);

Var MIN: integer;

i: integer;

Begin


MIN: = VECT [1];

For i: =2 to N do

If Vect [i]

Clrscr;


PRINTVECT (N, Vect);

WRITELN (‘MIN=’, MIN);

End;
Компіляція і використання модулів.
Оскільки модуль не є безпосередньо виконуваною одиницею, то в результаті його компіляції утворюється дисковий файл з розширенням .TPU (Turbo Pascal Unit), при цьому ім'я файлу повинне співпадати з ім'ям модуля. Для доступу до інтерфейсних об'єктів модуля, необхідно вказати в програмі в описовій частині ім'я потрібне .TPU

USES U1, U2, U3;

Якщо деякий модуль використовує об'єкти іншого модуля, то така специфікація повинна йти відразу після службового слова interface.

Традиційні правила сфери дії глобальних і локальних змінних не працюють.



  1. Якщо ідентифікатори інтерфейсної частини модуля частково перетинаються з ідентифікаторами основної програми, то в цьому випадку діє правило: ідентифікатори модуля, описані в USES-сриску.

Program P;

USES U1, U2;

...

UNIT U1;


Interface

Var x: integer;

Implementation

...


End.

PROGRAMP;

USES U1;

VAR x: real;

Begin . end.
Для того, щоб в програмі Р мати доступ до інтерфейсних змінних х модуля U1 потрібно задати складове ім’я:

U1.x – звернення до ідентифікатора х модуля U1;

Х – обращение до ідентифікатора х програми Р.


  1. Непрямий виклик модулів

UNIT A UNIT B

INTERFACE INTERFACE

... USES A;

END. ... END.


Якщо програма використовує модуль В, то потрібно вказати ім'я модуля безпосередньо використовувне в програмі.

Program P;

USES B;

. END.



  1. Взаємний виклик модулів.

Модуль U1 використовує що-небудь з модуля U2, а U2 звертається до U1.
UNIT U1; UNIT U2;

INTERFACE INTERFACE

USES U2; USES U1;

... END. ... END.

Ця проблема вирішується програмним шляхом. Вводиться третій модуль, і поміщаються в нього всі типи, змінні або підпрограми з двох модулів, які посилаються один на одного, а з U1 і U2 ці загальні типи, змінні і підпрограми видаляються.

Мовна конструкція "модуль" була спеціально розроблена, щоб уникнути впливу глобальних змінних, оголошених в головній програмі, на внутрішні описи модуля.

Тому, якщо все-таки виникає необхідність ввести які-небудь доступні для всіх блоків програми описи (тобто глобальні описи), то для модулів це можна зробити тільки одним способом — створити спеціальний модуль глобальних оголошень.

0

UNIT COMMON;



INTERFACE

TYPE


ComTArray= array [1…100] of byte;

CONST


MAXSIZE=100;

VAR


ComArray : ComTArray;

IMPLEMENTATION

END.

Модуль COMMON підключається директивою USES всюди, де вимагається звернення до загальних змінних і констант.


При трансляції програми, що використовує модуль користувача, компілятор шукає TPU-файл з ім'ям, заданим в USES-специфікації.

Наприклад, USES MYUNIT;



Перед трансляцією програми компілятор знаходить дисковий файл з ім'ям MYUNIT.TPU, у якому знаходиться код модуля із заголовком UNIT MYUNIT;

При перерахуванні кодів модулів в директиві USES спочатку перераховуються стандартні модулі (SYSTEM, DOS, CRT, GRAPH, OVERLAY, PRINTER), а потім модулі користувача.


База даних захищена авторським правом ©lecture.in.ua 2016
звернутися до адміністрації

    Головна сторінка