--

*)

unit DynArray;

INTERFACE

uses SysUtils;

Type TDynArrayBaseType = double;

Const vMaxElements  =  (High(Cardinal) – $f) div sizeof(TDynArrayBaseType);

{= гарантирует максимально возможный массив =}

Type

 TDynArrayNDX     =  1..vMaxElements;

 TArrayElements   =  array[TDynArrayNDX] of TDynArrayBaseType;

 {= самый большой массив TDynArrayBaseType, который мы может объявить =}

 PArrayElements   =  ^TArrayElements;

 {= указатель на массив =}

 EDynArrayRangeError  =  CLASS(ERangeError);

 TDynArray  =  CLASS

 Private

  fDimension: TDynArrayNDX;

  fMemAllocated: word;

  Function  GetElement(N: TDynArrayNDX): TDynArrayBaseType;

  Procedure SetElement(N: TDynArrayNDX; const NewValue: TDynArrayBaseType);

 Protected

  Elements : PArrayElements;

 Public

  Constructor Create(NumElements : TDynArrayNDX);

  Destructor Destroy; override;

  Procedure Resize(NewDimension : TDynArrayNDX); virtual;

  Property dimension: TDynArrayNDX read fDimension;

  Property Element[N : TDynArrayNDX] : TDynArrayBaseType read GetElement write SetElement; default;

 END;

Const

 vMaxMatrixColumns = 65520 div sizeof(TDynArray);

 {= построение матрицы класса с использованием массива объектов TDynArray =}

Type

 TMatrixNDX  =  1..vMaxMatrixColumns;

 TMatrixElements  =  array[TMatrixNDX] of TDynArray;

 {= каждая колонка матрицы будет динамическим массивом =}

 PMatrixElements  =  ^TMatrixElements;

 {= указатель на массив указателей… =}

 TDynaMatrix  =  CLASS

 Private

  fRows          : TDynArrayNDX;

  fColumns       : TMatrixNDX;

  fMemAllocated  : longint;

  Function GetElement(row: TDynArrayNDX; column: TMatrixNDX): TDynArrayBaseType;

  Procedure SetElement(row: TDynArrayNDX; column: TMatrixNDX; const NewValue: TDynArrayBaseType);

 Protected

  mtxElements: PMatrixElements;

 Public

  Constructor Create(NumRows : TDynArrayNDX; NumColumns : TMatrixNDX);

  Destructor Destroy; override;

  Property rows: TDynArrayNDX read fRows;

  Property columns: TMatrixNDX read fColumns;

  Property Element[row : TDynArrayNDX; column : TMatrixNDX] : TDynArrayBaseType read GetElement write SetElement; default;

 END;

IMPLEMENTATION

(*

 --

 --  методы TDynArray

 --

*)

Constructor TDynArray.Create(NumElements : TDynArrayNDX);

BEGIN   {==TDynArray.Create==}

 inherited Create;

 fDimension:= NumElements;

 GetMem(Elements, fDimension*sizeof(TDynArrayBaseType));

 fMemAllocated:= fDimension*sizeof(TDynArrayBaseType);

 FillChar(Elements^, fMemAllocated, 0);

END;    {==TDynArray.Create==}

Destructor TDynArray.Destroy;

BEGIN   {==TDynArray.Destroy==}

 FreeMem(Elements, fMemAllocated);

 inherited Destroy;

END;    {==TDynArray.Destroy==}

Перейти на страницу:

Похожие книги