Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

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






Динамические переменные. Связь понятия динамической переменной и ссылочных типов объясняется соответствующими механизмами доступа к памяти




Связь понятия динамической переменной и ссылочных типов объясняется соответствующими механизмами доступа к памяти. Естественным средством доступа к статическим переменным являются их идентификаторы, под них отводятся специальные сегменты оперативной памяти (сегменты данных и стека). Динамические переменные, количество и место расположения которых в памяти заранее неизвестно, невозможно обозначить идентификатором. Поэтому единственным средством доступа к динамическим переменным является указатель на место их текущего расположения в памяти. Область памяти, в которой образуются динамические переменные, существует отдельно от стекового сегмента и называется кучей (heap) или динамической областью памяти. Динамические переменные, как правило, имеют тип «запись» (record), так как должны содержать, помимо значения (целого, вещественного и т. д.), ссылку на другую динамическую переменную связанной структуры.

Основные действия над динамическими переменными - создание (процедура New) и уничтожение (процедура Dispose). При работе процедуры New возможна ситуация, в которой исчерпывается область памяти, отведенная для динамических переменных, и для размещения новой переменной в куче не хватает места. Для решения данной проблемы следует проверять текущее состояние динамической памяти перед каждым выполнением процедуры New. Такую проверку можно выполнить с помощью стандартной функции MaxAvail.

Функция MaxAvail возвращает размер в байтах наибольшего непрерывного участка кучи типа Longint.За один вызов процедуры New нельзя зарезервировать памяти больше, чем значение, возвращаемое данной функцией. Например, если требуется создать динамическую переменную типа Longint,которая занимает в памяти 4 байта, то процедура отведения памяти может бытьследующей:

Var

РР:^ longint;

Begin

ifMaxAvail >=4

Then

New(PP)

Else

WriteLn('Динамическая память исчерпана');

Функция MemAvail возвращает размер в байтах всех свободных областей динамической памяти.

В отношении определения типа указателя необходимо сделать следующее замечание. В Паскале существует жесткое правило: идентификатор любого типа сначала должен быть определен и лишь затем использован. Из этого правила существует единственное исключение. При определении типа указателя можно использовать как уже определенный идентификатор типа, так и идентификатор типа, который определяется позже.

Пример 11.1.Пусть в памяти машины имеется динамическая переменная, содержащая поле целого значения 2 и поле ссылки (указатель)

на другой компонент связанной структуры (цепочки):

 

 



Адрес данной переменной (ссылка) содержится в ссылочной переменной R:

 

Обозначим тип ссылочной переменной через mark, а тип динамической переменной - через dyn.

Туре

mark = ^dyn;

Ссылочную переменную R можно описать как

Туреили Var

mark = ^dyn; R: ^dyn;
Var

R: mark;

Реально значения ссылочных типов содержат адреса расположения в памяти конкретных значений базового типа. Чтобы связать динамические переменные в последовательность, необходимо в каждом компоненте иметь ссылку на предыдущий компонент. Например, компоненты, содержащие числа 5, 10, 15, 30, должны иметь еще информацию о том, где находится предыдущий элемент, так как компоненты могут размещаться в памяти произвольно. Обозначив тип таких данных через dyn, получим тип «запись» с двумя полями: полем целого значения i и полем ссылки р:

Туре

dyn = record


mylektsii.ru - Мои Лекции - 2015-2019 год. (0.005 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал