Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.09.10;
Скачать: CL | DM;

Вниз

Создание кросс-массива   Найти похожие ветки 

 
Андрей Пазик   (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;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.049 c
15-1155323160
ronyn
2006-08-11 23:06
2006.09.10
Программно определить MotherBoard...


1-1154356907
Anton22
2006-07-31 18:41
2006.09.10
Прозрачный фон Memo


15-1155814241
lorn
2006-08-17 15:30
2006.09.10
cryatal report-delphi-w2k


2-1156043410
Mikes
2006-08-20 07:10
2006.09.10
Запуск приложения в DELPHI.


10-1123268291
Michael5
2005-08-05 22:58
2006.09.10
Как задать ширину столбца в Excel?