Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
информатика ЗКМЗКЕ_1курс / Основы алг-ции и прог-ие.doc
Скачиваний:
81
Добавлен:
05.06.2015
Размер:
1.88 Mб
Скачать
    1. Стандартные функции обработки динамической памяти.

В процессе выполнения программы может возникнуть необходимость наблюдения за состоянием динамической области. Цель такого наблюдения - оценка возможности очередного выделения динамической области требуемого размера. Для этих целей Турбо Паскаль предоставляет две функции (без параметров).

MaxAvail;

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

Тип возвращаемого значения - longint.

type zap=record

field1: string [20];

field2: real;

end;

var p: pointer;

begin

...

if MaxAvail <SizeOf(zap)

then

Writeln ('He хватает памяти!')

else

GetMem(р, SizeOf(zap));

...

Вторая функция:

MemAvail;

Эта функция возвращает общее число свободных байтов динамической памяти, то есть суммируются размеры всех свободных участков и объем свободной динамической области. Тип возвращаемого значения - longint.

...

Writeln( 'Доступно', MemAvail, ' байтов' );

Writeln('Наибольший свободный участок=', MaxAvail, 'байтов' );

...

Это решение основано на следующем обстоятельстве. Динамическая область размещается в специально выделяемой области, которая носит название «куча» (heap). Куча занимает всю или часть свободной памяти, оставшейся после загрузки программы. Размер кучи можно установить с помощью директивы компилятораМ:

{$М <стек>, <минимум кучи>, <максимум кучи>}

где <стек> - специфицирует размер сегмента стека в байтах. По умолчанию размер стека 16 384 байт, а максимальный размер стека 65 538 байт;

<минимум кучи>- специфицирует минимально требуемый размер кучи в байтах; по умолчанию минимальный размер 0 байт;

<максимум кучи>- специфицирует максимальное значение памяти в байтах для размещения кучи; по умолчанию оно равно 655 360 байт, что в большинстве случаев выделяет в куче всю доступную память; это значение должно быть не меньше наименьшего размера кучи.

Все значения задаются в десятичной или шестнадцатеричной формах. Например, следующие две директивы эквивалентны:

{$М 16384,0,655360}

{$M $4000, $0, $A000}

Если указанный минимальный объем памяти недоступен, то программа выполняться не будет.

Управление размещением в динамической памяти осуществляет администратор кучи, являющийся одной из управляющих программ модуля System.

    1. Примеры и задачи.

Рассмотрим пример размещения и освобождения разнотипных динамических переменных в куче.

type

st1=string[7];

st2=string[3];

var i,i1,i2,i3,i4:^integer;

r^:real;

s1:^st1;

s2:^st2;

begin

New(i);

i1^:=1;

New(i2);

i2^:=2;

New(i3);

i3^=3;

New(i4);

i4^:=4; (*1*)

Disроsе (i2);{освобождается второе размещение}

New (i); {память нужного размера (в данном случае два байта) выделяется на первом свободном месте от начала кучи, достаточном для размещения данной переменной; в этом примере - это участок, который занимала переменная i2^, ее адрес остался в указателе i2 }

i^:=5; (*2*)

Dispose(i3); {освобождается третье размещение}

New(r); {память под переменную типа real выделяется в вершине кучи, так как размер дырки с адресом i3 (2 байта) мал для размещения переменной типа real, для которой необходимо 6 байт }

r^:=6; (*3*)

writeln (r^); { ВЫВОД: 6.0000000000E+00}

END.

В следующем примере используется массив указателей.

uses Crt;

var

r: array [1..10] of ^real;

i:1..10;

begin

Randomize; {инициализация генератора случайных чисел}

for i:=1 to 10 do

begin

New(r[i]);

r[i]^:=Random; {генерация случайных вещественных чисел в диапазоне 0 <= r[i]^ < 1}

writeln(r[i]^);{Вывод случайных чисел в экспоненциальной форме}

end;

end.