мета-данные страницы
  •  
Загрузка не удалась. Возможно, проблемы с правами доступа?

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слеваПредыдущая версия
Следующая версия
Предыдущая версия
Последняя версияСледующая версия справа и слева
pascal:pointers [20/10/2009 12:06] ybezrukovpascal:pointers [21/11/2009 18:12] oca
Строка 2: Строка 2:
 FIXME FIXME
  
 +
 +===== Процедуры и функции для работы с динамической памятью =====
 +
 +[[http://www.lsnnet.ru/pascal/procedury-i-funkcii-dlya-raboty-s-dinamicheskoj-pamyatyu.html]]
 +
 +Ниже приводится описание как уже рассмотренных процедур и функций, так и некоторых других, которые могут оказаться полезными при обращении к динамической памяти. ,
 +
 +Функция ADDR.
 +
 +Возвращает результат типа POINTER, в котором содержится адрес аргумента. Обращение:
 +
 +ADDR ( X )
 +
 +Здесь Х- любой объект программы (имя любой переменной, процедуры, функции). Возвращаемый адрес совместим с указателем любого типа. Отметим, что аналогичный результат возвращает операция @ .
 +
 +Функция CSEG.
 +
 +Возвращает значение, хранящееся в регистре CS микропроцессора в начале работы программы в регистре CS содержится сегмент начала кода программы). Обращение:
 +
 +CSEG 
 +
 +Результат возвращается в слове типа WORD.
 +
 +Процедура DISPOSE.
 +
 +Возвращает в кучу фрагмент динамической памяти, который ранее был зарезервирован за типизированным указателем. Обращение:
 +
 +DISPOSE(TP)
 +
 +Здесь ТР – типизированный указатель. При повторном использовании процедуры применительно к уже освобожденному фрагменту возникает ошибка периода исполнения. При освобождении динамических объектов можно указывать вторым параметром обращения к DISPOSE имя деструктора (подробнее см. гл.10).
 +
 +Функция DSEG.
 +
 +Возвращает значение, хранящееся в регистре DS микропроцессора (в начале работы программы в регистре DS содержится сегмент начала данных программы). Обращение:
 +
 +DSEG
 +
 +Результат возвращается в слове типа WORD.
 +
 +Процедура FREEMEM.
 +
 +Возвращает в кучу фрагмент динамической памяти, который ранее был зарезервирован за нетипизированным указателем. Обращение:
 +
 +FREEMEM ( Р, SIZE )
 +
 +Здесь Р – нетипизированный указатель;
 +
 +SIZE – длина в байтах освобождаемого фрагмента.
 +
 +При повторном использовании процедуры применительно к уже освобожденному фрагменту возникает ошибка периода исполнения.
 +
 +Процедура GETMEM.
 +
 +Резервирует за нетипизированным указателем фрагмент динамической памяти требуемого размера. Обращение:
 +
 +GETMEM ( Р, SIZE )
 +
 +За одно обращение к процедуре можно зарезервировать не более 65521 байтов динамической памяти. Если нет свободной памяти требуемого размера, возникает ошибка периода исполнения. Если память не фрагментирована, последовательные обращения к процедуре будут резервировать последовательные участки памяти, так что начало следующего будет располагаться сразу за концом предыдущего.
 +
 +Процедура MARK.
 +
 +Запоминает текущее значение указателя кучи HEAPPTR. Обращение:
 +
 +MARK ( PTR )
 +
 +Здесь PTR – указатель любого типа, в котором будет возвращено текущее значение HEAPPTR. Используется совместно с процедурой RELEASE для освобождения части кучи.
 +
 +Функция MAXAVAIL.
 +
 +Возвращает размер в байтах наибольшего непрерывного участка кучи. Обращение:
 +
 +MAXAVAIL
 +
 +Результат имеет тип LONGINT. За один вызов процедуры NEW или GETMEM нельзя зарезервировать памяти больше, чем значение, возвращаемое этой функцией.
 +
 +Функция MEMAVAIL.
 +
 +Возвращает размер в байтах общего свободного пространства кучи. Обращение:
 +
 +MEMAVAIL
 +
 +Результат имеет тип LONGINT.
 +
 +Процедура NEW.
 +
 +Резервирует фрагмент кучи для размещения переменной. Обращение:
 +
 +NEW ( ТР )
 +
 +Здесь ТР – типизированный указатель.
 +
 +За одно обращение к процедуре можно зарезервировать не более 65521 байта динамической памяти. Если нет свободной памяти требуемого размера, возникает ошибка периода исполнения. Если память не фрагментирована, последовательные обращения к процедуре будут резервировать последовательные участки памяти, так что начало следующего будет располагаться сразу за концом предыдущего.
 +
 +Процедура NEW может вызываться как функция. В этом случае параметром обращения к ней является тип переменной, размещаемой в куче, а функция NEW возвращает значение типа указатель. Например:
 +
 +type
 +
 +PInt =^Integer;
 +
 +var
 +
 +p: Pint;
 +
 +begin
 +
 +p := New(PInt);
 +
 +……
 +
 +end.
 +
 +При размещении в динамической памяти объекта разрешается в качестве второго параметра обращения к NEW указывать имя конструктора (см. гл.10).
 +
 +Функция OFS.
 +
 +Возвращает значение типа WORD, содержащее смещение адреса указанного объекта. Вызов:
 +
 +OFS ( X )
 +
 +Здесь Х- выражение любого типа или имя процедуры.
 +
 +Функция PTR.
 +
 +Возвращает значение типа POINTER по заданному сегменту SEG и смещению OFS. Вызов:
 +
 +PTR ( SEG, OFS )
 +
 +Здесь SEG – выражение типа WORD, содержащее сегмент;
 +
 +OFS – выражение типа WORD, содержащее смещение.
 +
 +Значение, возвращаемое функцией, совместимо с указателем любого типа.
 +
 +Процедура RELEASE.
 +
 +Освобождает участок кучи. Обращение:
 +
 +RELEASE ( PTR )
 +
 +Здесь PTR – указатель любого типа, в котором предварительно было сохранено процедурой MARK значение указателя кучи. Освобождается участок кучи от адреса, хранящегося в PTR, до конца кучи. Одновременно уничтожается список всех свободных фрагментов, которые, возможно, были созданы процедурами DISPOSE или FREEMEM.
 +
 +Функция SEG.
 +
 +Возвращает значение типа WORD, содержащее сегмент адреса указанного объекта. Вызов:
 +
 +SEG ( X )
 +
 +Здесь X – выражение любого типа или имя процедуры.
 +
 +Функция SIZEOF.
 +
 +Возвращает длину в байтах внутреннего представления указанного объекта. Вызов:
 +
 +SIZEOF ( X )
 +
 +Здесь X – имя переменной, функции или типа. Например, везде в программе из примера 6.1 вместо константы SIZEOFREAL можно было бы использовать обращение SIZEOF(REAL).