Студопедия

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

Разделы сайта

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






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






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

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

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

Var

РР: ^ longint;

Begin

if MaxAvail > = 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






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.