Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения
KANSoftWare

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

Delphi , Синтаксис , Массивы

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

Массив, который может менять свой размер во время работы программы, нужен тогда, когда неизвестно количество элементов на стадии разработки программы. Например, Вам не известен размер изображения, которое нужно будет поместить в память.

Этот динамический массив основан на массиве Delphi. Поэтому обращение к нему быстро и удобно. Тип TArray – это массив нужного типа. 128 элементов можно заменить любым другим числом, хоть 0. Повлиять это может только на отладку программы, так как Delphi выведет (если уместится) именно это количество элементов. PArray – это указатель на TArray. При обращении к элементам массива для Delphi главное, чтобы этот элемент существовал в памяти, то есть, чтобы под него была выделена память. А проверять, находится ли номер нужного элемента между 0 и 127 Delphi не будет.

Главным методом объекта является SetCount. Он сделан таким образом, что при изменении количество элементом старые данные не теряются, а новые элементы всегда обнуляются.

Процедура Reset обнуляет все существующие элементы.

Для того чтобы сделать этот массив, например, массивом целых чисел нужно поменять все double на integer или еще что-то.

Если Ваша программа часто обращается к элементам массива, то имеет смысл создать переменную типа PArray и присвоить ей адрес данных (поле p динамического массива), а дальше обращаться к ней, как к самому обыкновенному массиву. Только не забудьте обновлять эту переменную при изменении количества элементов.


type
TForm1 = ...
...
end;

  TArray = array [0..127] of double;
  PArray = ^TArray;
  TDynArray = object
  p: PArray;
  count: integer;
  constructor Create(ACount: integer); { инициализация }
  procedure SetCount(ACount: integer); { установка количества элементов }
  procedure Reset; { обнуление данных }
  destructor Destroy; { уничтожение }
end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

constructor TDynArray.Create(aCount: integer);
begin
  p := nil;
  count := 0;
  SetCount(ACount);
end;

procedure TDynArray.SetCount(ACount: integer);
var
  np: PArray;
begin
  if count = ACount then
  Exit;
  { память не была выделена }
  if p = nil then
  begin
    { новое количество элементов в массиве равно 0 }
    if ACount <= 0 then
    begin
      count := 0;
    end
    { новое количество элементов в массиве больше 0 }
    else
    begin
      { выделение памяти }
      GetMem(p, ACount * sizeof(double));
      { обнуление данных }
      fillchar(p^, ACount * sizeof(double), 0);
      count := ACount;
    end;
  end
  else
  begin
    { новое количество элементов в массиве равно 0 }
    if ACount <= 0 then
    begin
      { освобождение памяти }
      FreeMem(p, count * sizeof(double));
      count := 0;
    end
    else
    begin
      { выделение памяти }
      GetMem(np, ACount * sizeof(double));
      { требуется увеличить количество элементов }
      if ACount > count then
      begin
        { перемещение старых данных на новое место }
        move(p^, np^, count * sizeof(double));
        { обнуление новых элементов массива }
        fillchar(np^[count], (ACount - count) * sizeof(double), 0);
      end
      else
      begin
        { перемещение части старых данных на новое место }
        move(p^, np^, ACount * sizeof(double));
      end;
      { освобождение старой памяти }
      FreeMem(p, count * sizeof(double));
      p := np;
      count := ACount;
    end;
  end;
end;

procedure TDynArray.Reset;
begin
  { обнуление данных }
  fillchar(p^, count * sizeof(double), 0);
end;

destructor TDynArray.Destroy;
begin
  SetCount(0);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  a: TDynArray;
  i: integer;
  s: string;
begin
  a.Create(3);
  a.p[0] := 10;
  a.p[1] := 20;
  { второй элемент не указывается, но вследствие обнуления
  при создании массива он равен 0 }
  s := 'Элементы в массиве:';
  for i := 0 to a.count - 1 do
    s := s + #13#10 + IntToStr(i+1) + ': ' + FloatToStr(a.p[i]);
  ShowMessage(s);

  a.SetCount(4);
  a.p^[3] := 50;
  { значения первых элементов не теряются }
  s := 'Элементы в массиве:';
  for i := 0 to a.count - 1 do
    s := s + #13#10 + IntToStr(i+1) + ': ' + FloatToStr(a.p[i]);
  ShowMessage(s);

  a.Destroy;
end;

Статья Создать динамический массив раздела Синтаксис Массивы может быть полезна для разработчиков на delphi & pascal.


Комментарии и вопросы


Ваше мнение или вопрос к статье в виде простого текста (Tag <a href=... Disabled). Все комментарии модерируются, модератор оставляет за собой право удалить непонравившейся ему комментарий.

заголовок

e-mail

Ваше имя

Сообщение

Введите код




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Массивы ::


реклама



©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru Rambler's Top100

Время компиляции файла: 2024-04-26 19:56:12
2024-04-27 00:31:10/0.0030019283294678/0