Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Labtp_12_ssylki.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
102.4 Кб
Скачать

Л.В. Рибакова Модуль 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) - звільняє пам'ять, зайняту блоками, що розташовані физично вище (адреси їхнього початку більше) вказівника Р.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]