Лекція 15 робота з динамічними структурами даних



Скачати 50.03 Kb.
Дата конвертації05.05.2017
Розмір50.03 Kb.
ЛЕКЦІЯ 15
РОБОТА З ДИНАМІЧНИМИ СТРУКТУРАМИ ДАНИХ
Дані статичної структури – це дані, взаєморозташування і взаємозв'язки елементів яких завжди залишаються постійними.

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


РОЗПОДІЛ ПАМ'ЯТІ

При оголошенні даних динамічної структури в розділі описів указується не сама змінна якого-небудь типу, а покажчик (посилання) на неї. В результаті покажчик буде звичайною змінною, а змінна на яку він указує — динамічною.

Var

P : ^ char;



Begin

P:= ‘ A’; ..

End.
Використання ідентифікатора покажчика в програмі означає звернення до адреси елементу пам'яті, на яку він вказує. Щоб звернутися до вмісту осередку, на який вказує покажчик, потрібно після його ідентифікатора поставити символ ^. Ця операція називається операцією розіменування.

Виділення і звільнення пам'яті під динамічні змінні виконується стандартними процедурами New, Dispose, Getmem, Freemem під час роботи програми.


Процедура New.

Procedure New( var p: pointer);

Створює нову динамічну змінну і встановлює на неї покажчик. Параметр p є змінною-покажчиком і відноситься до покажчиків будь-якого типу. Розмір блоку пам'яті, що виділяється, відповідає розміру того типу, на який указує покажчик р.
Процедура Dispose.

Procedure Dispose ( var p: pointer);

Знищує динамічну змінну, на яку вказує покажчик р.
Процедура Getmem.

Procedure Getmem ( var p: pointer; Size: word);

Створює нову динамічну змінну вказаного розміру і поміщає адресу блоку в змінну покажчик.

Параметр р є змінною-покажчиком і може відноситися до будь-якого типу покажчиків. Параметр Size задає розмір (у байтах) області пам'яті, що виділяється для динамічної змінної. На знов створену змінну можна посилатися за допомогою р^.


Процедура Freemem.

Procedure Freemem( var p: pointer; Size: word);

Знищує динамічну змінну даного розміру.

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

Параметр Size задає розмір знищуваної динамічної змінної (у байтах). Його значення повинне відповідати числу байтів пам'яті, відведених раніше для змінною процедурою Getmem. Процедура Freemem знищує змінну, на яку указує покажчик р, і звільняє зайняту нею область пам'яті в динамічно розподілюваній області.
Вказівна змінна може бути в трьох станах.

1. Містити адресу якої-небудь змінної, пам'ять під яку вже виділена.

2. Містити спеціальну порожню адресу nil.

3. Знаходитися в невизначеному стані.


У невизначеному стані покажчик буває на початку роботи програми до першого привласнення йому або конкретної адреси, або порожньої адреси nil, а також після звільнення області пам'яті, на яку він указує.
ПРОСТІ ДІЇ З ПОКАЖЧИКАМИ


  1. Оголошення

Type

P : ^ integer;

Var

A, B : P;


2. Виділення пам'яті

New(A);


New(B);
3. Введення даних

A^:=1;


B^:=5;
4. Копіювання даних

A^ := B^;


5. Копіювання адреси

A := B;
6. Звільнення області пам'яті

Dispose (A);
7.Встановлюється в стан nil;

B := nil;


Процедура New(A) виділяє область пам'яті відповідно тому типу, який описаний для покажчика А і записує адресу виділеної пам'яті в покажчик.

Процедура Dispose (А) звільняє область пам'яті, на яку указує покажчик А, після чого ця область пам'яті стає доступною для розподілу під інші динамічні змінні.


НЕЗВ'ЯЗАНІ ДИНАМІЧНІ ДАНІ
Незв'язані динамічні дані класифікуються точно також як і статичні, і робота з ними виконується аналогічно. Динамічні властивості незв'язаних динамічних даних виражаються тільки в тому, що вони можуть "з'являтися" і "зникати" під час роботи програми. Відмінності використання таких даних полягають в двох аспектах:

| у розділі Var оголошується не змінна необхідного типу, а покажчик на цей тип;

| перед використанням необхідно викликати процедуру New, а після використання — процедуру Dispose.

Як приклад приведемо порівняння роботи з аналогічними статичними і незв'язаними динамічними даними.


Проста змінна.

Статична:

Type

A : integer;



B : char;

Begin


A:=7:

B:=’E’;


..

End.
Динамічна:

Type

A : ^integer;



B : ^char;

Begin


New(A);

New(B);


A^:=7:

B^:=’E’;


..

Dispose (A);

Dispose (B);

End.
Статична структура масив:

Type

Massive = array [1..5] of byte;



Var

M : Massive;

I:byte;

Begin


For i:=1 to 5 do

Read(m[i]);

..

End.
Динамічна структура масив:



Type

Massive = array [1..5] of byte;

Var

PM : ^Massive;



I:byte;

Begin


New(PM);

For i:=1 to 5 do

Read(pm^[i]);

..

End.


Статична структура запис:

Type


ZAP: record

A: real;


B:char;

End;


Var

Z : ZAP;


Begin

Z.A := 7.45;

Z.B := ‘ R’;

..

End.


Динамічна структура запис:

Type


ZAP: record

A: real;


B:char;

End;


Var

Z : ^ZAP;

Begin

New(Z);


Z^.A := 7.45;

Z^.B := ‘ R’;



..

Dispose(Z);



End.


База даних захищена авторським правом ©lecture.in.ua 2016
звернутися до адміністрації

    Головна сторінка