Динамический массив

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Чудик
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 639
Зарегистрирован: 06.07.2004 (Вт) 12:18
Откуда: г. Егорьевск

Динамический массив

Сообщение Чудик » 04.09.2004 (Сб) 10:52

Не понимаю как работать с динамическим массивом - не получается!
В стандартном модуле объявляю Public x(), а в модуле формы пишу
For i=1 to 3
y=y+1
x(i)=y
Next i
Данный код - как типичный пример. При первом же обращении в цикле к объявленному массиву выскакивает ошибка Subscript out of range. Достаточно объявить Public x(2) и все чик-чирик. Вывод - что-то делаю не так.
Думаю, что это не сложная загадка для большинства присутствующих. Глубоко надеюсь, что помощь будет. Как-то эмоционально давит нерациональное использование памяти на компьютере. :scratch:
Век живи - век учись!
www.detal-plast.narod.ru

VKar
Новичок
Новичок
 
Сообщения: 31
Зарегистрирован: 15.01.2004 (Чт) 15:58
Откуда: Нижневартовск

Сообщение VKar » 04.09.2004 (Сб) 11:02

Потому что если при объявлении массива не указать кол-во элементов, то при записывании в массив каких-либо данных ты как-бы записываешь в никуда. Для твоего примера, если объявлять массив как Public x() нужно переобъявить массив процедурой ReDim:
Public x()
ReDim x(1 to 3)
For i=1 to 3
y=y+1
x(i)=y
Next i
т.е. в скобках ReDim () указываешь нужный размер массива.
НО нужно учесть, что при вызове процедуры ReDim () весь массив обнуляется!
Чтоб такого не происходило, нужно писать:ReDim preserve ()

Чудик
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 639
Зарегистрирован: 06.07.2004 (Вт) 12:18
Откуда: г. Егорьевск

Динамический массив

Сообщение Чудик » 04.09.2004 (Сб) 11:18

А не получится ли, что при помощи ReDim я из глобального объявления массива перейду к локальному? Или я опять чего-то непонимаю? Или я не правильно рассматриваю функиональное назначение ReDim?
Век живи - век учись!
www.detal-plast.narod.ru

VKar
Новичок
Новичок
 
Сообщения: 31
Зарегистрирован: 15.01.2004 (Чт) 15:58
Откуда: Нижневартовск

Сообщение VKar » 04.09.2004 (Сб) 11:27

Полностью процедура выглядит так:
ReDim [Preserve] varname(subscripts) [As type]
где
[As type]-необязательный параметр, указывающий, в какой тип данных нужно изменить массив, если его не указать то тип данных в массиве не изменится.А насчёт глобальности, не знаю, не пробовал...

Чудик
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 639
Зарегистрирован: 06.07.2004 (Вт) 12:18
Откуда: г. Егорьевск

Динамический массив

Сообщение Чудик » 04.09.2004 (Сб) 11:34

Так а что о видимости массива - он останется глобальным? Это важно!
Век живи - век учись!
www.detal-plast.narod.ru

Vitaly1
Брехман
Брехман
 
Сообщения: 1578
Зарегистрирован: 30.12.2002 (Пн) 16:35
Откуда: Russia, Mosсow

Сообщение Vitaly1 » 04.09.2004 (Сб) 11:35

Для того, что бы сделать динамический массив глобальным, его объявляют в главной области модуля оператором Dim, а переобъявляют его размерность в процедуре, оператором Redim. Можно объявить в главной области модуля динамический массив оператором Public, а переобъявлять его размерность тем же Redim. Public динамический массив доступен для всех модулей проекта.

Чудик
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 639
Зарегистрирован: 06.07.2004 (Вт) 12:18
Откуда: г. Егорьевск

Динамический массив

Сообщение Чудик » 04.09.2004 (Сб) 11:42

