![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
|||
|
|||
|
Можно ли создать массив с разными типами данных такой формы:
Код:
type TChunkByte = class(TObject) public Cube: array[0..255] of Byte; end; TChunkLongWord = class(TObject) public Cube: array[0..4095] of LongWord; end; var GridChunk: array of ???????; Подскажите пожалуйста какой тип даттых применить. Последний раз редактировалось M.A.D.M.A.N., 18.05.2013 в 20:53. |
|
#2
|
||||
|
||||
|
Код:
GridChunk: array of TObject; |
|
#3
|
||||
|
||||
|
Код:
array of variant |
|
#4
|
||||
|
||||
|
Цитата:
Код:
// описание типа type ChunkType = record CubeLongWord: array [0..4095] of LongWord; CubeByte: array [0..255] of Byte; end; Код:
// объявление неограниченного массива var GridChunk: array of ChunkType; // установка границ массива SetLength(GridChunk, 100); // обращение к элементам массива GridChunk[0].CubeByte[50]:= 0; GridChunk[100].CubeLongWord[1200]:= 4294967295; |
|
#5
|
|||
|
|||
|
Спасибо за ответы но почему-то с использованием типов 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. |
|
#6
|
||||
|
||||
|
надо так
Код:
(Cell.GridChunk[gc] as TChunkByte).Cube[30]:= 6; |
|
#7
|
|||
|
|||
|
Alegun спасибо за быстрый, дельный ответ, действительно помогло про такие конструкции я незнал.
|