![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Многомерный массив [D5, Win95/98]
Schummi © (2004-10-05 09:04:00)Уважаемые Мастера!
Помогите, пожалуйста с таким вопросом: как во время выполнения программы создать многомерный массив? Глубина "многомерности" определяется во время работы.
Заранее спасибо!
Palladin (2004-10-06 23:42:00) [1]
> Тип с указанием количества размерностей должен быть определен
> на этапе компиляции
С типом согласен, хотя ничто не мешает использовать указатели на Variant, с количеством размерностей только на этапе компиляции не согласен...
Palladin (2004-10-06 23:40:00) [2]хотькакоймерный массив есть просто участок памяти... нужно лишь организовать адрессацию... структуру размерности хранить в виде дерева...
Mihey_temporary (2004-10-06 23:34:00) [3]
> Рыба © (05.10.04 23:51) [14]
Не решает проблему run-time многомерности.
Schummi (2004-10-06 22:19:00) [4]у меня ещё идея есть такая создать массив pointer'ов и указывать как его элементы либо опять указатели на эти массивы поинтеров (пока не реализуется многомерность), а потом в конце указывать вместо поинтеров PChar.
TUser (2004-10-06 10:53:00) [5]
> Могу покопаться дома
Извини, не покопался. Вчера было весело, а сегодня с утра голова не думала о модулях и произвольной степени многомерности. Попроси на мыло - завтра вышлю, если надо.
Sandman25 (2004-10-06 09:01:00) [6][14] Рыба © (05.10.04 23:51)
У SetLength может быть больше 2 параметров.
SetLength(M, XL, YL)
Рыба (2004-10-05 23:51:00) [7]Вот к примеру двумерный дин. массив:
var M: array of array of Integer;
i: Integer;
begin
SetLength(M, XL);
for i := 0 to High(M) - 1 do
SetLength(M[i], YL);
end;
будет тоже самое, что и
var M: array [0..XL-1, 0..YL-1] of Integer;
atruhin (2004-10-05 16:16:00) [8]С вариантами без проблем. Но медленно.
Romkin (2004-10-05 12:16:00) [9]MBo © (05.10.04 12:07) [9] Упс... Не знал. Но подозревал :))
Действительно, довольно странно должно выглядеть MyArr.Elem[[1,1,2]] :))
Fay (2004-10-05 12:15:00) [10]2 MBo © (05.10.04 12:07) [9]
Даже "через указатели" никак?
Sandman25 (2004-10-05 12:12:00) [11]var
V: Variant;
Ind: array of Integer;
begin
SetLength(Ind, 4);
Ind[0] := 0;
Ind[1] := 2;
Ind[2] := 0;
Ind[3] := 3;
V := VarArrayCreate(Ind, varInteger);
SetLength(Ind, 2);
Ind[0] := 2;
Ind[1] := 1;
VarArrayPut(V, 17, Ind);
ShowMessage(VarArrayGet(V, Ind));
MBo (2004-10-05 12:07:00) [12]>Romkin © (05.10.04 11:01) [6]
Об этом я и думал - но индекс свойства - открытый массив - не поддерживается.
TUser (2004-10-05 11:08:00) [13]Могу покопаться дома - у меня валялся модуль для такого дела. Индексы для произвольной 'глубины многомерности' передаются, как динамический одномерный массив.
Sandman25 (2004-10-05 11:04:00) [14]VarArrayCreate
Romkin (2004-10-05 11:01:00) [15]MBo © (05.10.04 10:04) [5] Выйдет скорее всего. Через open array :)
MBo (2004-10-05 10:04:00) [16]>Fay © (05.10.04 09:28) [4]
Думалось о доступе не через методы, а через свойство - но так, похоже не выйдет.
Fay (2004-10-05 09:28:00) [17]А вот и нет, не загнул. Очень даже можно. Просто не всем это покажется удобным_&_быстрым 8)
MBo (2004-10-05 09:23:00) [18]>доступ для удобства можно обернуть в класс.
про это я, пожалуй, загнул.
Fay (2004-10-05 09:14:00) [19]GetMem.
MBo (2004-10-05 09:07:00) [20]Никак. Тип с указанием количества размерностей должен быть определен на этапе компиляции.
Но ничего не мешает сэмулировать многомерный массив с помощью динамического одномерного - доступ для удобства можно обернуть в класс.