19.05.2013, 06:17
|
Прохожий
|
|
Регистрация: 19.04.2009
Сообщения: 49
Репутация: 10
|
|
Спасибо за ответы но почему-то с использованием типов TObject и Variant не работает а объединение типов TChunkByte и TChunkLongWord в один не подходит т.к. придётся задействовать дополнительные условия для проверки к какому из массивов выполняется обращение.
Вот весь код целиком может кто скажет в чем ошибка:
Код:
library MegaGrid3D;
uses
SysUtils;
//Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs;
{ ÍÀÁÎÐÛ ÎÑÍÎÂÍÛÕ ÊËÀÑÑÎÂ }
type
TChunkByte = class(TObject) // Êëàññ çíà÷åíèé âîêñåëÿ 0..255
public
Cube: array[0..255] of Byte;
end;
TChunkLongWord = class(TObject) // Êëàññ çíà÷åíèé âîêñåëÿ 0..4294967295
public
Cube: array[0..4095] of LongWord;
end;
TGrid = class(TObject) // Êëàññ ÷àíêîâ
public
GridSizeX, GridSizeY, GridSizeZ: Byte; // Ðàçìåðû ñåòè (â ÷àíêàõ)
GridType: Byte; // Òèï èñïîëüçóåìûõ äàííûõ äëÿ õðàíåíèÿ çíà÷åíèé â âîêñåëÿõ
// ИСТОЧНИК ОШИБКИ
GridChunk: array of TObject; // ИСТОЧНИК ОШИБКИ
// ИСТОЧНИК ОШИБКИ
end;
{ ÍÀÁÎÐÛ ÎÑÍÎÂÍÛÕ ÏÅÐÅÌÅÍÍÛÕ }
var
Grid3D: array of TGrid; // Õðàíèëèùå èíäåêñîâ ñîçäàííûõ ñåòîê
Grid3DNumber: Word = 0; // Èíäåêñ ñëåäóþùåé ñîçäàâàåìîé ñåòè
{ ÍÀÁÎÐÛ ÎÑÍÎÂÍÛÕ ÔÓÍÊÖÈÉ }
// ÎÁÙÈÅ ÔÓÍÊÖÈÈ ÄËß ÑÅÒÈ //////////////////////////////////////////////////////
// ÑÎÇÄÀÒÜ ÑÅÒÜ //
// SX, SY, SZ - Ìàêñèìàëüíûå ðàçìåðû ñåòè
// DateType - Òèï äàííûõ äëÿ êàæäîé ÿ÷åéêè çíà÷åíèé
function G3dCreate(SX, SY, SZ: Double; DateType: Byte): Double; cdecl;
var
Cell: TGrid;
ix, iy, iz: Byte;
gc: LongWord;
begin
Result:=-1;
SetLength(Grid3D,Length(Grid3D)+1); // Äîáàâèòü èíäåêñ ê ñåòè
Grid3D[Grid3DNumber]:=TGrid.Create;
Cell:=Grid3D[Grid3DNumber];
Cell.GridSizeX:=Trunc(SX);
Cell.GridSizeY:=Trunc(SY);
Cell.GridSizeZ:=Trunc(SZ);
SetLength(Cell.GridChunk,Cell.GridSizeX*Cell.GridSizeY*Cell.GridSizeZ); // Íàçíà÷èòü ðàçìåð ñåòè
Cell.GridType:=DateType;
for iz:=0 to Cell.GridSizeZ-1 do begin
for iy:=0 to Cell.GridSizeY-1 do begin
for ix:=0 to Cell.GridSizeX-1 do begin
gc:=(Cell.GridSizeX*(Cell.GridSizeY*iz+iy)+ix);
Cell.GridChunk[gc]:=TChunkByte.Create;
// МЕСТО ПРОВЕРКИ НА РАБОТОСПОСОБНОСТЬ
Cell.GridChunk[gc].Cube:=6; // ЗДЕСЬ И ВЫДАЁТСЯ ОШИБКА
// МЕСТО ПРОВЕРКИ НА РАБОТОСПОСОБНОСТЬ
end;
end;
end;
Result:=Grid3DNumber;
Grid3DNumber:=Grid3DNumber+1;
end;
// ÓÄÀËÈÒÜ ÒШÕÌÅÐÍÓÞ ÑÅÒÜ //
// ID - Èíäåêñ óäàëÿåìîé ñåòè
function G3dDestroy(ID: Double): Double; cdecl;
var
Cell: TGrid;
ix, iy, iz: Byte;
gc: LongWord;
begin
Result:=-1;
Cell:=Grid3D[Trunc(ID)];
for iz:=0 to Cell.GridSizeZ-1 do begin
for iy:=0 to Cell.GridSizeY-1 do begin
for ix:=0 to Cell.GridSizeX-1 do begin
gc:=(Cell.GridSizeX*(Cell.GridSizeY*iz+iy)+ix);
if Cell.GridChunk[gc] <> nil then
begin
Cell.GridChunk[gc].Destroy;
end;
end;
end;
end;
Cell.Destroy;
Result:=1;
end;
// ÎÏÐÅÄÅËÈÒÜ ÐÀÇÌÅÐ ÊÎÎÐÄÈÍÀÒ ÑÅÒÈ Â ×ÀÍÊÀÕ //
// ID - Èíäåêñ óäàëÿåìîé ñåòè
// WHDS - Íîìåð çàïðàøèâàåìîãî çíà÷åíèÿ
function G3dCubeGetSize(ID, WHDS: Double): Double; cdecl;
var
T: array[0..3] of Integer;
Cell: TGrid;
begin
Result:=-1;
Cell:=Grid3D[Trunc(ID)];
T[0]:=Cell.GridSizeX;
T[1]:=Cell.GridSizeY;
T[2]:=Cell.GridSizeZ;
T[3]:=Length(Cell.GridChunk); // Îáùèé ðàçìåð ñåòêè
Result:=T[Trunc(WHDS)];
end;
{ ÝÊÑÏÎÐÒ ÔÓÍÊÖÈÉ ÈÇ DLL }
exports
G3dCreate,
G3dDestroy,
//G3dCubeSetVar,
//G3dCubeGetVar,
G3dCubeGetSize;
//G3dCubeIdGetPos,
//G3dCubeIdSetVar,
//G3dCubeIdGetVar,
//G3dCubeGetId,
//G3dCubeVarReg,
//G3dCubeCopyCube,
//OptCubeCollRay,
//OptCubeCollSegm,
//OptCubeCollPrev;
begin
end.
|