Получается, что при переобъявлении ReDim не влияет на видимость массива. Думаю, что понятно. Жаль, что попробовать сразу не могу. Нахожусь на работе. Теперь до дома... Спасибо за инфо! :D
Век живи - век учись!
www.detal-plast.narod.ru

ToT
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 124
Зарегистрирован: 10.06.2002 (Пн) 11:56
Откуда: Russia, Taganrog

Сообщение ToT » 04.09.2004 (Сб) 19:41

ReDim просто меняет размер массива и никаким боком не влияет на его видимость.
Keyboard not found. Press any key.

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 04.09.2004 (Сб) 20:54

Осталось лишь добваить, что Public - это публичная(ой, простите...) область видимости. Для объфвления глобальных переменных используйте Global.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 04.09.2004 (Сб) 21:32

афаик в VB5+ Public и Global - синонимы, различия были где-то в VB3, а то и раньше.
Изображение

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 05.09.2004 (Вс) 20:23

tyomitch писал(а):афаик в VB5+ Public и Global - синонимы, различия были где-то в VB3, а то и раньше.

Т.е. если я напишу Public или Global в модуле - то принципиальной разницы никакой не будет? Или всё же какая-то разница есть?

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 05.09.2004 (Вс) 20:51

Не только принципиальной, имхо вообще никакой не будет.
Изображение

Чудик
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 639
Зарегистрирован: 06.07.2004 (Вт) 12:18
Откуда: г. Егорьевск

Динамический массив

Сообщение Чудик » 06.09.2004 (Пн) 8:31

Подтверждаю, что выше сказанное правда - проверено!!!
Век живи - век учись!
www.detal-plast.narod.ru

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 06.09.2004 (Пн) 9:14

Да... А я то думал, что global это что-то типа extern. Я разочировался... Ну да ладно...
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Чудик
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 639
Зарегистрирован: 06.07.2004 (Вт) 12:18
Откуда: г. Егорьевск

Динамический массив

Сообщение Чудик » 06.09.2004 (Пн) 10:31

А что такое extern, извините не в курсе?
Век живи - век учись!
www.detal-plast.narod.ru

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 06.09.2004 (Пн) 11:06

Гм. да так. в C++ переменные объявленные с модификатором(то бишь словом) extern видны и в других файлах. То бишь объявляешь в каком-то файле переменную, а потом в других файлах объявляешь ее как extern и она становиться как-бы глобальной. Я думал в VB также, ан нет.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 06.09.2004 (Пн) 12:41

Да нет, разницы между Global и Public я тоже не замечал. Просто в модулях я всегда пишу именно Global, а не Public, мне так приятнее :)
Lasciate ogni speranza, voi ch'entrate.

Vitaly1
Брехман
Брехман
 
Сообщения: 1578
Зарегистрирован: 30.12.2002 (Пн) 16:35
Откуда: Russia, Mosсow

Сообщение Vitaly1 » 06.09.2004 (Пн) 16:39

Господа Public и Private - это начало объявления полей модуля, или процедур модуля (функций и подпрограмм) Global оператор перешел от более ранних версий байсик, это "рудимент" для объявления глобальных переменных. Но теперь Global и Public синонимы, ими можно объявлять глобальное поле модуля. но попробуйте вызвать справку ctrl+F1 на слово Global то вам выдадут справку по Public.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 06.09.2004 (Пн) 16:51

Vitaly1, этот рудимент лично мне нравиться. На мой взгляд, читабельность он повышает.
Lasciate ogni speranza, voi ch'entrate.

Scuder
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 334
Зарегистрирован: 17.08.2002 (Сб) 13:18
Откуда: Moscow, Russia

Сообщение Scuder » 15.09.2004 (Ср) 18:03

Прошу прощения за ламерский вопрос.. Но чем отличается Private от Dim? :oops:

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 15.09.2004 (Ср) 18:07

В module scope - ничем.
В процедуре - тем, что Private недопустим, а Dim допустим.
Изображение


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: PetalBot и гости: 3

    TopList