1. Array как имя массива использовать нельзя - это ключевое слово. Отсюда большинство косяков.
2. ReDim Preserve - переопределяет размер массива, сохраняя его содаржание. Если до этого он не был определен, вылазит ошибка (что, собственно, у тебя и происходит)
Вот это
redim preserve(i,j)="bb"
полный бред. Во-первых, ты пишешь, переопределить размер массива, но не указываешь, какого именно. Во-вторых, ты переопределяешь размер массива, который не еще не определен. Сначала нужно задать базовый размер, а затем уже переопределять его. В-третьих, если ты не будешь читать из файла, то конца ты его не достигнешь никогда, и следовательно, твой код тупо будет висеть до тех пор, пока не захавает всю память в системе.
Dim arr() asstring'Объявляем динамический массив
ReDim arr(0,0) AsString'Определяем начальный размер массива
dim i aslong, j aslong
do until rst.EOF 'Пока не дочитаем до конца файл rst
i=i+1
do untill rst2.EOF 'Пока не дочитаем до конца файл rst2
j=j+1
'Чтобы дойти до конца файлов rst и rst2, их нужно читать. В этом коде они не читаются.
"VBD Unit" спасибо за ответ, обо всем что ты писал я в курсе, пример конечно коряво написал, сорри. Но суть думаю понятна была что мне надо.
Код который ты привел, к сожалению работать не будет, т.к. переопределять можно только размер "крайней размерности" как писал AndreyMp выше. То есть в твоем примере это размерность "j"
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
ReDim arr(0,0) AsString'Определяем начальный размер массива
dim i aslong, j aslong
do until rst.EOF 'Пока не дочитаем до конца файл rst
i=i+1
do untill rst2.EOF 'Пока не дочитаем до конца файл rst2
j=j+1
'Чтобы дойти до конца файлов rst и rst2, их нужно читать. В этом коде они не читаются.
ReDimPreserve arr(i, j) AsString
arr(i, j) = "bb"
loop
loop
Во-первых, работать не будет потому что через Redim Preserve нельзя менять внутренние размеры массива, а в приведенном коде это делается.
Во-вторых, делать так на сравнительно больших объемах данных не стоит из-за особенностей работы Redim Preserve и менеджера памяти VB6.
Для "увеличения" массива создается новый массив нужного размера, и в него копируются данные из старого. Стоимость операции - O(N), если же ты выполняешь эту операцию при каждом проходе, то суммарно получаешь O(N^2)
Вместо этого лучше увеличивать размер массива в 2 раза каждый раз когда он заполняется. После выполнения работы ненужная часть массива отрезается.
При таком подходе Redim Preserve нужно будет выполнить всего несколько раз.
В-третьих, если ты не будешь читать из файла, то конца ты его не достигнешь никогда, и следовательно, твой код тупо будет висеть до тех пор, пока не захавает всю память в системе.
Ввиду некоторых обстоятельств, захавать всю память в системе не сможет даже теоритически, обломается намного раньше
делать так на сравнительно больших объемах данных не стоит из-за особенностей работы Redim Preserve и менеджера памяти VB6
Вопрос, что понимать под словом "больших"
У меня прекрасно работает на 2-мерных массивах с 10 000 000 элементов Single. Запускалось сотни раз и никогда не давало сбоев.
(Зачем? Чтение чисел из txt-файла, когда неизвестно заранее, сколько их в нем)
Вероятно, ограничение для массивов еще бОльшего размера.
Smith а что смешного, если что то знаешь расскажи!!!!!!!!)
Кстати вот все время говорят о особенностях Redim Preserve, но никто не скажет в чем они, как байка ходит по интернету. Расскажите доступно кто нить плиз в чем же они? А если они есть наверно можно учесть их и все будет ок!
fifa36 пишет:
Smith а что смешного, если что то знаешь расскажи!
Да уж, что-то я знаю точно. А кое о чем пока только догадываюсь
Забавно уже то, что ты не в первый раз спрашиваешь
fifa36 пишет:
о особенностях Redim Preserve
Об особенности Redim Preserve тебе написал Андрей ещё в первом посте, т.е. ты не только забыл свою предыдущую тему с этим вопросом, но и первый ответ в этой теме , давай обсудим этот же вопрос ещё раз например на второй странице .
Весьма прикольно видеть Артёма, всерьез обсуждающего неизлечимые болезни ВБ6 .
Но самое приколько, что парни рассуждают, сами точно не знают о чем.
Rst и Rst2 – это рекордсеты, я правильно понял?
И каким ежом ты думаешь перенести содержимое двух рекордсетов в двумерный массив?
Посмотри чему равно свойство RecSet.RecordCount и RecSet.Fields.Count, может хватит пудрить мозги и считать построчно кол-во записей рекордсета ?
Позволь, скажу то, что думаю, без обид.
Научись ясно выражать свои мысли прежде, чем учиться программированию.
Я специально прогуглил все твои темы, и именно из них сделал такой вывод.
Сейчас просто и ясно опиши всю задачу, что, откуда и куда тебе нужно перенести.
оБ особенностях Redim Preserve, но никто не скажет в чем они...
А попробовать влом? Пара-тройка массивов 1-ный, 2-ный, 3-ый. А потом кааак Redim их, да каааак Preserve. Потом по почкам, в печень, в нюх, в дыню, в репу, в чайник, с ноги под дых ................................ Сколько там прутов об Кота-Баюна сломали?
Думаешь Redim Preserve после этого не откроет своих тайн????
Просто то что нельзя менять обе размерности массива выглядит оч странно, не мог в это поверить, например я раньше программировал в Matlab там все устроено иначе.
Об особенности Redim Preserve тебе написал Андрей ещё в первом посте
Процетиируй, не нашел, что такого там написано.
Rst это рекордсеты но сути вопроса это не меняет.
И каким ежом ты думаешь перенести содержимое двух рекордсетов в двумерный массив?
Посмотри чему равно свойство RecSet.RecordCount и RecSet.Fields.Count, может хватит пудрить мозги и считать построчно кол-во записей рекордсета ?
Что ты имеешь ввиду не понятно.
Например, в одном рекордсете сделки за период в другом потоки денег по сделкам, таким образом i-й сделке соответствует j потоков денег.
Если ты про то что я опустил команды MovNext или открытие второго рекордсета с запросом потоков соответствующих сделке в первом рекордсете, или присваиваивание значения типа "rst!cashflow". То мне кажется что ты умничаешь и акцентировать внимание на этом не стоило.
На счет
RecSet.RecordCount
. Прежде чем можно узнать сколько записей нужно пройти курсором все записи рекордсета, загрузив таким образом их в оперативную память, ты считаешь это оптимальным решением?
Сейчас просто и ясно опиши всю задачу, что, откуда и куда тебе нужно перенести.
Проблемы тут никакой нет, обойдусь и без изменения внешней границы и вопрос мой был не в том как чего куда перенести, а именно в возможости менять все границы многомерного массива.
Научись ясно выражать свои мысли прежде, чем учиться программированию.
Я занимаюсь прикладным программированием и я умею это делать хорошо на разных языках, поверь, а за то что вопрос некорректен я уже извинился