Отправляет email-рассылки с помощью сервиса Sendsay

Советы по Delphi

  Все выпуски  

Советы по Delphi


Служба Рассылок Subscribe.Ru проекта Citycat.Ru

Как в 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 динамического массива, используется для ускорения обращения к элементам.

Всего доброго!


url: http://delphi4all.narod.ru
email: delphi4all@narod.ru



http://subscribe.ru/
E-mail: ask@subscribe.ru
Поиск

В избранное