|
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.
Работа с динамическими массивами
При работе с массивами практически всегда возникает задача настройки программы на фактическое количество элементов массива. В зависимости от применяемых средств решение этой задачи бывает различным.
Первый вариант -использование констант для задания размерности массива.
PROGRAM FIRST;
CONST N: INTEGER = 10; { либо N = 10; }
VAR A: ARRAY [1..N] OF REAL;
I: INTEGER;
BEGIN
FOR I:= 1 TO N DO
BEGIN
WRITELN (' Введите ', I, ' -ый элемент массива ');
READLN (A[I])
END; { И далее все циклы работы с массивом используют N}
Такой способ требует перекомпиляции программы при каждом изменении числа обрабатываемых элементов.
Второй вариант - программист планирует некоторое условно максимальное (теоретическое) количество элементов, которое и используется при объявлении массива. При выполнении программа запрашивает у пользователя фактическое количество элементов массива, которое должно быть не больше теоретического. На это значение и настраиваются все циклы работы с массивом.
PROGRAM SECOND;
VAR A: ARRAY [1..25] OF REAL;
I, NF: INTEGER;
BEGIN
WRITELN ( 'Введите фактическое число элементов массива <= 25 ');
READLN (NF);
FOR I:= 1 TO NF DO
BEGIN
WRITELN ( 'Введите ', I, ' -ый элемент массива ');
READLN (A[I])
END; { И далее все циклы работы с массивом используют NF }
Этот вариант более гибок и технологичен по сравнению с предыдущим, так как не требуется постоянная перекомпиляция программы, но очень нерационально расходуется память, ведь ее объем для массива всегда выделяется по указанному максимуму. Используется же только часть ее.
Вариант третий - в нужный момент времени надо выделить динамическую память в требуемом объеме, а после того, как она станет не нужна, освободить ее.
Дата добавления: 2014-12-18; просмотров: 81 | Поможем написать вашу работу | Нарушение авторских прав |