Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебно-методическое пособие по Паскалю.doc
Скачиваний:
7
Добавлен:
25.04.2019
Размер:
398.34 Кб
Скачать

9.1 Выделение и освобождение динамической памяти

Вся динамическая память рассматривается как сплошной массив байтов, который называется кучей. Начало кучи хранится в стандартной переменной HEAPORG, конец – в переменной HEAPEND. Текущую границу незанятой динамической памяти указывает указатель HEAPPTR.

Выделение динамической памяти происходит при помощи процедуры NEW(<указатель>). Указатель приобретает адрес, начиная с которого можно разместить данные. Для этого сразу за указателем ставится значок ^.

VAR A:^Integer; B:^Real;

Begin

New(A);

A^ := 649;

Если бы за переменной А не было значка ^, то переменной А присваивался бы адрес, по которому впоследствии будут размещены данные.

Высвобождение динамической памяти происходит при помощи процедуры DISPOSE(<указатель>); При этом значение самого указателя (адрес) не изменяется.

Попеременное обращение к процедурам NEW и DISPOSE часто приводит к образованию «дыр» в памяти. Для освобождения целого фрагмента кучи используется процедура MARK, которая запоминает текущее значение указателя HEAPPTR. Далее в любом месте программы можно освободить фрагмент кучи начиная с данного адреса и до конца динамической памяти при помощи процедуры RELEASE. Не рекомендуется, однако использовать RELEASE совместно с процедурой DISPOSE.

Для работы с нетипизированными указателями используются процедуры:

GETMEM (A, Size) – резервирование памяти,

FREEMEM (A, Size) – освобождение памяти,

где А – нетипизированный указатель,

Size – размер в байтах.

10 Модули

Модуль – это автономно компилируемая программная единица, включающая в себя различные компоненты раздела описаний (типы, константы, переменные, процедуры и функции) и, возможно, некоторые исполняемые операторы инициирующей части. Модули позволяют разрабатывать библиотеки прикладных программ. Программный код модулей размещается в отдельном сегменте памяти. Количество одновременно используемых модулей ограничивается лишь доступной памятью, что позволяет создавать очень крупные программы. Модуль состоит из заголовка и трех частей, каждая из которых может быть пустой.

UNIT <имя>;

INTERFACE

<интерфейсная часть>

IMPLEMENTATION

<исполняемая часть>

BEGIN

<инициирующая часть>

END.

Имя заголовка модуля должно совпадать с именем дискового файла, в который помещается исходный текст модуля. Т.е. если заголовок UNIT INFORM, то текст модуля должен находиться в файле INFORM.PAS. Имя модуля связывает его с другими модулями и с основной программой при помощи предложения USES <список модулей>.

Например: USES CRT, GRAPH, INFORM;

Предложение USES в модулях находится либо сразу за словом INTERFACE, либо за словом INMPLEMENTATION, либо и там и там.

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

Исполняемая часть содержит описание подпрограммы, объявленной в интерфейсной части. В ней могут быть объявлены локальные для модуля объекты.

Инициирующая часть завершает модуль. Она может отсутствовать вместе с начинающим ее словом BEGIN или быть пустой. Здесь размещаются операторы, которые обычно используются для подготовки работы программы.