Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Создание кросс-массива


Страницы:   1 2

Андрей Пазик ©   (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]
> Может рекурсия поможет?

а при чем тут рекурсия вообще?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо