- •Передмова
- •Тема 1: Правила техніки безпеки при роботі з комп’ютером
- •Тема 2: Алфавіт. Ідентифікатори. Константи. Вирази
- •Тема 3: Загальна структура і розділи Pascal-програми
- •Тема 4: Введення і виведення у Pascal-і. Форматоване виведення
- •Тема 5: Прості (скалярні) типи данних
- •Тема 6: Завантаження середовища Турбо Паскаль. Функціональні клавіші
- •Тема 7: Меню опції
- •Тема 8: Вираження і пріоритет операцій. Стандартні математичні функції та процедури
- •Тема 9: Умовний оператор. Вкладений умовний оператор
- •Тема 10: Оператор вибору
- •Тема 11: Оператори циклу. Оператор циклу з параметром
- •Тема 12: Оператор циклу з перед- і з постумовою
- •Тема 13: Складні типи. Масиви
- •Тема 14: Багатомірні масиви
- •Тема 15: Пошук і сортування елементів масиву. Класи алгоритмів сортування
- •Тема 16: Динамічна пам'ять. Адреси і покажчики
- •Тема 17: Оголошення покажчиків, виділення та звільнення динамічної пам’яті
- •Тема 18: Процедури та функції для роботи з динамічною пам’яттю
- •Тема 19: Символьний тип даних. Упаковані масиви
- •Тема 20: Процедури та функції для обробки рядків
- •Тема 21: Структурований тип даних - безліч
- •Тема 22: Структурований тип даних – записи
- •Тема 23: Опис файлових змінних. Обробка типізованих файлів
- •Тема 24: Послідовний та прямий доступ до файлів
- •Тема 25: Обробка не типізованих файлів
- •Тема 26: Робота з текстовими файлами
- •Тема 27: Типізовані константи
- •Тема 28: Поняття та робота з процедурами та функціями
- •Тема 29: Використання модуля crt. Програмування клавіатури
- •Тема 30: Використання модуля crt. Текстове виведення на екран. Програмування звукового генератора
- •Тема 31: Графічні можливості tp 7.0. Використання бібліотеки Graph
- •Тема 32: Бібліотечні модулі користувача
- •Тема 33: Основні принципи ооп. Створення об’єктів. Використання об’єктів
- •Список літератури
- •Додаток а (довідковий) Основні алгоритми обробки масивів
- •Додаток б (довідковий) Питання перевірки знань з теорії
- •Додаток в (довідковий) Поширені коди клавіш
- •Додаток д (довідковий) Коди сканування клавіатури
Тема 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?