Вопрос: Двумерный динамический массив | Добавлено: 01.10.09 15:21 |
Автор вопроса: ![]() |
Как организовать например подобное заполнение массива. В данном случае конечно выдает ошибку "Subscript out of range"
Dim array() as string dim i as long, j as long do until rst.EOF i=i+1 do untill rst2.EOF j=j+1 redim preserve(i,j)="bb" loop loop P.S Dim array(,) as string не работает |
Ответы | Всего ответов: 45 |
Номер ответа: 1 Автор ответа: ![]() ![]() ICQ: 237822510 Вопросов: 28 Ответов: 1182 |
Профиль | Цитата | #1 | Добавлено: 01.10.09 15:41 |
Никак. Изменяется только размер внешней границы. |
Номер ответа: 2 Автор ответа: ![]() ![]() Вопросов: 33 Ответов: 116 |
Профиль | Цитата | #2 | Добавлено: 01.10.09 15:43 |
как же так это? куда смотрит Микрософт!!! мне вот нужна такая возможность, иначе через пень колоду приходится делать!!! |
Номер ответа: 3 Автор ответа: ![]() ![]() Вопросов: 33 Ответов: 116 |
Профиль | Цитата | #3 | Добавлено: 01.10.09 15:43 |
а как вы думаете почему нет такой возможности с чем это связано, то есть с какими трудностями |
Номер ответа: 4 Автор ответа: ![]() ![]() ![]() ![]() Вопросов: 246 Ответов: 3333 |
Web-сайт: Профиль | Цитата | #4 | Добавлено: 01.10.09 21:39 |
1. Array как имя массива использовать нельзя - это ключевое слово. Отсюда большинство косяков.
2. ReDim Preserve - переопределяет размер массива, сохраняя его содаржание. Если до этого он не был определен, вылазит ошибка (что, собственно, у тебя и происходит) Вот это
полный бред. Во-первых, ты пишешь, переопределить размер массива, но не указываешь, какого именно. Во-вторых, ты переопределяешь размер массива, который не еще не определен. Сначала нужно задать базовый размер, а затем уже переопределять его. В-третьих, если ты не будешь читать из файла, то конца ты его не достигнешь никогда, и следовательно, твой код тупо будет висеть до тех пор, пока не захавает всю память в системе.
|
Номер ответа: 5 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ICQ: 300-70-6пятьЪ Вопросов: 62 Ответов: 545 |
Web-сайт: Профиль | Цитата | #5 | Добавлено: 01.10.09 23:33 |
все верно, тока все равно работать не будет![]() |
Номер ответа: 6 Автор ответа: ![]() ![]() Вопросов: 33 Ответов: 116 |
Профиль | Цитата | #6 | Добавлено: 02.10.09 09:44 |
"VBD Unit" спасибо за ответ, обо всем что ты писал я в курсе, пример конечно коряво написал, сорри. Но суть думаю понятна была что мне надо.
Код который ты привел, к сожалению работать не будет, т.к. переопределять можно только размер "крайней размерности" как писал AndreyMp выше. То есть в твоем примере это размерность "j" |
Номер ответа: 7 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Вопросов: 130 Ответов: 6602 |
Профиль | Цитата | #7 | Добавлено: 02.10.09 12:12 |
Dim arr() as string 'Объявляем динамический массив
ReDim arr(0,0) As String 'Определяем начальный размер массива dim i as long, j as long do until rst.EOF 'Пока не дочитаем до конца файл rst i=i+1 do untill rst2.EOF 'Пока не дочитаем до конца файл rst2 j=j+1 'Чтобы дойти до конца файлов rst и rst2, их нужно читать. В этом коде они не читаются. ReDim Preserve arr(i, j) As String arr(i, j) = "bb" loop loop |
Номер ответа: 8 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Вопросов: 130 Ответов: 6602 |
Профиль | Цитата | #8 | Добавлено: 02.10.09 13:02 |
Рука дернулась, продолжу...
Во-первых, работать не будет потому что через Redim Preserve нельзя менять внутренние размеры массива, а в приведенном коде это делается. Во-вторых, делать так на сравнительно больших объемах данных не стоит из-за особенностей работы Redim Preserve и менеджера памяти VB6. Для "увеличения" массива создается новый массив нужного размера, и в него копируются данные из старого. Стоимость операции - O(N), если же ты выполняешь эту операцию при каждом проходе, то суммарно получаешь O(N^2) Вместо этого лучше увеличивать размер массива в 2 раза каждый раз когда он заполняется. После выполнения работы ненужная часть массива отрезается. При таком подходе Redim Preserve нужно будет выполнить всего несколько раз. В-третьих, если ты не будешь читать из файла, то конца ты его не достигнешь никогда, и следовательно, твой код тупо будет висеть до тех пор, пока не захавает всю память в системе.
Ввиду некоторых обстоятельств, захавать всю память в системе не сможет даже теоритически, обломается намного раньше ![]() |
Номер ответа: 9 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 3 Ответов: 4 |
Профиль | Цитата | #9 | Добавлено: 04.10.09 21:03 |
делать так на сравнительно больших объемах данных не стоит из-за особенностей работы Redim Preserve и менеджера памяти VB6
Вопрос, что понимать под словом "больших" У меня прекрасно работает на 2-мерных массивах с 10 000 000 элементов Single. Запускалось сотни раз и никогда не давало сбоев. (Зачем? Чтение чисел из txt-файла, когда неизвестно заранее, сколько их в нем) Вероятно, ограничение для массивов еще бОльшего размера. |
Номер ответа: 10 Автор ответа: ![]() ![]() ![]() ![]() ![]() ICQ: adamis@list.ru Вопросов: 153 Ответов: 3632 |
Профиль | Цитата | #10 | Добавлено: 05.10.09 03:00 |
![]() |
Номер ответа: 11 Автор ответа: ![]() ![]() Вопросов: 33 Ответов: 116 |
Профиль | Цитата | #11 | Добавлено: 05.10.09 09:20 |
Smith а что смешного, если что то знаешь расскажи!!!!!!!!)
Кстати вот все время говорят о особенностях Redim Preserve, но никто не скажет в чем они, как байка ходит по интернету. Расскажите доступно кто нить плиз в чем же они? А если они есть наверно можно учесть их и все будет ок! |
Номер ответа: 12 Автор ответа: ![]() ![]() ![]() ![]() ![]() ICQ: adamis@list.ru Вопросов: 153 Ответов: 3632 |
Профиль | Цитата | #12 | Добавлено: 05.10.09 15:32 |
fifa36 пишет:
Да уж, что-то я знаю точно. А кое о чем пока только догадываюсь Smith а что смешного, если что то знаешь расскажи! ![]() Забавно уже то, что ты не в первый раз спрашиваешь fifa36 пишет:
Об особенности Redim Preserve тебе написал Андрей ещё в первом посте, т.е. ты не только забыл свою предыдущую тему с этим вопросом, но и первый ответ в этой теме о особенностях Redim Preserve ![]() ![]() Весьма прикольно видеть Артёма, всерьез обсуждающего неизлечимые болезни ВБ6 ![]() Но самое приколько, что парни рассуждают, сами точно не знают о чем. Rst и Rst2 – это рекордсеты, я правильно понял? И каким ежом ты думаешь перенести содержимое двух рекордсетов в двумерный массив? Посмотри чему равно свойство RecSet.RecordCount и RecSet.Fields.Count, может хватит пудрить мозги и считать построчно кол-во записей рекордсета ![]() Позволь, скажу то, что думаю, без обид. Научись ясно выражать свои мысли прежде, чем учиться программированию. Я специально прогуглил все твои темы, и именно из них сделал такой вывод. Сейчас просто и ясно опиши всю задачу, что, откуда и куда тебе нужно перенести. |
Номер ответа: 13 Автор ответа: ![]() ![]() ![]() ![]() ![]() Вопросов: 13 Ответов: 348 |
Профиль | Цитата | #13 | Добавлено: 05.10.09 17:15 |
оБ особенностях Redim Preserve, но никто не скажет в чем они...
А попробовать влом? Пара-тройка массивов 1-ный, 2-ный, 3-ый. А потом кааак Redim их, да каааак Preserve. Потом по почкам, в печень, в нюх, в дыню, в репу, в чайник, с ноги под дых ................................ Сколько там прутов об Кота-Баюна сломали? Думаешь Redim Preserve после этого не откроет своих тайн???? |
Номер ответа: 14 Автор ответа: ![]() ![]() Вопросов: 33 Ответов: 116 |
Профиль | Цитата | #14 | Добавлено: 06.10.09 09:32 |
Просто то что нельзя менять обе размерности массива выглядит оч странно, не мог в это поверить, например я раньше программировал в Matlab там все устроено иначе.
Об особенности Redim Preserve тебе написал Андрей ещё в первом посте Процетиируй, не нашел, что такого там написано.
Rst это рекордсеты но сути вопроса это не меняет. И каким ежом ты думаешь перенести содержимое двух рекордсетов в двумерный массив?
Посмотри чему равно свойство RecSet.RecordCount и RecSet.Fields.Count, может хватит пудрить мозги и считать построчно кол-во записей рекордсета ![]() Что ты имеешь ввиду не понятно. Например, в одном рекордсете сделки за период в другом потоки денег по сделкам, таким образом i-й сделке соответствует j потоков денег. Если ты про то что я опустил команды MovNext или открытие второго рекордсета с запросом потоков соответствующих сделке в первом рекордсете, или присваиваивание значения типа "rst!cashflow". То мне кажется что ты умничаешь и акцентировать внимание на этом не стоило. На счет RecSet.RecordCount . Прежде чем можно узнать сколько записей нужно пройти курсором все записи рекордсета, загрузив таким образом их в оперативную память, ты считаешь это оптимальным решением?
Сейчас просто и ясно опиши всю задачу, что, откуда и куда тебе нужно перенести.
Проблемы тут никакой нет, обойдусь и без изменения внешней границы и вопрос мой был не в том как чего куда перенести, а именно в возможости менять все границы многомерного массива. Научись ясно выражать свои мысли прежде, чем учиться программированию. Я занимаюсь прикладным программированием и я умею это делать хорошо на разных языках, поверь, а за то что вопрос некорректен я уже извинился
|
Номер ответа: 15 Автор ответа: ![]() ![]() ![]() ![]() Вопросов: 246 Ответов: 3333 |
Web-сайт: Профиль | Цитата | #15 | Добавлено: 06.10.09 12:42 |
через Redim Preserve нельзя менять внутренние размеры массива,
Нука, Steel Brand, поясни. У меня всегда все получалось с ReDim, и код работал. |
|