Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - VBA

Страница: 1 | 2 | 3 |

 

  Вопрос: Двумерный динамический массив Добавлено: 01.10.09 15:21  

Автор вопроса:  fifa36
Как организовать например подобное заполнение массива. В данном случае конечно выдает ошибку "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
Автор ответа:
 AndreyMp



ICQ: 237822510 

Вопросов: 28
Ответов: 1182
 Профиль | | #1 Добавлено: 01.10.09 15:41
Никак. Изменяется только размер внешней границы.

Ответить

Номер ответа: 2
Автор ответа:
 fifa36



Вопросов: 33
Ответов: 116
 Профиль | | #2 Добавлено: 01.10.09 15:43
как же так это? куда смотрит Микрософт!!! мне вот нужна такая возможность, иначе через пень колоду приходится делать!!!

Ответить

Номер ответа: 3
Автор ответа:
 fifa36



Вопросов: 33
Ответов: 116
 Профиль | | #3 Добавлено: 01.10.09 15:43
а как вы думаете почему нет такой возможности с чем это связано, то есть с какими трудностями

Ответить

Номер ответа: 4
Автор ответа:
 VβÐUηìt



Вопросов: 246
Ответов: 3333
 Web-сайт: смекаешь.рф
 Профиль | | #4
Добавлено: 01.10.09 21:39
1. Array как имя массива использовать нельзя - это ключевое слово. Отсюда большинство косяков.
2. ReDim Preserve - переопределяет размер массива, сохраняя его содаржание. Если до этого он не был определен, вылазит ошибка (что, собственно, у тебя и происходит)

Вот это
  1.  
  2.       redim preserve(i,j)="bb"


полный бред. Во-первых, ты пишешь, переопределить размер массива, но не указываешь, какого именно. Во-вторых, ты переопределяешь размер массива, который не еще не определен. Сначала нужно задать базовый размер, а затем уже переопределять его. В-третьих, если ты не будешь читать из файла, то конца ты его не достигнешь никогда, и следовательно, твой код тупо будет висеть до тех пор, пока не захавает всю память в системе.
  1.  
  2. Dim arr() as string  'Объявляем динамический массив
  3. ReDim arr(0,0) As String 'Определяем начальный размер массива
  4. dim i as long, j as long
  5.  
  6. do until rst.EOF  'Пока не дочитаем до конца файл rst
  7.    i=i+1
  8.    do untill rst2.EOF 'Пока не дочитаем до конца файл rst2
  9.       j=j+1
  10.       'Чтобы дойти до конца файлов rst и rst2, их нужно читать. В этом коде они не читаются.
  11.       ReDim Preserve arr(i, j) As String
  12.       arr(i, j) = "bb"
  13.    loop
  14. loop

Ответить

Номер ответа: 5
Автор ответа:
 Skywalker



ICQ: 300-70-6пятьЪ 

Вопросов: 62
Ответов: 545
 Web-сайт: iSkywalker.ru
 Профиль | | #5
Добавлено: 01.10.09 23:33
все верно, тока все равно работать не будет=)

Ответить

Номер ответа: 6
Автор ответа:
 fifa36



Вопросов: 33
Ответов: 116
 Профиль | | #6 Добавлено: 02.10.09 09:44
"VBD Unit" спасибо за ответ, обо всем что ты писал я в курсе, пример конечно коряво написал, сорри. Но суть думаю понятна была что мне надо.
Код который ты привел, к сожалению работать не будет, т.к. переопределять можно только размер "крайней размерности" как писал AndreyMp выше. То есть в твоем примере это размерность "j"

Ответить

Номер ответа: 7
Автор ответа:
 Artyom



Разработчик

Вопросов: 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
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #8 Добавлено: 02.10.09 13:02
Рука дернулась, продолжу...

  1. Dim arr() as string 'Объявляем динамический массив
  2. ReDim arr(0,0) As String 'Определяем начальный размер массива
  3. dim i as long, j as long
  4.    
  5. do until rst.EOF 'Пока не дочитаем до конца файл rst
  6.    i=i+1
  7.    do untill rst2.EOF 'Пока не дочитаем до конца файл rst2
  8.       j=j+1
  9.       'Чтобы дойти до конца файлов rst и rst2, их нужно читать. В этом коде они не читаются.
  10.       ReDim Preserve arr(i, j) As String
  11.       arr(i, j) = "bb"
  12.    loop
  13. loop

Во-первых, работать не будет потому что через Redim Preserve нельзя менять внутренние размеры массива, а в приведенном коде это делается.
Во-вторых, делать так на сравнительно больших объемах данных не стоит из-за особенностей работы Redim Preserve и менеджера памяти VB6.
Для "увеличения" массива создается новый массив нужного размера, и в него копируются данные из старого. Стоимость операции - O(N), если же ты выполняешь эту операцию при каждом проходе, то суммарно получаешь O(N^2)

