Содержание материала

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

 

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

 

Главным методом объекта является SetCount. Он сделан таким образом, что при изменении количество элементом старые данные не теряются, а новые элементы всегда обнуляются. Процедура Reset обнуляет все существующие элементы. Для того чтобы сделать этот массив, например, массивом целых чисел нужно поменять все double на integer или еще что-то.

 

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

 

Code:

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 = nilthenbegin{ память не была выделена }

 

   if ACount <= 0thenbegin{ новое количество элементов

                               в массиве равно 0 }

     count := 0;

   endelsebegin{ новое количество элементов в массиве

                     больше 0 }

     GetMem(p, ACount * sizeof(double)); { выделение памяти }

     fillchar(p^, ACount * sizeof(double), 0); { обнуление данных }

     count := ACount;

 

   end;

endelsebegin

   if ACount <= 0thenbegin{ новое количество элементов в

                               массиве равно 0 }

     FreeMem(p, count * sizeof(double)); { освобождение памяти }

     count := 0;

   endelsebegin

     GetMem(np, ACount * sizeof(double)); { выделение памяти }

 

     if ACount > count thenbegin{ требуется увеличить

                                    количество элементов }

       move(p^, np^, count * sizeof(double)); { перемещение

                               старых данных на новое место }

       fillchar(np^[count], (ACount - count) * sizeof(double),

         0); { обнуление новых элементов массива }

     endelsebegin

 

       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 := 0to a.count - 1do

 

   s := s + #13#10 + IntToStr(i+1) + ': ' + FloatToStr(a.p[i]);

ShowMessage(s);

 

a.SetCount(4);

a.p^[3] := 50;

{ значения первых элементов не теряются }

s := 'Элементы в массиве:';

for i := 0to a.count - 1do

   s := s + #13#10 + IntToStr(i+1) + ': ' + FloatToStr(a.p[i]);

ShowMessage(s);

 

a.Destroy;

end;

 

Автор советов: Даниил Карапетян

e-mail: delphi4all narod.ru

 

Автор справки: Алексей Денисов

e-mail: aleksey sch103.krasnoyarsk.su

 

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!


Защитный код
Обновить