Главная

Популярная публикация

Научная публикация

Случайная публикация

Обратная связь

ТОР 5 статей:

Методические подходы к анализу финансового состояния предприятия

Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века

Ценовые и неценовые факторы

Характеристика шлифовальных кругов и ее маркировка

Служебные части речи. Предлог. Союз. Частицы

КАТЕГОРИИ:






Создание и уничтожение динамических переменных




- эти действия реализуются в Pascal стандартными процедурами New, Dispose. Процедура New – параметр ее переменная ссылочного типа. Действие процедуры:

1 В кучи отводится место для хранения переменной, тип которой совпадает с базовым типом указателя параметра.

2 Переменной переданной в параметре присваивается указатель на отведенную область в памяти.

Type point=record x,y: integer; color: byte;end; var pnt:^point; begin new(pnt); pnt.^.x:=xmouse; pnt.^.y:=ymouse; p^.color:=blue

В Pascal есть возможность представить процедуру New в форме функции. В этом случае в качестве «параметра» функции задается ссылочный тип, а результатом является указатель этого типа, ссылающийся на отведенную область для значения базового типа.

Type point=record x,y: integer; color: byte;end; pntptr:^point; var pnt:pntptr; begin new(pntptr);…

Переменной pnt присваивается адрес области памяти достаточный для хранения переменной базового типа (pntptr).

Для освобождения памяти, отведенной с помощью процедуры или функции New используется процедура dispose. Параметром является указатель на динамическую переменную. Var pnt:^point; begin new(pnt); …dispose(pnt)…end.

Существует важная проблема – возможное исчерпание динамической области. Для повышения надежности программы следует проверить текущее состояние динамической памяти при каждом обращении к процедуре new. Это можно сделать при помощи стандартной функции MaxAvail (возвращает максимальный размер свободного участка динамической памяти). Для определения необходимого размера воспользуемся функцией Size of.

Пример if MaxAvail>Size of (point) then pnt:=new(pntptr);

Существуют следующие процедуры GetMem(var p:pointer;Size:word); FreeMem(var p:pointer;Size:word);

Связанные списки

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

type Т = record key: integer;

next: ^T end

Список элементов типа Т показан на рис. Ссылка head указывает на первую компоненту списка.

Динамическими объектами здесь являются записи типа Point с полями, содержащими атрибуты необходимых объектов (н-р, точек; их м.б. произвольное кол-во, их можно объединить в ломаную, перерисовать и т.д.). Первоначально список пуст, указатель head установлен в nil.

type link=^point; point=record x,y: integer; color,mask: byte; next: link end; var head,p: link; begin head:=nil; p:=new(link); p^.x:=xmouse; p^.y:=ymouse; p^.color:=curcolor; p^.mark:=curmt; p^.next:=head; head:=p;…end.

Последние два оператора годятся для вставки очередного элемента в список. Первым в списке будет элемент, вставленный последним.

 






Не нашли, что искали? Воспользуйтесь поиском:

vikidalka.ru - 2015-2024 год. Все права принадлежат их авторам! Нарушение авторских прав | Нарушение персональных данных