![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Создание кросс-массива
Андрей Пазик © (2006-08-23 10:30:00)У нас есть 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 16:20:00) [1]Да не, Толян, проблема как раз в заполнении.
В создании сколь угодно размерного массива проблем нет.
Задача решена, так что не переживайте.
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
Anatoly Podgoretsky (2006-08-23 16:07:00) [2]Ну если посмотреть выше, то что у него нарисовано становится загадкой.
guav (2006-08-23 15:15:00) [3]В вопросе вроде нарисован двумерный в качестве "кросс-массива".
Что нужно на самом деле, об этом пока может знать только автор.
в [27] я немного напутал с условием, получился первый столбец самый быстроменяющимся, но если нужночто-то вроде [27], то [20] MBo © (23.08.06 13:03) прав.
Если нужно что-то другое, то не понятно на что мог надеется автор, ведь тема кросс-массива таки не раскрыта.
Anatoly Podgoretsky (2006-08-23 14:45:00) [4]MBo © (23.08.06 13:03) [20]
Трехмерный.
Но на самом деле нужен или куб или гиперкуб, из вопроса не понятно. Привел бы для четырез измерений, было бы более понятно, что нужно.
Я уже общался с ним на SQL.RU
Anatoly Podgoretsky (2006-08-23 14:41:00) [5]Андрей Пазик (23.08.06 10:50) [6]
Как раз заполнение не составляет проблем, а вот размерность у массива задается на стадии компиляции, не отностится к разным вариантным массивам.
guav (2006-08-23 14:28:00) [6]
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;
Андрей Пазик (2006-08-23 13:35:00) [7]
>
> Впрочем, LMD.
>
Взаимно.
Сергей М. (2006-08-23 13:30:00) [8]
> Андрей Пазик (23.08.06 13:19) [24]
Еще как решит).. Вкупе с VarArrayDimCount, VarArrayHighBound, VarArrayLowBound)
Впрочем, LMD.
Андрей Пазик (2006-08-23 13:19:00) [9]ага, щаз, аж бегом решит.
Ладно, вопрос снят.
Сергей М. (2006-08-23 13:07:00) [10]
> Андрей Пазик (23.08.06 12:59) [19]
Тебе и на SQL.RU сказали, что VarArrayCreate() с успехом решит твою задачу)
MBo (2006-08-23 13:06:00) [11]Пардон, при первом чтении не осознал, что нужно получить все сочетания.
Андрей Пазик (2006-08-23 13:04:00) [12]Ладно, следует так следует. Не переживайте.
MBo (2006-08-23 13:03:00) [13]Из первоначального вопроса следует, что массив нужен двумерный, и первый же ответ вполне подходит. Двумерный массив заполняется обычно парой вложенных циклов, и никаких проблем в связи с этим не видно...
Андрей Пазик (2006-08-23 12:59:00) [14]Более подробно о задаче здесь
http://sql.ru/forum/actualthread.aspx?tid=329761
подход к реализации нашел здесь
http://www.basegroup.ru/olap/core_part2.htm
StriderMan (2006-08-23 12:56:00) [15]
> Андрей Пазик (23.08.06 12:50) [15]
> CROSS JOIN с переменным (и любым) количеством таблиц может
речь про БД вообще не шла. Предлагаю не морочить голову с массивами, и пользоваться наследниками TList
Ketmar (2006-08-23 12:55:00) [16]> [15] Андрей Пазик (23.08.06 12:50)
не совсем понятен глубокий смысл задачи, но особых проблем с реализацией всё равно не вижу. вполне себе задачка на рекурсию.
Плохиш (2006-08-23 12:54:00) [17]
> Андрей Пазик (23.08.06 12:50) [15]
Если "CROSS JOIN" это то о чём я подумал, то какого ты 2,5 часа мозги компосируешь какими-то "кросс-массивами"?
Андрей Пазик (2006-08-23 12:50:00) [18]мда..... В начинающие, говорите... То есть реализовать CROSS JOIN с переменным (и любым) количеством таблиц может начинающий... Удачи вам.
Сергей М. (2006-08-23 12:05:00) [19]
> Андрей Пазик (23.08.06 10:50) [6]
> сколько будет массивов - на момент компиляции не известно
VarArrayCreate() спасет ОРД)
StriderMan (2006-08-23 11:49:00) [20]
> saxon (23.08.06 11:38) [12]
> Может рекурсия поможет?
а при чем тут рекурсия вообще?