Главная страница

 

ДОМ
ИНФОРМАЦИОННЫХ ТЕХНОЛОГИЙ

Информатика и программирование
Информационные технологии
Компьютерные сети
Информационная безопасность
Как заработать в сети Интернет
Информатика и программирование
Операційна система Windows
Текстовий редактор Word
Редактор електронних таблиць Excel
Мова програмування Pascal
Язык программирования Pascal

Теоретичний матеріал за темами:

1.              Загальні вказівки

2.              Програмування лінійних структур, обчислення арифметичних виразів

3.              Програмування розгалужених обчислюваньних процесів

4.              Програмування циклічних обчислювальних процесів

5.              Обробка текстових даних

6.              Використання типу Record

7. Використання підпрограм

8. Організація модулів

9. Робота з файлами

10. Використання динамічних змінних

  return_links(); ?>

Copyright © Евгений Литвиненко, 2007
Использование без разрешения автора запрещено

ВИКОРИСТАННЯ ДИНАМІЧНИХ ЗМІННИХ

В процесі компіляції звичайної програми для змінних, описаних в розділі Var, виділяється пам'ять конкретного розміру, яка закріпляється за змінними на весь період роботи програми. Такі змінні називають статичними, доступ до відповідних областей пам’яті здійснюється за іменами змінних.
Але не завжди такий спосіб виділення пам'яті буде ефективним, особливо в тих випадках, коли заздалегідь невідомо які розміри пам'яті потрібні для зберігання якихось даних, наприклад, масиву. Іноді навіть невідомо, потрібна буде така пам'ять, чи ні.
Такі змінні, які з'являються тільки в процесі роботи програми або їх розмір може змінюватись при її виконанні називають динамічними змінними.
Для таких даних пам'ять виділяється не на етапі компіляції, а на етапі виконання програми, більш того, така пам'ять може бути визволеною ще до завершення програми.
Динамічна змінна явно не описується, до неї не­має доступу по імені. Замість цього використо­вується спеціальна змінна-вказівник.
Значенням вказівника є адреса пам'яті, де роз­міщується динамічний об'єкт (сам вказівник займає 4 байти пам'яті).
Вказівники можна описувати в програмі з допомогою символу ^, наприклад:

VarVkaz1,Vkaz2:^Integer;
       R,Т:^Rеа1;

Такий опис ще не виділяє пам'ять для змінних, він тільки означає, що змінні Vkaz1 та Vkaz2 є вка­зівниками на дані цілого типу, а змінні R і Т - вказівники на дійсне дане.
Виділення пам'яті здійснюється спеціальним опе­ратором New, наприклад:

New(T);

Після цієї операції вказівник Т придбає значення адреси пам'яті для дійсної змінної. Щоб отримати доступ до цієї області пам'яті, треба знак ^ записати після вказівника, наприклад:

Т^;=16.4;
Writeln(T^);

Над динамічними змінними можна виконувати такі ж операції, як і над статичними, наприклад:

R^:=T^+20;
If R^<30 Then T^:=40;

Вказівники, в свою чергу, можна тільки присвоювати один одному та порівнювати на рівність чи нерівність між собою, наприклад:

T:=R;
If T<>R Then T:=Nil;

Треба бути уважними при вживанні динамічних змінних та вказівників. Розглянемо приклад фрагменту програми:

R^:=10.5;
T^:=16.2;
R:=T;

Якщо замість останнього оператору вжити опера­тор R^:=Т^, то вказівники будуть зв'язані з різними комірками пам'яті, в яких записано одне й теж число 16.2.
Динамічною змінною може бути також рядок або масив, наприклад:

Type Strichka=String[50];
         Mas=Array[1..40] of Real;
Var VkazStr:^Strichka;
       VkazMas:^Mas;

Якщо треба виділити пам'ять під масив достатньо виконати оператор:

New(VkazMas)

Тепер в циклі можна ввести значення його елементів:

For i:=l to 40 do Read(VkazMas^[i]);

Як бачимо, до елементу масиву можна звертатися, вживаючи ім'я VkazMas^[i].
Якщо в процесі виконання програми яка-небудь змінна стане непотрібною, її можна вилучити з пам'яті за допомогою оператора Dispose, наприклад:

Dispose(VkazMas);

Це значить, що пам’ять, яка була виділена під масив звільнена, а сам вказівник VkazMas матиме невизначене значення.
Подібна операція буває корисною при необхідності економити пам’ять.
В мові Pascal можна, також використовувати нетиповані вказівними, які, на відміну від типова них, не зв’язані з конкретним типом. Такі вказівники описують, вживаючи слово Pointer, наприклад:

VarР1, Р2 : Pointer;

Ці вказівники сумісні з будь-якими типованими вказівниками, тобто вказівник Р1 може одержати, як значення вказівника на ціле число, так і значення вказівника на дійсне число.
Нетипований вказівник може одержати значення одним з декількох способів.
ІІроцедура GetMem(P1,Size) виділить пам'ять розміром Size байтів, вказівник Р1 матиме значення адреси початку такої пам'яті (величина Size обмеже­на числом 64К). Це нерідко вживають для зберігання фрагментів зображення на екрані дисплею. Звільнення такої пам'яті виконує процедура FreeMem(Pl,Size).
Функція Addr визначає адресу свого аргументу (змінної або підпрограми), наприклад:

P2:=Addr(A);

Таку операцію використовують, наприклад, при заміні стандартної підпрограми обробки переривання на «свою» підпрограму.
Функція Ptr перетворить свій аргумент-адресу в значення вказівника, наприклад:

P1:=Ptrt($1234,$4567);

Нетипованому вказівнику можна присвоїти зна­чення спеціальної функції Nil, наприклад:

P1:=NiI;

Функція Nil виробляє значення «пусте» (згадайте пустий рядок, пусту множину). Вона застосовується, як деяка ознака кінця динамічної структури, напри­клад, кінця списку.
При програмуванні на мові Pascal для розміщення динамічних змінних використовується область пам'яті з назвою Heap або «куча». Розмір Heap можна регулювати за допомогою директиви компілятору $М або задати при налагодженні середовища (Option/Compiler/Memorysize) від 0 до 65535 байт.
Приклад директиви:

{$М 20000,10000,200000}

Перше число показує розмір сегмента стеку (від 1024 до 655356). Це число вибирається в за­лежності від наявності та виду підпрограм. Друге число визначає найменш допустимий в даній прог­рамі розмір Heap, а останнє число - найбільший розмір цієї пам'яті. Конкретні розміри Heap виби­раються в залежності від задачі та кількості дина­мічних даних.
Приклад: скласти схему алгоритму та програму обчислення функції

де Y = 3.1, Z = 2.14 та якщо Х приймає два значення  X = 0.56 та   X=4.42.
Схема алгоритму наведена на рис. 2
Програма:

Var X, Y, Z, F : ^Real;
Begin
    Write(‘Введіть Y, Z :’);
    New(Y);
    New(Z);
    ReadLn(Y^,Z^);
    Write(‘Введіть X :’);
    New(X);
    ReadLn(X^);
     New(F);
    IF (X^>=Y^) THEN  F^:=SQR(X^)+EXP(Z^)/COS(Y^)
                     ELSE   F^:=SIN(X^)+COS(Z^);
    Dispose(X);
    Dispose(Y);
    Dispose(Z);
    WriteLn(‘Значення F=’,F);
    Dispose(F);
End.

Copyright © Eugene, 2007
e-mail: webmaster@ITDom.info
Rambler's Top100 Рейтинг@Mail.ru