Показать сообщение отдельно
  #5  
Старый 19.05.2013, 06:17
gadmaker gadmaker вне форума
Прохожий
 
Регистрация: 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.
Ответить с цитированием