Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1155826819
ArtemESC
2006-08-17 19:00
2006.09.10
Забыл...


2-1156314634
Андрей Пазик
2006-08-23 10:30
2006.09.10
Создание кросс-массива


2-1155900973
Ega23
2006-08-18 15:36
2006.09.10
PVariant как параметр.


15-1155715787
Furyz
2006-08-16 12:09
2006.09.10
Борьба со спамом


1-1154168715
Percent
2006-07-29 14:25
2006.09.10
TWebBrowser, IHTMLDocument и утечка памяти





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский