====== Динамический массив ======
===== Для одномерного массива =====
{$R-}
{ Отключаем проверку компилятором границ массива. Необходимо для дин. массивов в Турбо Паскале }
Type
MyType={здесь описываешь тип элемента массива, скажем} Word;
Type
MyArray=Array[1..1] of MyType; {Описываем массив всего из 1 элемента}
MyArrayPtr=^MyArray;
Var
DynamicArray: MyArrayPtr; {Это указатель на наш динамически массив}
Count, {Это вводимый размер массива}
I,Size: Word;
Begin
{Вводим размер массива}
Write('Число элементов массива: ');
ReadLn(Count);
{ выделяем под него память: Count x РазмерТипа }
Size:=Count*SizeOf(MyType);
GetMem(DynamicArray,Size);
{заполняем наш массив значениями}
For I:=1 to Count do DynamicArray^[I]:=I;
For I:=1 to Count do
Write(DynamicArray^[I]:4);
{освобождаем зарезервированную память для массива}
FreeMem(DynamicArray,Size)
End.
===== Для двумерного массива (матрицы) =====
Сначала резервируется место в памяти для строк матрицы, а потом для каждой строки резервируется место под каждый столбец.
Тут приведён пример для квадратной матрицы (Count x Count):
{ (C) volvo877 }
{$R-}
Type
MyType = Word;
Type
PMyVector = ^MyVector;
{ "Строка" динамической матрицы }
MyVector = Array[1 .. 1] of MyType;
MyArrayPtr = ^MyArray;
{ Сама матрица - представляется как массив указателей на "строки" }
MyArray = Array[1 .. 1] of PMyVector;
Var
DynamicArray: MyArrayPtr; { Указатель на матрицу }
Count,
I,J,Size: Word;
Begin
Write('Число элементов массива: ');
ReadLn(Count);
{ Выделяем память под указатели на "строки" }
GetMem(DynamicArray, Count * SizeOf(PMyVector));
{ И для каждой "строки" - выделяем память для хранения данных }
For i := 1 To Count Do
GetMem(DynamicArray^[i], Count*SizeOf(MyType));
For I:=1 to Count do { строки }
For J:=1 to Count do { столбцы }
{ Немного изменяется способ обращения к элементу матрицы }
DynamicArray^[I]^[J]:=I*J;
For I:=1 to Count do
begin
WriteLn;
For J:=1 to Count do
Write(DynamicArray^[I]^[J]:4);
end;
{ Освобождаем память в обратном порядке: }
{ Сначала - удаляем все "строки" }
For i := 1 To Count Do
FreeMem(DynamicArray^[i], Count*SizeOf(MyType));
{ А теперь и указатели на них ... }
FreeMem(DynamicArray, Count * SizeOf(PMyVector));
End.