- •2.1.1 Підпрограми-процедури
- •2.1.2 Підпрограми функції
- •2.2 Бібліотеки
- •2.2.1 Основні поняття
- •2.2.2 Залучення бібліотек до проекту
- •Наведемо приклад залучення бібліотеки для обчислення iнтеграла
- •2.2.3 Структура власної бібліотеки
- •2 Створити вектор х, як суми елементів рядків.
- •2.2.4 Послідовність створення файла бібліотеки
- •3 Приклад проекту з власною бібліотекою
- •4. Контрольні запитання
- •8Які елементи мови Object Pascal можна використовувати у вигляді формальних, а які − у вигляді фактичних параметрів?
- •9Чи визначає ім’я підпрограми-функції її тип?
- •Чи все є правильно в цьому фрагменті? а якщо − нi, то як його виправити?
- •5. Лабораторне завдання
- •Варіанти індивідуальних завдань
Наведемо приклад залучення бібліотеки для обчислення iнтеграла
(коефiцiєнт k = 0.75471), котре виконується пiдпрограмою Psimps бiблiотеки Pvm . У бібліотеці Pvm підпрограма Psimps оголошено у такий спосіб:
procedure Psimps(a,b:real; f : ftype; eps : real; var : real; var ier : integer);
Тут a, b визначають промiжок iнтегрування, eps - бажана точнiсть (похибка) віднайдення iнтеграла, y − значення iнтеграла (результат) i ier - код завершення пiдпрограми Psimps (за успiшного завершення ier = 0), Ftype − ім’я типу пiдiнтегральної функцiї:
Type Ftype = function( x : real ) : real;
Фрагменти програми мають вигляд:
{$F+}
Unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;
…………………
implementation
{$R *.dfm}
Uses PVM ;
Function fun ( x : real ) : real;
Const k = 0.75471;
Begin
fun:=1/sqrt(1-sqr(k*sin(x)))
end;
// головна програма
procedure Tform1.Button1Click(Sender: Tobject);
Var Eps, R: real; IER : integer;
Begin
…………………..
psimps( 0, 1, fun, eps, r, ier );
…………………………
End;
Звернiть увагу на перший рядок цiєї програми: {$F+}. Це так звана директива компiлятора (транслятора) Object Pascal. Вона забезпечує можливiсть вживати iмена пiдпрограм як фактичнi параметри у викликах iнших пiдпрограм. У нашому прикладi iм'я пiдпрограми fun, яка обчислює пiдiнтегральну функцiю, слугує фактичним параметром у виклику процедури Psimps. В загальному випадку дiє наступне.
Правило. Якщо виклик будь-якої функцiї чи процедури мiстить iм'я iншої функцiї чи процедури як фактичний параметр, на початку головної програми слiд поставити директиву {$F+} .1)
2.2.3 Структура власної бібліотеки
Структура Pascal-тексту бiблiотеки повинна бути такою:
unit <iм'я бiблiотеки>;
interface
< перелiк заголовкiв, залучених у бiблiотеку пiдпрограм
(тобто iмен цих пiдпрограм з описаннями їхніх параметрiв),
а також бiблiотечних констант, змiнних i типiв >
implementation
<повнi тексти перелiчених у роздiлi interface
бiблiотечних пiдпрограм >
begin
<оператори (їх може й не бути), якi необхiдно виконати
перед звертанням до будь-якої бiблiотечної пiдпрограми>
end.
Отже, першим оператором у текстi бiблiотеки повинен бути оператор: unit <iм'я бiблiотеки>. Разом з тим за правилами трансляцiї будь-яких програм iм'я файла-результату пiсля трансляцiї збiгатиметься з iменем файла, який мiстив вихiдний текст програми.
Зауваження. Зберiгайте модуль тексту бiблiотеки у файлi (з розширенням .pas), iм'я якого збiгається з iменем бібліотеки, вказаним в операторi unit.
Частина бiблiотеки вiд слова interface до слова implementation має назву роздiл iнтерфейсу (слово interface тут найкраще перекласти як "стик" − саме через роздiл iнтерфейсу "зовнiшнi" програми "стикаються" з пiдпрограмами бiблiотеки). Частина вiд слова implementation до слова begin називається роздiлом реалiзацiї (implementation означає "здiйснення"). Врештi, назва частини помiж словами begin та end − роздiл iнiцiалiзацiї. Цього останнього роздiлу (але не перших двох!) у бiблiотецi може не бути − i в такому разі можна не писати й слова begin, але слово end. (з крапкою) є обов'язковим.
Наведемо приклад ситуацiї, за якої цей роздiл мiг би з'явитися. Нехай ми складаємо бiблiотеку пiдпрограм, кожна з яких з певною метою використовує випадковi числа. Отже, яку б з цих пiдпрограм ви не викликали у своїй про-грамi, перед цим викликом треба iнiціалiзувати генератор псевдовипадкових чисел. У Pascal "запускання" цього генератора виконує процедура (без пара-метрiв) Randomize. Замiсть того, щоб cтавити виклик цiєї процедури на початку кожної бiблiотечної програми, доцiльно один раз викликати її у роздiлi iнiцiалiзацiї бiблiотеки:
unit . . .
interface
…………………..
implementation
…………………..
{ кiнець роздiлу implementation }
begin
randomize
end.
Основними роздiлами бiблiотеки є роздiли iнтерфейсу та реалiзацiї. Може виникнути запитання: для чого потрiбнi два роздiли (адже в роздiлi реалiзацiї повторено й розширено всi записи з роздiлу iнтерфейсу) ? Річ в тім, що до роздiлу iнтерфейсу програмiст − розроблювач бiблiотеки − включає заголовки лише тих пiдпрограм, якi вiн вважає за необхiдне зробити "вiдкритими" для користувачiв бiблiотек. Водночас реалiзацiя цих "вiдкритих" пiдпрограм у роздiлi implementation може вимагати наявностi в ньому деяких iнших, "закри-тих" для користувачiв пiдпрограм. Отже, до роздiлу реалiзацiї можуть входити вiдсутнi в iнтерфейсi пiдпрограми. Як роздiл iнтерфейсу, так i роздiл реалiзацiї можуть, окрiм пiдпрограм, мiстити оголошення констант, типiв та змiнних.
У текстi бiблiотеки можна користуватися константами, типами, змiнними та пiдпрограмами з iнших бiблiотек. Для цього треба написати оператор uses з iменами вiдповiдних бiблiотек одзразу пiсля оператора interface або implementation − в залежностi вiд того, в якому з цих роздiлiв є посилання на "зовнiшнi" бiблiотечнi данi.
Зауваження. Не рекомендується посилатися на бiблiотеку у iнтерфейсi, якщо до неї насправдi звертаються лише у роздiлi implementation. Одним (але не єдиним) негативним наслiдком порушення цiєї рекомендацiї буде зростання довжини бiблiотечного файла.
