Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 18.05.2013, 19:08
gadmaker gadmaker вне форума
Прохожий
 
Регистрация: 19.04.2009
Сообщения: 49
Репутация: 10
По умолчанию массив с разными типами данных 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 ???????;
MAD: Читаем правила по оформлению кода!

Подскажите пожалуйста какой тип даттых применить.

Последний раз редактировалось M.A.D.M.A.N., 18.05.2013 в 20:53.
Ответить с цитированием
  #2  
Старый 18.05.2013, 19:28
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Код:
GridChunk: array of TObject;
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #3  
Старый 18.05.2013, 20:54
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Код:
array of variant
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #4  
Старый 19.05.2013, 05:20
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от gadmaker
...какой тип даттых применить.
Можно ведь ещё свой, "записной" тип использовать.

Код:
// описание типа
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  
Старый 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.
Ответить с цитированием
  #6  
Старый 19.05.2013, 06:31
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

надо так
Код:
(Cell.GridChunk[gc] as TChunkByte).Cube[30]:= 6;
Ответить с цитированием
  #7  
Старый 19.05.2013, 06:56
gadmaker gadmaker вне форума
Прохожий
 
Регистрация: 19.04.2009
Сообщения: 49
Репутация: 10
Радость

Alegun спасибо за быстрый, дельный ответ, действительно помогло про такие конструкции я незнал.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 20:44.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter