- •I. Теоретические сведения.
- •1.1. Понятие модуля.
- •1.2. Использование модуля.
- •1.3. Структура модуля.
- •2. Статические и динамические структуры
- •3. Динамическое размещение данных
- •4. Указатели.
- •4.1. Описание указателя.
- •4.2. Выделение динамической памяти.
- •4.3. Задание значения указателю.
- •4.4. Операция разыменования.
- •4.5. Освобождение динамической памяти.
- •4.5.3. Освобождение фрагментов динамической памяти.
- •5. Динамический массив
- •5.1. Необходимость использования средств работы с динамической памятью при обработке массивов.
- •5.2. Описание интерфейсов для статического и динамического массивов.
- •6. Восходящая отладка программ (снизу вверх)
- •II. Контрольные вопросы.
- •III. Последовательность выполнения индивидуального задания.
- •5. Драйверы запуска подпрограмм
- •IV. Требования к разработке программы.
- •V. Требования к оформлению отчета.
4.5.3. Освобождение фрагментов динамической памяти.
Для освобождения целого фрагмента динамической памяти (занятого несколькими данными) перед началом выделения памяти, т. е. до применения процедур New или GetMem, в переменной-указателе запоминается текущее значение указателя HeapPtr с помощью процедуры
Mark(<идентификатор_указателя>)
Для освобождения фрагмента кучи, начиная от того адреса, который запомнила процедура Mark, и до конца динамической памяти определена процедура
Release(<идентификатор_указателя>),
Var
P: Pointer;
P1, P2: ^integer;
begin
Mark(P);
GetMem(P1, …);
New(P2);
…
Release(P);
end.
Вызов Release уничтожает список свободных фрагментов в куче, которые могли быть созданы до этого процедурами Dispose или FreeMem, поэтому не следует использовать одновременно механизм освобождения памяти с помощью процедур FreeMem, Dispose и Release.
5. Динамический массив
Динамическим называется массив, память для которого выделяется во время выполнения программы, обращение к области памяти осуществляется через указатель на ее начало.
5.1. Необходимость использования средств работы с динамической памятью при обработке массивов.
Необходимость использования средств работы с динамической памятью при обработке массивов возникает в случаях, когда статическая реализация неэффективна (например, размеры массивов заранее неизвестны, а резервирование памяти максимально возможного объема нерационально). Динамическая память – это фактически единственная возможность обработки массивов данных большой размерности, таких, которые настолько велики, что не могут быть размещены в сегменте данных размером в 64 Кбайт. Только в динамической памяти можно создать массив, размер которого заранее не определён.
Один из возможных вариантов получения динамического двумерного массива размерности n на m:
type
mas = array [1..1] of integer;
pmas = ^mas;
matr = array [1..1] of pmas;
pmatr = ^matr;
var
a: pmatr;
n, m: integer;
begin
readln(n, m);
GetMem (a, n*sizeof(pmas));
for i:=1 to n do
GetMem (a^[i], m*sizeof(integer));
. . . . .
{обращение к отдельному элементу имеет вид a^[i]^[j] }
. . . . .
for i:=1 to n do
FreeMem (a^[i], m*sizeof(integer));
FreeMem (a, n*sizeof(pmas));
end.
5.2. Описание интерфейсов для статического и динамического массивов.
Понятие массив используется на уровне постановки задачи: задается или должно быть сформировано множество однотипных данных. При описании интерфейса подпрограммы – связи с программой или другими подпрограммами – необходимо знать перечень входных и выходных данных, их тип и способ размещения.
Вопросы использования статического или динамического массивов связаны с эффективностью реализации подпрограммы и не должны влиять на интерфейс, поэтому следует выбрать способ описания интерфейса, позволяющий отложить решение этих вопросов, по крайней мере, до этапа разработки схемы решения.
Входные и выходные данные при работе со статическим или динамическим массивом будут иметь один и тот же вид, но в случае работы с динамическим массивом его имя заменится на указатель с соответствующей спецификой его обработки.