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