Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП_самостійне_опрацюв.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
1.22 Mб
Скачать

Процедури і функції для роботи з динамічною пам'яттю

Нижче приводиться опис як вже розглянутих процедур і функцій Object Pascal, так і деяких інших, які можуть виявитися корисними при зверненні до динамічної пам'яті.

Function Addr(X): Pointer; – Повертає адресу аргументу X. Аналогічний результат повертає операція @

Procedure Dispose (var P: Pointer); – Повертає в купу фрагмент динамічної пам'яті, який раніше був зарезервований за покажчиком P, що типізується

Procedure Free-Mem(var P: Pointer; Size: Integer); – Повертає в купу фрагмент динамічної пам'яті, який раніше був зарезервований за покажчиком Р, що нетипізується

Procedure Get-Mem(var P: Pointer; Size: Integer); – Резервує за покажчиком Р фрагмент динамічної пам'яті необхідного розміру Size, що нетипізується

Procedure New(var P: Pointer); – Резервує фрагмент купи для розміщення змінної і поміщає в покажчик, що типізується, Р адресу першого байта

Function SizeOf(X): Integer; – Повертає довжину в байтах внутрішнього представлення вказаного об'єкту Х

Процедурні типи

Основне призначення процедурних типів – дати програмістові гнучкі засоби|кошти| передачі функцій і процедур як фактичні параметри звернення до інших процедур і функцій.

Для оголошення процедурного типу|типа| використовується заголовок процедури (функції), в якому опускається її ім'я, наприклад:

type|

Proc1 = Procedure (а, b, з: Real; var d: Real);

Proc2 = Procedure (var а, b);

Рroc3 = Procedure;

Func1| = Function|: String|;

Func2 = Function (var s: String): Real;

Як видно|показний| з|із| приведених прикладів|зразків|, існує два процедурні типи: тип-процедура і тип-функція.

У наступний|слідуючий| програмі ілюструється механізм передачі процедур як фактичні параметри виклику. Програма виводить на екран таблицю двох функцій: sin1|(х)=(sin|(x)+1)*Ехр(-х) і cos1|(x)=(Cos|(x)+1)*Ехр(-х). Обчислення|підрахунок| і друк|печатка| значень цих функцій реалізуються в процедурі printFunc|, якою як параметри передається кількість np| обчислень|підрахунків| функції в діапазоні х від 0 до 2*3.141592 і ім'я потрібної функції.

Function Sinl(X: Real): Real;

begin|

Result := (Sin(X)+ 1) * Exp(-X) end; // Sin1

Function Cosl(X: Real): Real;

begin|

Result := (Cos(X)+ 1) * Exp(-X) end; // Cos1

procedure TfmExample.bbRunClick(Sender: TObject);

type|

Func = function (X: Real): Real; // Процедурний тип

Procedure PrintFunc(NP: Integer; F; Func);

var|

i: Integer|;

X: Real|;

begin|

for i := 0 to NP do

begin|

X:=k*2*pi/ NP|;

mmOutput|.Lines.Add(FloatToStrF|(X, ffExponent|, 10, 2)+ #9#9| + FloatToStrF|(F(X), ffExponent|, 10, 2)) ;

end|;

end; // PrintFunc

begin // bbRunClick

nmiOutput|.Lines.Add(#9'Функція| SINI|:');

PrintFunc| (10, Sin1|);

mmOutput|.Lines.Add(#9'Функція| COSI|:');

PrintFunc| (10, Cos1|);

end|;

Зверніть увагу: передавані підпрограми не можуть бути локальними, тобто процедурами або функціями, оголошеними усередині|всередині| іншої підпрограми. От чому|ось чому| опис підпрограми sin1| і cos1| розміщуються поза|зовні| обробником bbRunclick|, але|та| не вище по тексту модуля. Відмічу|помічу|, що символ #9| – це символ табуляції. який вставляється у формовані рядки для розділення|поділу| колонок з|із| цифрами.

У програмі можуть бути оголошені змінні процедурних типів, наприклад, так:

var|

p1| : Proc1|;

fl|, f2| : Func2|;

ар : array [1..N] of Proc1;

Змінним процедурних типів допускається привласнювати як значення імена відповідних підпрограм. Після|потім| такого привласнення ім'я змінної стає синонімом імені підпрограми.

Питання для самоконтролю:

  1. Що таке динамічна пам'ять?

  2. Що називається вказівником?

  3. Як вони описуються?

  4. Яка функція виділяє динамічну пам'ять?

  5. Назвіть процедури і функції для роботи з динамічною пам’яттю?

  6. Яке основне призначення процедурних типів?

  7. Яким чином оголошуються процедурні типи?

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]