|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
массив с разными типами данных delphi
Можно ли создать массив с разными типами данных такой формы:
Код:
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 — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#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 спасибо за быстрый, дельный ответ, действительно помогло про такие конструкции я незнал.
|