Здравствуйте, уважаемые подписчики! Сегодня поговорим о том,
как создать динамический массив - массив, который может менять свой
размер во время выполнения программы. Он нужен, когда на стадии
разработки программы количество элементов неизвестно.
Мы создадим универсальный динамический массив. Это может быть массив
чисел, символов или элементов любого другого типа. Достаточно вместо
longint (в коде подчеркнуто) поставить нужный тип данных.
Количество элементов, задаваемое свойством Count, практически
ограничено только объемом памяти. При изменении Count данные из
массива не стираются, поскольку при выделении нового участка памяти
в него копируется информация из старого.
Обращение к элементам массива осуществляется через свойство Items.
Итак, массив описывается следующим кодом:
unit DynArray;
interfacetypeTElem = longint;
PElem = ^TElem;
TDynArray = classprivate
FCount: integer;
FP: Pointer;
procedure SetCount(v: integer);
procedure SetItem(index: integer; v: TElem);
function GetItem(index: integer): TElem;
publicproperty 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;
implementationprocedure TDynArray.SetCount(v: integer);
var
NP: Pointer;
beginif FCount = v then Exit;
if v <= 0 thenbeginif FCount > 0 then FreeMem(FP, FCOunt);
FCount := 0;
Exit;
end;
GetMem(NP, v * sizeof(TElem));
if (FCount > 0) thenbeginif 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);
beginif (index >= 0) and (index < FCount)
then PElem(integer(FP) + index * sizeof(TElem))^ := v;
end;
function TDynArray.GetItem(index: integer): TElem;
beginif (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;
beginif FCount > 0 then SetCount(0);
end;
end.
И, наконец, пример программы, использующей динамический массив.