Форум: "Начинающим";
Текущий архив: 2006.09.10;
Скачать: [xml.tar.bz2];
ВнизСоздание кросс-массива Найти похожие ветки
← →
Андрей Пазик (2006-08-23 10:30) [0]У нас есть n массивов разных типов. Как создать кросс-массив в рантайм? Ведь количество массивов на этапе компиляции не известно.
Пример. Есть массивы
Iarr = [1,2,3]
Sarr = ["aaa","bbb"]
DateArr = ["20.08.06", "21.08.06", "22.08.06"]
Нужно получить кросс-массив
{
[1, "aaa", "20.08.06"],
[1, "aaa", "21.08.06"],
...
[3, "bbb", "22.08.06"]
}
← →
Плохиш © (2006-08-23 10:33) [1]
var ar: Array of Array of Variant;
?
← →
Андрей Пазик (2006-08-23 10:37) [2]Ну это как-то грубо...
Да и все равно как заполнить данный массив - количество подмассивов не ограничено.
← →
StriderMan © (2006-08-23 10:44) [3]
> Андрей Пазик (23.08.06 10:37) [2]
> Ну это как-то грубо...
> Да и все равно как заполнить данный массив - количество
> подмассивов не ограничено.
SetLength
← →
Андрей Пазик (2006-08-23 10:45) [4]Ну не надо меня лечит, ладно? Устанавливать размерности как-то умеем
← →
Джо © (2006-08-23 10:47) [5]> [4] Андрей Пазик (23.08.06 10:45)
> Ну не надо меня лечит, ладно?
Хамство неизлечимо, это правда.
> Устанавливать размерности как-то умеем
Тогда почему не применяем на практике?
← →
Андрей Пазик (2006-08-23 10:50) [6]Вопрос не в создании размерностей массива, а в заполнении. Если бы у нас было три массива, хватило бы трех циклов. Но сколько будет массивов - на момент компиляции не известно. Потому для заполнения это не подходит.
← →
tButton © (2006-08-23 10:57) [7]
> хватило бы трех циклов
...
> на момент компиляции не известно
а в ран-тайме известно?
если да то что мешает
for i:=1 to количество_массивов do
или унифицируйте свою систему как-то
чтоб не возникал вопрос
← →
StriderMan © (2006-08-23 10:58) [8]
> Андрей Пазик (23.08.06 10:50) [6]
> Но сколько будет массивов - на момент компиляции не известно.
> Потому для заполнения это не подходит.
а ты их заполняешь на момент компиляции? тогда константные массивы лучше сделать.
а если не на момент компиляции, м.б. low и high - то что нужно?
← →
Плохиш © (2006-08-23 10:59) [9]Товагищ Модератор. Т.к. ветка всё ещё не в "Начинающих", можно в ней автомодератора отключить? :-)
← →
Джо © (2006-08-23 11:07) [10]> Но сколько будет массивов - на момент компиляции не известно.
А каким образом оно становится известно во время исполнения?
← →
Ketmar © (2006-08-23 11:27) [11]мутно всё как-то. совершенно непонятно, что за задача такая хитрая, и как вообще автор вопроса себе всё это представляет...
← →
saxon (2006-08-23 11:38) [12]
> Джо © (23.08.06 11:07) [10]
> А каким образом оно становится известно во время исполнения?
Может рекурсия поможет?
← →
StriderMan © (2006-08-23 11:49) [13]
> saxon (23.08.06 11:38) [12]
> Может рекурсия поможет?
а при чем тут рекурсия вообще?
← →
Сергей М. © (2006-08-23 12:05) [14]
> Андрей Пазик (23.08.06 10:50) [6]
> сколько будет массивов - на момент компиляции не известно
VarArrayCreate() спасет ОРД)
← →
Андрей Пазик (2006-08-23 12:50) [15]мда..... В начинающие, говорите... То есть реализовать CROSS JOIN с переменным (и любым) количеством таблиц может начинающий... Удачи вам.
← →
Плохиш © (2006-08-23 12:54) [16]
> Андрей Пазик (23.08.06 12:50) [15]
Если "CROSS JOIN" это то о чём я подумал, то какого ты 2,5 часа мозги компосируешь какими-то "кросс-массивами"?
← →
Ketmar © (2006-08-23 12:55) [17]> [15] Андрей Пазик (23.08.06 12:50)
не совсем понятен глубокий смысл задачи, но особых проблем с реализацией всё равно не вижу. вполне себе задачка на рекурсию.
← →
StriderMan © (2006-08-23 12:56) [18]
> Андрей Пазик (23.08.06 12:50) [15]
> CROSS JOIN с переменным (и любым) количеством таблиц может
речь про БД вообще не шла. Предлагаю не морочить голову с массивами, и пользоваться наследниками TList
← →
Андрей Пазик (2006-08-23 12:59) [19]Более подробно о задаче здесь
http://sql.ru/forum/actualthread.aspx?tid=329761
подход к реализации нашел здесь
http://www.basegroup.ru/olap/core_part2.htm
← →
MBo © (2006-08-23 13:03) [20]Из первоначального вопроса следует, что массив нужен двумерный, и первый же ответ вполне подходит. Двумерный массив заполняется обычно парой вложенных циклов, и никаких проблем в связи с этим не видно...
← →
Андрей Пазик (2006-08-23 13:04) [21]Ладно, следует так следует. Не переживайте.
← →
MBo © (2006-08-23 13:06) [22]Пардон, при первом чтении не осознал, что нужно получить все сочетания.
← →
Сергей М. © (2006-08-23 13:07) [23]
> Андрей Пазик (23.08.06 12:59) [19]
Тебе и на SQL.RU сказали, что VarArrayCreate() с успехом решит твою задачу)
← →
Андрей Пазик (2006-08-23 13:19) [24]ага, щаз, аж бегом решит.
Ладно, вопрос снят.
← →
Сергей М. © (2006-08-23 13:30) [25]
> Андрей Пазик (23.08.06 13:19) [24]
Еще как решит).. Вкупе с VarArrayDimCount, VarArrayHighBound, VarArrayLowBound)
Впрочем, LMD.
← →
Андрей Пазик (2006-08-23 13:35) [26]
>
> Впрочем, LMD.
>
Взаимно.
← →
guav © (2006-08-23 14:28) [27]
procedure AssignFirstArray(var Dest: TCrossArray; const Added: array of Variant);
var
I: Cardinal;
begin
SetLength(Dest, Length(Added), 1);
for I := 0 to High(Dest) do
Dest[I, 0] := Added[I];
end;
procedure AddArray(var Dest: TCrossArray; const Added: array of Variant);
var
I, J, L: Integer;
begin
L := Length(Dest);
SetLength(Dest, L * Length(Added), Length(Dest[0]) + 1);
for I := 0 to L - 1 do
for J := 1 to High(Added) do
Dest[I + L * J] := Copy(Dest[I]);
for J := 0 to High(Added) do
for I := 0 to L - 1 do
Dest[I + L * J, High(Dest[0])] := Added[J];
end;
procedure TForm1.PrintArray(const Src: TCrossArray);
var
I, J: Integer;
begin
StringGrid1.RowCount := Length(Src);
StringGrid1.ColCount := Length(Src[0]);
for I := 0 to High(Src) do
begin
for J := 0 to High(Src[I]) do
begin
StringGrid1.Cells[J, I] := Src[I, J];
end;
end;
end;
var
A: TCrossArray;
procedure TForm1.FormCreate(Sender: TObject);
begin
StringGrid1.FixedCols := 0;
StringGrid1.FixedRows := 0;
AssignFirstArray(A, [1,2,3]);
AddArray(A, ["aaa","bbb"]);
AddArray(A, ["20.08.06", "21.08.06", "22.08.06"]);
PrintArray(A);
end;
← →
Anatoly Podgoretsky © (2006-08-23 14:41) [28]Андрей Пазик (23.08.06 10:50) [6]
Как раз заполнение не составляет проблем, а вот размерность у массива задается на стадии компиляции, не отностится к разным вариантным массивам.
← →
Anatoly Podgoretsky © (2006-08-23 14:45) [29]MBo © (23.08.06 13:03) [20]
Трехмерный.
Но на самом деле нужен или куб или гиперкуб, из вопроса не понятно. Привел бы для четырез измерений, было бы более понятно, что нужно.
Я уже общался с ним на SQL.RU
← →
guav © (2006-08-23 15:15) [30]В вопросе вроде нарисован двумерный в качестве "кросс-массива".
Что нужно на самом деле, об этом пока может знать только автор.
в [27] я немного напутал с условием, получился первый столбец самый быстроменяющимся, но если нужночто-то вроде [27], то [20] MBo © (23.08.06 13:03) прав.
Если нужно что-то другое, то не понятно на что мог надеется автор, ведь тема кросс-массива таки не раскрыта.
← →
Anatoly Podgoretsky © (2006-08-23 16:07) [31]Ну если посмотреть выше, то что у него нарисовано становится загадкой.
← →
Андрей Пазик (2006-08-23 16:20) [32]Да не, Толян, проблема как раз в заполнении.
В создании сколь угодно размерного массива проблем нет.
Задача решена, так что не переживайте.761863 01.09.2006 00:00:00 32 16,6666666666667
761863 02.09.2006 00:00:00 131 266,666666666667
761863 03.09.2006 00:00:00 132 233,333333333333
761863 04.09.2006 00:00:00 32 16,6666666666667
761863 05.09.2006 00:00:00 131 266,666666666667
761863 06.09.2006 00:00:00 132 233,333333333333
761863 07.09.2006 00:00:00 32 16,6666666666667
761863 08.09.2006 00:00:00 131 266,666666666667
761863 09.09.2006 00:00:00 132 233,333333333333
761863 10.09.2006 00:00:00 32 16,6666666666667
761863 11.09.2006 00:00:00 131 266,666666666667
761863 12.09.2006 00:00:00 132 233,333333333333
761863 13.09.2006 00:00:00 32 16,6666666666667
761863 14.09.2006 00:00:00 131 266,666666666667
761863 15.09.2006 00:00:00 132 233,333333333333
761863 16.09.2006 00:00:00 32 16,6666666666667
761863 17.09.2006 00:00:00 131 266,666666666667
761863 18.09.2006 00:00:00 132 233,333333333333
761863 19.09.2006 00:00:00 32 16,6666666666667
761863 20.09.2006 00:00:00 131 266,666666666667
761863 21.09.2006 00:00:00 132 233,333333333333
761863 22.09.2006 00:00:00 32 16,6666666666667
761863 23.09.2006 00:00:00 131 266,666666666667
761863 24.09.2006 00:00:00 132 233,333333333333
761863 25.09.2006 00:00:00 32 16,6666666666667
761863 26.09.2006 00:00:00 131 266,666666666667
761863 27.09.2006 00:00:00 132 233,333333333333
761863 28.09.2006 00:00:00 32 16,6666666666667
761863 29.09.2006 00:00:00 131 266,666666666667
761863 30.09.2006 00:00:00 132 233,333333333333
761863 01.09.2006 00:00:00 32 16,6666666666667
761863 02.09.2006 00:00:00 131 266,666666666667
761863 03.09.2006 00:00:00 132 233,333333333333
761863 04.09.2006 00:00:00 32 16,6666666666667
761863 05.09.2006 00:00:00 131 266,666666666667
761863 06.09.2006 00:00:00 132 233,333333333333
761863 07.09.2006 00:00:00 32 16,6666666666667
761863 08.09.2006 00:00:00 131 266,666666666667
761863 09.09.2006 00:00:00 132 233,333333333333
761863 10.09.2006 00:00:00 32 16,6666666666667
761863 11.09.2006 00:00:00 131 266,666666666667
761863 12.09.2006 00:00:00 132 233,333333333333
761863 13.09.2006 00:00:00 32 16,6666666666667
761863 14.09.2006 00:00:00 131 266,666666666667
761863 15.09.2006 00:00:00 132 233,333333333333
761863 16.09.2006 00:00:00 32 16,6666666666667
761863 17.09.2006 00:00:00 131 266,666666666667
761863 18.09.2006 00:00:00 132 233,333333333333
761863 19.09.2006 00:00:00 32 16,6666666666667
761863 20.09.2006 00:00:00 131 266,666666666667
761863 21.09.2006 00:00:00 132 233,333333333333
761863 22.09.2006 00:00:00 32 16,6666666666667
761863 23.09.2006 00:00:00 131 266,666666666667
761863 24.09.2006 00:00:00 132 233,333333333333
761863 25.09.2006 00:00:00 32 16,6666666666667
761863 26.09.2006 00:00:00 131 266,666666666667
761863 27.09.2006 00:00:00 132 233,333333333333
761863 28.09.2006 00:00:00 32 16,6666666666667
761863 29.09.2006 00:00:00 131 266,666666666667
761863 30.09.2006 00:00:00 132 233,333333333333
761863 01.09.2006 00:00:00 32 16,6666666666667
761863 02.09.2006 00:00:00 131 266,666666666667
761863 03.09.2006 00:00:00 132 233,333333333333
761863 04.09.2006 00:00:00 32 16,6666666666667
761863 05.09.2006 00:00:00 131 266,666666666667
761863 06.09.2006 00:00:00 132 233,333333333333
761863 07.09.2006 00:00:00 32 16,6666666666667
761863 08.09.2006 00:00:00 131 266,666666666667
761863 09.09.2006 00:00:00 132 233,333333333333
761863 10.09.2006 00:00:00 32 16,6666666666667
761863 11.09.2006 00:00:00 131 266,666666666667
761863 12.09.2006 00:00:00 132 233,333333333333
761863 13.09.2006 00:00:00 32 16,6666666666667
761863 14.09.2006 00:00:00 131 266,666666666667
761863 15.09.2006 00:00:00 132 233,333333333333
761863 16.09.2006 00:00:00 32 16,6666666666667
761863 17.09.2006 00:00:00 131 266,666666666667
761863 18.09.2006 00:00:00 132 233,333333333333
761863 19.09.2006 00:00:00 32 16,6666666666667
761863 20.09.2006 00:00:00 131 266,666666666667
761863 21.09.2006 00:00:00 132 233,333333333333
761863 22.09.2006 00:00:00 32 16,6666666666667
761863 23.09.2006 00:00:00 131 266,666666666667
761863 24.09.2006 00:00:00 132 233,333333333333
761863 25.09.2006 00:00:00 32 16,6666666666667
761863 26.09.2006 00:00:00 131 266,666666666667
761863 27.09.2006 00:00:00 132 233,333333333333
761863 28.09.2006 00:00:00 32 16,6666666666667
761863 29.09.2006 00:00:00 131 266,666666666667
761863 30.09.2006 00:00:00 132 233,333333333333
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.09.10;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.053 c