Пишу нечто похожее на 3D карту, структуру ячеек с шириной, высотой, и длинной по типу одномерного массива:
Код:
type TGrid3D = class(TObject)
public
SizeX, SizeY, SizeZ: Integer;
Grid3D: array of Byte;
end;
var
Grid3D: array of TGrid3D;
Grid3DNumber: Word = 0;
function DsGrid3dCreate(SX,SY,SZ: Double): Double; cdecl;
begin
Result:=-1;
if SX*SY*SZ>1024*1024*1024 then Exit;
SetLength(Grid3D,Length(Grid3D)+1);
Grid3D[Grid3DNumber]:=TGrid3D.Create;
Grid3D[Grid3DNumber].SizeX:=Trunc(SX);
Grid3D[Grid3DNumber].SizeY:=Trunc(SY);
Grid3D[Grid3DNumber].SizeZ:=Trunc(SZ);
SetLength(Grid3D[Grid3DNumber].Grid3D,Grid3D[Grid3DNumber].SizeX*Grid3D[Grid3DNumber].SizeY*Grid3D[Grid3DNumber].SizeZ);
Result:=Grid3DNumber;
Grid3DNumber:=Grid3DNumber+1;
end;
function DsGrid3dDestroy(ID: Double): Double; cdecl;
begin
Result:=0;
Grid3D[Trunc(ID)].Destroy;
Result:=1;
end;
function DsGrid3dSet(ID, X, Y, Z, V: Double): Double; cdecl;
var r: Integer;
begin
Result:=0;
r:=Grid3D[Trunc(ID)].SizeX*Grid3D[Trunc(ID)].SizeY*Trunc(Z)+Grid3D[Trunc(ID)].SizeX*Trunc(Y)+Trunc(X);
Grid3D[Trunc(ID)].Grid3D[r]:=Trunc(V);
Result:=1;
end;
function DsGrid3dGet(ID, X, Y, Z: Double): Double; cdecl;
var r: Integer;
begin
r:=Grid3D[Trunc(ID)].SizeX*Grid3D[Trunc(ID)].SizeY*Trunc(Z)+Grid3D[Trunc(ID)].SizeX*Trunc(Y)+Trunc(X);
if (X<0) or (Y<0) or (Z<0) or
(X>=Grid3D[Trunc(ID)].SizeX) or (Y>=Grid3D[Trunc(ID)].SizeY) or (Z>=Grid3D[Trunc(ID)].SizeZ)
then Result:=-1 else Result:=Grid3D[Trunc(ID)].Grid3D[r];
end;
function DsGrid3dGetSize(ID, WHD: Double): Double; cdecl;
begin
try
Result:=-1;
if WHD = 0 then Result:= Grid3D[Trunc(ID)].SizeX;
if WHD = 1 then Result:= Grid3D[Trunc(ID)].SizeY;
if WHD = 2 then Result:= Grid3D[Trunc(ID)].SizeZ;
except
Result:=-1;
end;
end;
вопрос в оптимизации DsGrid3dGet т.к. для защиты от некорректного ввода пользователя используется условие т.е. код защищён от запроса на отсутствующую ячейку. Можно ли заменить условие чем-то более быстым, поскольку этот запрос наиболее востребыванный?