русс | укр

Мови програмуванняВідео уроки php mysqlПаскальСіАсемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование


Linux Unix Алгоритмічні мови Архітектура мікроконтролерів Введення в розробку розподілених інформаційних систем Дискретна математика Інформаційне обслуговування користувачів Інформація та моделювання в управлінні виробництвом Комп'ютерна графіка Лекції


Посилання. Динамічні структури


Дата додавання: 2014-05-08; переглядів: 1126.


 

1) Визначення.

2) Операція роз’іменування.

3) Використання „кучі”.

 

Змінні, розглянуті раніше, називаються статичними, тому, що пам¢ять для них відводиться в процесі трансляції програми. Всі змінні, що об¢являються в програмі, розміщуються в одній неперервній області пам¢яті, яка називається сегментом даних. Розмір сегменту обмежений. Це може не дозволити обробляти великі масиви даних. Для рішення цього питання використовується динамічна пам¢ять.

Динамічна пам¢ять - це оперативна пам¢ять, яка відводиться програмі під час її роботи за виключенням сегменту даних, стеку і тіла програми. Динамічне розміщення даних означає використання динамічної пам¢яті для розміщення даних під час роботи програми.

За допомогою динамічної пам¢яті можна формувати динамічні структури даних. Динамічними структурами даних вважаються такі, розмір яких в процесі роботи попередньо не відомий або змінюється і для яких місце в пам’яті комп’ютера відводиться під час виконання програми.

Основний механізм організації динамічних даних - виділення в спеціальній області пам’яті, "кучі", безперервної ділянки потрібного розміру і зберігання адреси початку цієї ділянки в спеціальній змінній. Такі змінні мають посилальний тип і називаються посиланнями.

 

Формат визначення типу:

TYPE

< ім’я посилального типу>=^<ім’я барового типу>;

 

Формат визначення посилальної змінної:

<ім’я змінної>:^<ім’я базового типу>;

<ім’я змінної>:<ім’я посилального типу>;

 

Наприклад:

TYPE

TM=array [1..50] of real;

TZ=record

A,b,c:real;

End;

TPi=^integer;

TPr=^real;

TPm=^TM;

TPz=^TZ;

Відповідні змінні:

VAR

i:TPi;

r:TPr;

mas:TPm;

z:TPz;

b:^byte;

 

Всі посилальні змінні мають однаковий розмір, рівний 4 байтам, і містять адресу початку ділянки оперативної пам’яті, в якій розміщується динамічна структура даних.

Щоб посилання ні на що не вказувало, змінній присвоюється значення NIL.

 

Операція роз’іменування

 

Щоб отримати значення, на яке вказує посилання, потрібно виконати операцію роз’іменування.

Ця операція позначається символом " ^ " який записується після імені посилальної змінної.

Якщо J - посилальна змінна, то J^ - значення, на яке вказувало посилання.

Посилання можуть зрівнюватись між собою.

Посилання на структури індексуються для масивів і поділяються на поля для записів та об’єктів.

MAS^[і] - доступ до і-го елементу динамічного масиву.

REC^.<ім’я поля> - доступ до поля запису або об’єкту.

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

 

Використання „кучі”

Для роботи з динамічними змінними їх завжди необхідно спочатку розмістити в пам’яті. Для розміщення динамічних змінних використовується "куча". Місце для даних в "кучі" відводиться тільки під час роботи програм.

Програма на TP може сама призначати розмір "кучі" для своєї роботи .

Для цього використовується директива компілятора

{$M<розмiр стеку>,<min кучі>,<max кучі>}

Якщо директива $M не вказана , то використовується вся вільна пам’ять.

 

Процедури керування кучею:

Процедура або функція Дія
NEW(P) Відводить місце для динамічної змінної P^ і присвоює її адресу посиланню P
NEW(<тип посилання>) Функція створює динамічну змінну заданого базового типу.
DISPОSE(P) Знищує зв’язок між посиланням P та областю пам’яті на яку вона вказувала
GETMЕМ(P,<розмір>) Відводить місце вказаного розміру в кучі і його адресу присвоює P.
FREEMEM(P,<розмір>) Звільняє пам’ять вказаного розміру, починаючи з адреси, вказаної в P
MARK(P) Запам’ятовує в P поточний стан кучі
RELEASE(P) Повертає кучу в стан, що був запам’ятований в MARK
MaxAvail Функція, повертає розмір в байтах самого більшого простору в кучі
MemAvail Функція, повертає суму всіх просторів в кучі

 



<== попередня лекція | наступна лекція ==>
Послідовний та прямий доступ до файлів Pascal | Розробка програм з використанням посилань


Онлайн система числення Калькулятор онлайн звичайний Науковий калькулятор онлайн