
- •Лабораторна робота №17
- •Теоретичні відомості.
- •Об'являються вказівники так:
- •Операції з вказівниками
- •Процедури для роботи з вказівниками
- •Функції для роботи з вказівниками і адресами
- •1. Приклад програми створення і видалення черги з десяти елементів.
- •2. Приклад програми створення і видалення стека з десяти елементів.
- •Виключення даних із списку
- •Практична частина
Л.В. Рибакова Модуль 4 Лабораторна робота №17
Лабораторна робота №17
ТЕМА: Робота з динамічною пам’яттю. Динамічні зиінні. Ссилочний тип даних . Вказівники.
Мета роботи: Ознайомлення з динамічною структурою даних – чергою, стеком та односпрямованим списком. Отримання навиків роботи зі змінними ссилочного типу. Ознайомлення з можливостями включення та виключенняелементів із черги, стеку, списку.
Теоретичні відомості.
Turbo Pascal дозволяє програмісту запитувати пам'ять динамічно, тобто в міру необхідності. Вся динамічна пам'ять виділяється з хіпа (Heap - купа). Розмір хіпа визначається в директиві компілятора $M {$M 16384,56312, 555360}.
Д
е
:
перше значення – розмір сегмента стека від 1024 до 65535 байт в залаежності від виду підпрограми (Stack size);
друге значення – найменший допустимий розмір Heap в ДРП (Low heap Limit);
третє значення - найбільший допустимий розмір Heap в ДРП (High heap Limit);.
або F10/ Options/Memory Size
Для організації динамічних структур існує спеціальний тип - вказівник. У Turbo Pascal є два види вказівників : вказівник на об'єкт де-якого типу і вказівник, не пов'язаний із типом.
Об'являються вказівники так:
TYPE
DinArr = Array [1. .2] of real;
ArrPtr = ^DinArr;
ListPtr = ^List;
List = Record
Fl1: string[22];
Fl2: Real;
Fl3: Array[1. .6] of byte;
Next:ListPtr;
end;
Var
X1 : ArrPtr;
In1Ptr,In2Ptr: ^Integer;
Chain: ListPtr;
P1,P2 :Pointer;
Тип Pointer утворює вказівник, не пов'язаний із типом, а конструкція
<змінна> : ^ <ім'я типу>; - вказівник на заданий тип.
При роботі з динамічною змінною, що знаходиться в пам'яті, на яку вказує вказівник використовується конструкція
<ім'я типу>^.
Приклад:
X1^[1]:=1.23; {першому елементу масиву привласнити значення 1.23}
X1^[i+j*n]:=X1^[3+i]; {елементу i+j*n привласнити значення елемента 3+i }
IntPtr^:=3; {Цілому числу, на яке вказує IntPtr привласнити значення 3}
Whith Chain^ do {полям запису на який указує Chain присвоїти
Begin відповідні значення}
Fl1: = 'abcdf';
Fl2: = 23+3. 24e;
For i: = 1 to 6 do Fl3 [i]: =i+4-6;
Chain:=Next;
end;
Операції з вказівниками
Для вказівників припустимі тільки операції присвоювання і порівняння. Вказівнику можна привласнити тільки вміст іншого вказівника такого ж самого типу або константу Nil ("порожній" вказівник), або адресу об'єкта за допомогою функції Addr, або оператора @, або адресу, побудовану функцією Ptr.
Приклад:
Chain:=Nil;
In1Ptr:=In2Ptr;
P1:=@xxx; {P1:=Adar(xxx)}
P2:=Ptr($B800,Offset);
Процедури для роботи з вказівниками
New(var P:Pointer) - створює нову динамічну змінну того типу, на який посилається вказівник, і адреса початку виділеної області повертається в Р. Ця процедура еквівалентна GetMem(P;SizeOf(P^));
Dispose(var P:Pointer) - знищує динамічну змінну, на яку вказує Р. Вона еквівалентна FreeMem(P;SizeOf(P^));
GetMem(var P:Pointer;Size:Word) - виділяє з хіпа блок пам'яті заданого розміру, і адресу його початку присвоює вказівнику Р. Размір блоку вказується в байта, (максимальний розмір, що може бути отриманий, - 65521 байт).
FreeMem(var P:Pointer;Size:Word) - звільняє блок пам'яті, який адресується вказівником Р і розміром Size байт.
Mark(var P:Pointer) - запам'ятовує поточну вершину хіпа (адресу початку фізично останнього вільного блока в хіпі) для наступного звільнення блоків пам'яті, розташованих після цього вказівника.
Release(var P:Pointer) - звільняє пам'ять, зайняту блоками, що розташовані физично вище (адреси їхнього початку більше) вказівника Р.