::Главная страница ::Delphi/Паскаль :: Статьи

Как в Delphi создать динамический массив

Мы создадим универсальный динамический массив. Это может быть массив чисел, символов или элементов любого другого типа. Достаточно вместо longint (в коде подчеркнуто) поставить нужный тип данных.

Количество элементов, задаваемое свойством Count, практически ограничено только объемом памяти. При изменении Count данные из массива не стираются, поскольку при выделении нового участка памяти в него копируется информация из старого.

Обращение к элементам массива осуществляется через свойство Items.

Итак, массив описывается следующим кодом:
unit DynArray;

interface

type
  TElem = longint;
  PElem = ^TElem;
  TDynArray = class
  private
    FCount: integer;
    FP: Pointer;
    procedure SetCount(v: integer);
    procedure SetItem(index: integer; v: TElem);
    function GetItem(index: integer): TElem;
  public
    property Count: integer read FCount write SetCOunt;
    property P: Pointer read FP;
    property Items[index: integer]: TElem read GetItem write SetItem;
    constructor Create;
    destructor Destroy; override;
  end;

implementation

procedure TDynArray.SetCount(v: integer);
var
  NP: Pointer;
begin
  if FCount = v then Exit;
  if v <= 0 then begin
    if FCount > 0 then FreeMem(FP, FCOunt);
    FCount := 0;
    Exit;
  end;
  GetMem(NP, v * sizeof(TElem));
  if (FCount > 0) then begin
    if v > FCount
      then Move(FP^, NP^, FCount * sizeof(TElem))
      else Move(FP^, NP^, v * sizeof(TElem));
    FreeMem(FP, FCount * sizeof(TElem));
  end;
  FCount := v;
  FP := NP;
end;

procedure TDynArray.SetItem(index: integer; v: TElem);
begin
  if (index >= 0) and (index < FCount)
    then PElem(integer(FP) + index * sizeof(TElem))^ := v;
end;

function TDynArray.GetItem(index: integer): TElem;
begin
  if (index >= 0) and (index < FCount)
    then result := PElem(integer(FP) + index * sizeof(TElem))^
    else fillchar(result, sizeof(TElem), 0);
end;

constructor TDynArray.Create;
begin
  FCount := 0;
end;

destructor TDynArray.Destroy;
begin
  if FCount > 0 then SetCount(0);
end;

end.
И, наконец, пример программы, использующей динамический массив.
uses IntArray;

procedure TForm1.FormCreate(Sender: TObject);
var
  a: TIntArray;
begin
  a := TIntArray.Create;
  a.Count := 2;
  a.Items[0] := 32;
  a.Items[1] := 64;
  a.Count := 3;
  a.Items[2] := 128;
  Form1.Caption :=
    IntToStr(a.Items[0]) + ' ' +
    IntToStr(a.Items[1]) + ' ' +
    IntToStr(a.Items[2]);
  a.Destroy;
end;
Строка

PElem(integer(P) + index * sizeof(TElem))^
где index – номер элемента, а P – адрес, который можно получить из свойства P динамического массива, используется для ускорения обращения к элементам.
Тематические ссылки
Ваша ссылка Ваша ссылка

Обмен кнопками, ведение статистики, реклама.