Надання значення змінній-показівнику 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Надання значення змінній-показівнику



Надання показівнику значення іншого показівника.

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

NEW(var p:pointer);

За допомогою безпосереднього надання показівнику припустимого значення адреси:

1) Використання оператора @

@ - унарний оператор, що повертає адресу статичної змінної, процедури чи функції, сумісну з типом NIL (тобто з любим типом показівника):

a) використання для змінної - повертає адресу цієї змінної у вигляді <сегмент>:<зміщення>

@<ідентифікатор змінної> <показівник>

b) використання для процедури дозволяє отримати точку входу - адресу, з якої починається її виконання. Використовується для надання керування відповідній процедурі чи функції

@<ідентифікатор процедури, функції> <показівник на точку входу>

2) addr(x):pointer;

x - будь-яка змінна чи ідентифікатор процедури/функції. Результат - показівник на x, сумісний із всіма типами показівників.

3) ptr(<сегмент>,<зміщення>:word):pointer;

функція перетворює надану у вигляді <сегмент>:<зміщення> адресу у показівник

4) seg(x):word

ofs(x):word

x - ідентифікатор змінної, процедури чи функції. Ці функції повертають:

seg - адресу сегменту об'єкту x

ofs - адресу зміщення об'єкту x

5) dseg:word; - функція повертає адресу сегменту даних (вміст регістру ds)

cseg:word; - адресу сегменту коду (регістр cs)

sseg:word; - адресу сегменту стеку (регістр ss).

Надання показівнику значення NIL розриває зв'язок між змінною та показівником, але не знищує самої змінної у динамічній пам'яті. Місце, яке вона займає, залишається зарезервованим і не може бути використано іншими динамічними змінними.

DISPOSE(var p:pointer);

процедура знищує динамічну змінну, на яку посилається показівник p, та повертає пам'ять, що вона займала, до динамічної нерозподіленої пам'яті. Значення показівника р стає невизначеним. Слідкувати за звільненням динамічних змінних слід самостійно.

Утворювати та визволяти динамічні змінні можна також за допомогою іншої пари процедур:

getmem ~ freemem

Але якщо у процедурах NEW - DISPOSE об'єм пам'яті, що виділяється під динамічну змінну, визначається базовим типом показівника, то у процедурах getmem и freemem він визначається безпосередньо, за допомогою додаткового параметра.

getmem(var p:pointer;size:word);

утворює динамічну змінну розміром size

freemem(var p:pointer,size:word);

звільнює динамічну змінну розміром size.

Параметр size повинен дорівнювати відповідному параметру у процедурі getmem.

Блочне визволення пам'яті

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

mark(var p:pointer);

записує поточний стан heap-області у змінну p (фактично записується heaptr)

release(var p:pointer);

повертає динамічну область до попереднього стану через показівник p (тобто heapptr надається значення p)

Процедура release(heaporg); звільняє всю динамічно розподілену пам'ять.

Таким чином, існує декілька засобів утворення та знищення динамічної змінної:

NEW/DISPOSE

NEW/MARK/RELEASE

GETMEM/FREEMEM.

 

 

Опис та використання підпрограм. Реалізація базових алгоритмічних структур процедурною мовою програмування. Опис процедур та функцій процедурною мовою програмування. Реалізація рекурсивних алгоритмів процедурною мовою програмування. Модульне програмування та його реалізація в системах процедурного програмування.

Базові структури алгоритмів (керуючі структури) – це способи керування процесами обробки даних. Комбінуючи керуючі структури, можна складати програми для розв’язання різноманітних задач. Виділяють три базові алгоритмічні конструкції: лінійні алгоритми (послідовне виконання); умова розгалуження; цикли.

Лінійна структура (наступність) передбачає, що тіло алгоритму являє собою послідовність команд, виконуваних одна за іншою поспіль. Умова (розгалуження) – це вид керуючої структури, що передбачає можливість вибору з кількох варіантів, для кожного з яких, залежно від визначеної умови, виконується різна послідовність команд. Цикл – це вид керуючої структури, що дозволяє багаторазово повторити задану послідовність команд.

Розгалуження. У мові Паскаль алгоритм із розгалуженням реалізований за допомогою умовного оператора if або case.

Загальний вигляд умовного оператора if.

if <вираз>

then <оператор 1> або <серія 1>

else <оператор 2> або <серія2>

де <вираз> - будь-який вираз логічного типу (що виробляє в результаті True або False); <оператор 1> і <оператор 2> - оператори мови Паскаль, <серія 1> і <серія 1> - набір операторів мови Паскль.Якщо вираз набуде значення True, то виконується <оператор (серія) 1>, в іншому разі - <оператор (серія) 2>.

Мовою блок-схем ця команда записується у наступному вигляді:

Друга або скорочена форма команди розгалуження:

if < умова > then

begin

<серія>;

end;

Мовою блок-схем вона записується так:

У повній формі команди умовного переходу виконується <серія 1>, якщо умова істинна, і <серія 2>, якщо вона хибна. В скороченій формі - серія виконується тільки у випадку, якщо умова істинна, у протилежному випадку команда розгалуження закінчується і виконується наступний за нею оператор.

Оператор служить для вибору одного з помічених варіантів дії (операторів), залежно від значення "параметра". Оператор має вигляд:

Case "параметр"

"список помічених операторів"

Else "оператор" End;

Тут "параметр" - вираз або змінна порядкового типу.

З "списку помічених операторів" виконується оператор з міткою, що включає значення "параметра", інакше оператор після слова Else. Конструкція Else "оператор" може бути відсутній.

Нагадаємо, що "оператор" може мати вигляд: Begin "оператори" end;

Приклад операторів для визначення порядку цілого числа N від 0 до 999:

case N

0..9: writeln('однозначне');

10..99: writeln('двухначне');

100..999: writeln('трьохзначне')

else writeln('Число "N" не входить у вказаний діапазон') end;

Цикли

1. Безумовний цикл

Якщо заздалегідь відома кількість повторень циклу, то можна скористатися циклом із покроковою зміною аргументу. Його перевагою є стислість і простота запису. Циклічні програми з покроковою зміною аргументу мовою Паскаль реалізовані за допомогою оператора циклу for:

for <лічильник циклу>: = <вираз 1> to <вираз 2> do <тіло циклу>

де <лічильник циклу> - змінна будь-якого типу, <вираз 1> і <вираз 2> - вирази такого самого типу; <тіло циклу> - будь-яка послідовність операторів, що повторюється доти, доки <лічильник циклу> не набере значення <вираз 2>. <Лічильник циклу> збільшується на 1 після кожного виконання циклу. Для його зменшення на 1 зарезервоване слово to змінене на слово downto.

2. Цикл-поки (з передумовою)

До нього входять як базові такі структури: блок перевірки умови Р і блок S, що називається тілом циклу. Блок перевірки умови розташований раніше тіла циклу і керує роботою циклу. Оскільки тіло циклу S розташоване після перевірки умови Р, то може статися, що за певних умов блок S не буде виконано жодного разу.

Циклічні програми з передумовою мовою Паскаль реалізовані за допомогою оператора циклу while:

while <вираз> do <оператор>

де <вираз> - будь-який вираз логічного типу (що виробляє в результаті True або False); <оператор> - оператор (складений оператор) мови Паскаль. Якщо вираз набуде значення True, то виконується <оператор>, в іншому разі виконання циклу завершується.

3. Цикл-до (з постумовою)

Характеризується тим, що перевірка умови Р стоїть після тіла циклу. Під час роботи циклу з постумовою тіло циклу S виконується принаймі один раз і буде виконуватися доти, доки не справдиться умова Р. Справдження умови Р в цьому випадку – умова закінчення циклу. Циклічні програми з постумовою мовою Паскаль реалізовані за допомогою оператора циклу repeat:

repeat

<тіло циклу>

until

де <тіло циклу> - будь-яка послідовність операторів, що повторюється доти, доки <вираз> не набере значення True.



Поделиться:


Последнее изменение этой страницы: 2016-09-13; просмотров: 205; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.144.161.116 (0.014 с.)