Чтение онлайн

ЖАНРЫ

Советы по Delphi. Версия 1.0.6

Озеров Валентин

Шрифт:

type

 VArray : Array[1..1] of double;

var

 X: ^VArray;

 NR, NC: Longint;

begin

 NR:= 10000;

 NC:= 100;

 if AllocArray(pointer(X), N*Sizeof(VArray)) then exit;

 SetV(X^, NC, 2000, 5, 3.27); { X[2000,5] := 3.27 }

end;

function AllocArray(var V: pointer; const N: longint): Boolean;

begin {распределяем
память для массива v размера n}

 try

GetMem(V, N);

 except

ShowMessage('ОШИБКА выделения памяти. Размер:' + IntToStr(N));

Result:= True;

exit;

 end;

 FillChar(V^, N, 0); {в случае включения длинных строк заполняем их нулями}

 Result:= False;

end;

procedure SetV(var X: Varray; const N,ir,ic: LongInt;const value: double);

begin {заполняем элементами двухмерный массив x размером ? x n : x[ir,ic] := value}

 X[N*(ir-1) + ic]:= value;

end;

function GetV(const X: Varray; const N, ir,ic : Longint): double;

begin {возвращаем величины x[ir,ic] для двухмерного массива шириной n столбцов}

 Result:= X[N*(ir-1) + ic];

end;

Раздел 2

Самый простой путь – создать массив динамически

Myarray:= GetMem(rows * cols * sizeof(byte,word,single,double и пр.)

сделайте функцию fetch_num типа

function fetch_num(r,c:integer): single;

result:= pointer + row + col*rows

и затем вместо myarray[2,3] напишите

myarray.fetch_num(2,3)

поместите эти функции в ваш объект и работа с массивами станет пустячным делом. Я экспериментировал с многомерными (вплоть до 8) динамическими сложными массивами и эти функции показали отличный результат.

Раздел 3

Вот способ создания одно– и двухмерных динамических массивов:

(*

– -

–- модуль для создания двух очень простых классов обработки динамических массивов

– - TDynaArray : одномерный массив

– - TDynaMatrix : двумерный динамический массив

– -

*)

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

Поделиться с друзьями: