|
|
| ::Главная страница ::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 динамического массива, используется для ускорения обращения к элементам.
|
Тематические
ссылки
|
| Ваша ссылка | Ваша ссылка |
|
Обмен кнопками, ведение статистики, реклама. |
|||