ТОР 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. Последние два оператора годятся для вставки очередного элемента в список. Первым в списке будет элемент, вставленный последним.
Не нашли, что искали? Воспользуйтесь поиском:
|