Рассмотрим работу с динамическими массивами на примере программы перемножения прямоугольных матриц, размер которых заранее не известен, но может быть определён динамически.
Размеры перемножаемых матриц должны быть согласованы, а именно количество столбцов первого сомножителя должно равняться количеству строк второго.
Так как размер переменных заранее не известен, то процедуры new и dispose применить нельзя.
Для данной задачи подходят стандартные процедуры getmem и freemem.
Процедура getmem (var d: pointer; m: word) создаёт динамическую переменную указанного размера и присваивает значение адреса ссылочной переменной d. Если в памяти ЭВМ не хватает места для размещения переменной, то появляется сообщение об ошибке.
Процедура freemem (var d: pointer; m: word) как и процедура dispose освобождает память, отведённую под динамическую переменную, и делает эту память доступной для другого использования. Точно также после этого указателю d обязательно нужно присвоить значение nil.
Пример 1.
program Mult_Matr;
uses Crt;
type
Index_Of_Row= array [1..100] of ^VectColumn;
VectColumn= array [1..100] of integer;{здесь Index_Of_Row – имя типа ссылочных переменных, имеющих базовый тип динамического массива, VectColumn – имя типа ссылочной переменной типа "массив целых чисел"}
matrix= record {matrix – переменная типа "запись"}
N_rows, N_column: word; {Номер строки (ряда), номер столбца}
index: ^Index_Of_Row; {index – ссылка (указатель) на вектор-столбец VectColumn, длина которого равна числу строк матрицы Index_Of_Row. Каждый элемент столбца VectColumn сам является указателем на вектор-строку}
end;
var
A, B, C:matrix; {А и В – исходные матрицы, С – матрица – результат перемножения матриц А и В}
IndexSize, ElemSize, I, K:word; (* Размеры индекса и элемента матрицы, I, K – счётчики. Ссылка на элемент матрицы А имеет вид: A.index ^[I]^[K] *)
M, N:longint; (* Размеры матрицы *)
procedure CreateMatrix( var A: matrix; r c: word ); {Процедура создания матрицы}