|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
ДИНАМІЧНА ПАМ’ЯТЬ. __________________________________________________________Під час розподілу пам’яті під локальні змінні відводиться спеціальний сегмент оперативної пам’яті (сегмент стека). Сегмент - це ділянка пам'яті розміром 64 Кбайт. Для динамічних об’єктів вводиться інша область пам’яті, яка називається купою, або динамічною областю пам’яті. У випадку використання процедури new можливе переповнення динамічної пам’яті. В цьому випадку програма не припинить своє виконання, але значення вказівної змінної, яка є параметром процедури new не зміниться, що може привести до неправильних результатів. Тому в Турбо Паскалі передбачена стандартна функція MaxAvail без параметрів, яка повертає в програму максимальний розмір в байтах неперервного відрізка вільної пам’яті, що використовується для розміщення динамічних змінних. Приклад: : var pl: ^ longint; begin if MaxAvail>=4 then new(pl) else writeln(‘динамічна пам’ять вичерпана’); Цей фрагмент означає, що для розміщення змінної типу longint потрібно 4 байта. Якщо розмір динамічної змінної >=4 байта, то для змінної виділяється пам’ять. В загальному випадку для визначення розміру динамічної пам’яті використовують стандартну функцію SizeOf. Її результат – кількість байтів, необхідна для зберігання даної змінної чи змінних даного типу. Цю функцію зручно використовувати для складних типів. Крім цього в Турбо Паскалі є функція MemAvail, яка повертає сумарний розмір всіх вільних областей динамічної пам’яті. В загальному випадку ці функції дають різні результати. Довільний характер відведення і вивільнення динамічної пам’яті приводить до того, що куча може являти собою випадкову послідовність вільних і зайнятих областей різних розмірів. Функція MaxAvail визначає найбільшу вільну пам’ять, функція MemAvail - загальний об’єм вільних областей. Приклад. Program vkaz; {1} var c1, c2: ^ integer; {оголошуємо два вказівники} begin {2} new(c1); {резервуємо пам’ять для цілого числа} new(c2); {резервуємо пам’ять для цілого числа} {3} c1^:=5; {змінна c1^ отримує значення 5} c2^:=7; {змінна c1^ отримує значення 7} writeln (c1^,c2^); {виводимо 5 і 7} {4} c1:=c2; {переадресація} writeln (c1^,c2^); {виводимо 7 і 7} {5} c2:=nil; {вказівник с2 занулюємо} {6} dispose(c2); {пам’ять, надану для с2, вивільняємо} writeln(c1^); {виводимо 7} end.
Приклад. Наведемо програму, що призначена для демонстрації принципів використання операцій над вказівниками. Зазначимо, що вказівники не можна використовувати як аргументи підпрограм. Із цього, зокрема, випливає висновок про неможливість надрукувати значення вказівника за допомогою стандартних процедур write і writeln. Спроба зробити це призведе до появи помилки Error 64: Cannot Read or Write variables of this type (He можна вводити або виводити змінні даного типу.). Тому значення вказівників, використані в програмі, можна переглядати лише під час налагодження програми у вікні Watch. Зв'язок між вказівником і динамічною змінною, на яку він посилається, проілюстрований на рисунку 1. Результати роботи програми зображено на рисунку 2. program ex_1; uses crt; Type vector = array [1..5] of integer; typefile = file of integer; IdentPtr = ^IdentRec; IdentRec = record Ident: string[15]; Next: IdentPtr; end; var pbyte: ^Byte; pint1.pint2: ^integer; parray: ^vector; pfile: ^typefile; untyped: pointer; prec: IdentPtr; x: byte; у: integer; arr: vector; f: file of integer; list: IdentRec; Begin clrscr: У:= 1; Pint1:= @y; У:= 2: pint2:= @y; {вказівник pint1 та pint2 посилаються на ту саму змінну - у } write('pint1 and pint2 are the same: '); writeln('(pint1=pint2)=’,pint1=pint2); {порівняння вказівників} writeln('pint1^=',pint1^,' pint2*=',pint2*,' y=',y); pbyte:= @x; untyped:= pbyte; {використання не типізованого} pint1:= untyped; {вказівника, pint1 та pbyte } x:= 4; {посилаються на одну й ту саму змінну} writeln('pbyte^=',pbyte^,' pint1^=',pint1^,' x=',x); {використання вказівників для посилання на елементи масивів та записів} parray:= @arr; parray^[1]:= 1: prec:= @list: prec^.Ident:= 'Pointers!!!'; writeln('arr[1]=',arr[1],' parray^[1]=',parray^[1]); write(‘ list. Ident=’,list. Ident); write(‘ prec^.Ident=',prec^,Ident); {використання вказівника на файлову змінну} Assign(f,'newfile.txt'); pfile:=@f; rewrite(f); write(pfile^,y); {до файлу 'newfile.txt' буде записано} close(pfile^); {значення змінної у} readln; end. Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.005 сек.) |