Вместо этого лучше увеличивать размер массива в 2 раза каждый раз когда он заполняется. После выполнения работы ненужная часть массива отрезается.
При таком подходе Redim Preserve нужно будет выполнить всего несколько раз.

В-третьих, если ты не будешь читать из файла, то конца ты его не достигнешь никогда, и следовательно, твой код тупо будет висеть до тех пор, пока не захавает всю память в системе.

Ввиду некоторых обстоятельств, захавать всю память в системе не сможет даже теоритически, обломается намного раньше :)

Ответить

Номер ответа: 9
Автор ответа:
 litvin44



Вопросов: 3
Ответов: 4
 Профиль | | #9 Добавлено: 04.10.09 21:03
делать так на сравнительно больших объемах данных не стоит из-за особенностей работы Redim Preserve и менеджера памяти VB6

Вопрос, что понимать под словом "больших"
У меня прекрасно работает на 2-мерных массивах с 10 000 000 элементов Single. Запускалось сотни раз и никогда не давало сбоев.
(Зачем? Чтение чисел из txt-файла, когда неизвестно заранее, сколько их в нем)
Вероятно, ограничение для массивов еще бОльшего размера.

Ответить

Номер ответа: 10
Автор ответа:
 Smith



ICQ: adamis@list.ru 

Вопросов: 153
Ответов: 3632
 Профиль | | #10 Добавлено: 05.10.09 03:00
:-D, смеялся долго, я в осадке ... продолжайте, прикольная тема

Ответить

Номер ответа: 11
Автор ответа:
 fifa36



Вопросов: 33
Ответов: 116
 Профиль | | #11 Добавлено: 05.10.09 09:20
 Smith а что смешного, если что то знаешь расскажи!!!!!!!!)
Кстати вот все время говорят о особенностях Redim Preserve, но никто не скажет в чем они, как байка ходит по интернету. Расскажите доступно кто нить плиз в чем же они? А если они есть наверно можно учесть их и все будет ок!

Ответить

Номер ответа: 12
Автор ответа:
 Smith



ICQ: adamis@list.ru 

Вопросов: 153
Ответов: 3632
 Профиль | | #12 Добавлено: 05.10.09 15:32
fifa36 пишет:
Smith а что смешного, если что то знаешь расскажи!
Да уж, что-то я знаю точно. А кое о чем пока только догадываюсь :)
Забавно уже то, что ты не в первый раз спрашиваешь
fifa36 пишет:
о особенностях Redim Preserve
Об особенности Redim Preserve тебе написал Андрей ещё в первом посте, т.е. ты не только забыл свою предыдущую тему с этим вопросом, но и первый ответ в этой теме :), давай обсудим этот же вопрос ещё раз например на второй странице :-D.
Весьма прикольно видеть Артёма, всерьез обсуждающего неизлечимые болезни ВБ6 :).
Но самое приколько, что парни рассуждают, сами точно не знают о чем.
Rst и Rst2 – это рекордсеты, я правильно понял?
И каким ежом ты думаешь перенести содержимое двух рекордсетов в двумерный массив?
Посмотри чему равно свойство RecSet.RecordCount и RecSet.Fields.Count, может хватит пудрить мозги и считать построчно кол-во записей рекордсета :)?

Позволь, скажу то, что думаю, без обид.
Научись ясно выражать свои мысли прежде, чем учиться программированию.
Я специально прогуглил все твои темы, и именно из них сделал такой вывод.
Сейчас просто и ясно опиши всю задачу, что, откуда и куда тебе нужно перенести.

Ответить

Номер ответа: 13
Автор ответа:
 GDK



Вопросов: 13
Ответов: 348
 Профиль | | #13 Добавлено: 05.10.09 17:15
оБ особенностях Redim Preserve, но никто не скажет в чем они...


А попробовать влом? Пара-тройка массивов 1-ный, 2-ный, 3-ый. А потом кааак Redim их, да каааак Preserve. Потом по почкам, в печень, в нюх, в дыню, в репу, в чайник, с ноги под дых ................................ Сколько там прутов об Кота-Баюна сломали?

Думаешь Redim Preserve после этого не откроет своих тайн????

Ответить

Номер ответа: 14
Автор ответа:
 fifa36



Вопросов: 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
Автор ответа:
 VβÐUηìt



Вопросов: 246
Ответов: 3333
 Web-сайт: смекаешь.рф
 Профиль | | #15
Добавлено: 06.10.09 12:42
через Redim Preserve нельзя менять внутренние размеры массива,

Нука, Steel Brand, поясни. У меня всегда все получалось с ReDim, и код работал.

Ответить

Страница: 1 | 2 | 3 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам