Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОП Конспект лекций - Паскаль.doc
Скачиваний:
20
Добавлен:
30.11.2018
Размер:
1.46 Mб
Скачать

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

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

Функція ADDR.

Повертає результат типа POINTER, в якому міститься адреса аргументу.

Звернення: ADDR ( X )

тут Х- будь-який об'єкт програми (ім'я будь-якої змінної, процедури, функції). Повертана адреса сумісна з покажчиком будь-якого типа. Відзначимо, що аналогічний результат повертає операція @ .

Функція CSEG.

Повертає значення, що зберігається в регістрі CS мікропроцесора на початку роботи програми в регістрі CS міститься сегмент початку кода програми).

Звернення: CSEG

Результат повертається в слові типа WORD.

Процедура DISPOSE.

Повертає в купу фрагмент динамічної пам'яті, який раніше був зарезервований за покажчиком, що типізувався.

Звернення: DISPOSE(TP)

тут ТР - покажчик, що типізується. При повторному використанні процедури стосовно вже звільненого фрагмента виникає помилка періоду виконання. При звільненні динамічних об'єктів можна вказувати другим параметром звернення до DISPOSE ім'я деструкції (детальніше за див. гл.10).

Функція DSEG.

Повертає значення, що зберігається в регістрі DS мікропроцесора (на початку роботи програми в регістрі DS міститься сегмент почала даних програми).

Звернення: DSEG

Результат повертається в слові типа WORD.

Процедура FREEMEM.

Повертає в купу фрагмент динамічної пам'яті, який раніше був зарезервований за покажчиком, що не типізувався.

Звернення: FREEMEM ( Р, SIZE )

тут Р - покажчик, що не типізується;

SIZE - довжина в байтах фрагмента, що звільняється.

При повторному використанні процедури стосовно вже звільненого фрагмента виникає помилка періоду виконання.

Процедура GETMEM.

Резервує за покажчиком, що не типізується, фрагмент динамічної пам'яті необхідного розміру.

Звернення: GETMEM ( Р, SIZE )

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

Процедура MARK.

Запам'ятовує поточне значення покажчика купи HEAPPTR.

Звернення: MARK ( PTR )

тут PTR - покажчик будь-якого типа, в якому буде повернено поточне значення HEAPPTR. Використовується спільно з процедурою RELEASE для звільнення частини купи.

Функція MAXAVAIL.

Повертає розмір в байтах найбільшої безперервної ділянки купи.

Звернення: MAXAVAIL

Результат має типа LONGINT. За один виклик процедури NEW або GETMEM не можна зарезервувати пам'яті більше, ніж значення, повертане цією функцією.

Функція MEMAVAIL.

Повертає розмір в байтах найбільшої безперервної ділянки купи.

Звернення: MEMAVAIL

Результат має типа LONGINT.

Процедура NEW.

Резервує фрагмент купи для розміщення змінної.

Звернення: NEW ( ТР )

тут ТР - покажчик, що типізується.

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

Процедура NEW може викликатися як функція. В цьому випадку параметром звернення до неї є тип змінної, що розміщується в купі, а функція NEW повертає значення типа покажчик. Наприклад:

type

Pint =^Integer;

var p: Pint;

begin

p := New(Pint);

......

end.

При розміщенні в динамічній пам'яті об'єкту дозволяється як другий параметр звернення до NEW вказувати ім'я конструктора.

Функція OFS.

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

Виклик: OFS ( X )

тут Х- вираження будь-якого типа або ім'я процедури.

Функція PTR.

Повертає значення типа POINTER по заданому сегменту SEG і зсуву OFS.

Виклик: PTR ( SEG, OFS )

тут SEG - вираження типа WORD, що містить сегмент;

OFS - вираження типа WORD, що містить зсув.

Значення, повертане функцією, сумісно з покажчиком будь-якого типа.

Процедура RELEASE.

Звільняє ділянку купи.

Звернення: RELEASE ( PTR )

тут PTR - покажчик будь-якого типа, в якому заздалегідь було збережено процедурою MARK значення покажчика купи. Звільняється ділянка купи від адреси, що зберігається в PTR, до кінця купи. Одночасно знищується список всіх вільних фрагментів, які, можливо, були створені процедурами DISPOSE або FREEMEM.

Функція SEG.

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

Виклик: SEG ( X )

тут X - вираження будь-якого типа або ім'я процедури.

Функція SIZEOF.

Повертає довжину в байтах внутрішнього представлення вказаного об'єкту.

Виклик: SIZEOF ( X )

тут X - ім'я змінної, функції або типа. Замість константи SIZEOFREAL можна було б використовувати звернення SIZEOF(REAL).

Питання для контролю.

1. Призначення функції ADDR?

2. Призначення функції CSEG?

3. Призначення функції DISPOSE?

4. Призначення функції DSEG?

5. Призначення процедури FREEMEM?

6. Призначення процедури GETMEM?

7. Призначення процедури NEW?

8. Призначення процедури MARK?

9. Призначення процедур MAXAVAIL, MEMAVAIL?

10. Призначення процедури RELEASE?

11. Призначення функції SEG?

12. Призначення функції SIZEOF?