Динамический массив

Для одномерного массива

{$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.
 
pascal/dynamic_array.txt · Последние изменения: 2006/10/31 10:39 От romtek
 
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki