АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

New ( P1 ); New ( Р2 );

де P1 і Р2 - імена вказівників на динамічні об'єкти.

Begin

New(P1);

New(P2);

….

End;

В цьому прикладі після виконання команди New(P1)вказівник Р1 дістає значення рівне тому, яке досі мав вказівник HeapPtr, а значення вказівника HeapPtrбуде збільшене на 2, оскільки довжина внутрішнього представлення типу INTEGER, з яким зв’язаний вказівник Р1, дорівнює 2 байти. Оператор New(P2) викликає виділення блоку пам’яті довжиною 256 байтів і зміщення вказівника HeapPtr на цю ж величину вгору. Якщо вказівник посилається на тип даних, для якого потрібно пам’яті більше, аніж доступно для розподілу в Heap-області, то в цьому випадку відбувається помилка виконання програми. Процедура New може бути використана в якості функції, що повертає вказівник конкретного типу даних. Наприклад, якщо змінна P1 має тип даних, визначений як ^Integer, а змінна P1Int – тип даних Р1, то наступні два оператори New(P1Int); P1Int:=New(P1); еквівалентні. Після того, як вказівник здобув якесь значення, тобто став вказувати на конкретний фізичний байт пам’яті, то за цією адресою можна розмістити будь-яке значення відповідного типу даних VAR P1,P2:^Integer; …. Begin New(P1); New(P2); P1^:=7; P1^:=7*4; End.
     

New може використовуватися також як функція, яка повертає значення вказівника.

Наприклад:

P1:= New (Pobjname);

де Pobjname - ім'я типу вказівника динамічного об'єкту.

Звернення до змінної - екземпляру об'єкту за допомогою вказівника проводиться у вигляді Р1^ або Р2^.

Виклики методів проводяться звичайним способом.

Наприклад: Р1^.МЕТ2;

Якщо динамічний об'єкт містить віртуальні методи, він повинен ініціалізуватися за допомогою виклику конструктора.

Наприклад: P1^.INIT; P2^.INIT;

Якщо конструктор не може розмістити динамічний об'єкт ОП, то він повертає "порожній" вказівник, наприклад: P1 = NIL.

Для роботи з динамічними об'єктами, що містять віртуальні методи, Паскаль має процедури NEW і DISPOSE з розширеними можливостями. Розширений синтаксис процедури New дозволяє виділяти з купи ОП для об'єкту і ініціалізувати сам об'єкт за допомогою виклику його конструктора. Для цього процедура New викликається з двома параметрами: ім'ям вказівника і ім'ям конструктора.

Наприклад: New (P1,init); New(P2,init);.

Параметр INIT виконує виклик конструктора і ініціалізацію динамічного об'єкту.

Для роботи з нетипізованими вказівниками можна використовувати процеду­ри GetMem і FreeMem.

Процедура GetMem виділяє область динамічної пам'яті заданого обсягу. Початкова адреса області пам'яті, яка буде виділена, запам'ятовується у вказівнику, що є параметром процедури.

Виклик процедури GetMem має такий синтаксис:

GetMem (<ідентифікатор вказівника>,<обсяг пам'яті>);

Тут <ідентифікатор вказівника> - змінна типу pointer;

<обсяг пам'яті> — змінна або вираз типу word.

Обсяг пам'яті задається в байтах. Обсяг пам'яті, що виділяється для однієї динамічної змінної, не може перевищувати 65 521 байт.

Крім того, не можна виділяти ділянок пам'яті, довжина яких перевищує довжину найбільшої вільної ділянки в купі, що її повертає функція MaxAvail. Тому для забезпечення коректності роботи процедури GetMem бажано перед її викликом перевіряти наяв­ність достатньо великої вільної ділянки пам'яті if MaxAvail>9999 then GetMem(ptr.10000) else Write(‘No sufficient memory');
     

Зазначимо, що загальний обсяг усіх вільних ділянок динамічної пам'яті об­числює функція MemAvail.


1 | 2 | 3 | 4 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.003 сек.)