Массивы

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

Массивы

Сообщение Morion » 29.03.2006 (Ср) 18:31

Как создавать массивы, и для чего они нужны?
Компьютер – отличная вещь! Он позволяет решать все проблемы, которые до изобретения компьютера просто не существовали!..

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 29.03.2006 (Ср) 18:34

Однако... вопрос вопросов... такого я еще не видел... Еще более печальным будет вопрос: Как создавать переменные и для чего они нужны?
Весь мир матрица, а мы в нем потоки байтов!

Morion
Новичок
Новичок
Аватара пользователя
 
Сообщения: 44
Зарегистрирован: 11.03.2006 (Сб) 15:51
Откуда: Сургут

Сообщение Morion » 29.03.2006 (Ср) 18:39

!Viper! писал(а):Однако... вопрос вопросов... такого я еще не видел...

Ну это же форум для новичков, так? Тогда чего удивляться? Ну незнаю я ничего про эти массивы. :( Лучше бы чё-нибудь полезное написал...
Компьютер – отличная вещь! Он позволяет решать все проблемы, которые до изобретения компьютера просто не существовали!..

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 29.03.2006 (Ср) 19:07

Я думаю на этом форуме ликбез никто проводить не будет. Купи лучше умную книжку. В любой из них (особенно для начинающих) все будет разжевано и разложено по полочкам.
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.

Roman-vb
Обычный пользователь
Обычный пользователь
 
Сообщения: 91
Зарегистрирован: 24.01.2006 (Вт) 18:31
Откуда: БРЯНСК

Сообщение Roman-vb » 29.03.2006 (Ср) 22:58

Зачем мучать человека? может он переучивается с другого языка :roll: :lol:
Morion
так знай же :
Variables declared with Dim at the script level are available to all procedures within the script. At the procedure level, variables are available only within the procedure.
You can also use the Dim statement with empty parentheses to declare a dynamic array. After declaring a dynamic array, use the ReDim statement within a procedure to define the number of dimensions and elements in the array. If you try to redeclare a dimension for an array variable whose size was explicitly specified in a Dim statement, an error occurs.
Note When you use the Dim statement in a procedure, you generally put the Dim statement at the beginning of the procedure.
The following examples illustrate the use of the Dim statement:
Код: Выделить всё
Dim Names(9)       ' Declare an array with 10 elements.
Dim Names()        ' Declare a dynamic array.
Dim MyVar, MyNum   ' Declare two variables.

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 29.03.2006 (Ср) 23:21

C какого-какого переучивается? С албанского?

mdx
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 169
Зарегистрирован: 06.01.2006 (Пт) 18:13
Откуда: I'm from Russia!

Сообщение mdx » 30.03.2006 (Чт) 6:47

А в албанском что нет даже массивов? Однако неудобно наверно на нем писать...
This posting is provided "AS IS" with no warranties, and confers no rights.

Изображение

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

Сообщение alibek » 30.03.2006 (Чт) 8:43

Массивы создаются оператором Dim, размеры изменяются оператором ReDim. Массив может быть одномерным или многомерным, в каждом измерении указывается нижняя граница (по умолчанию 0 или 1) и верхняя граница. Dim D1(2), D2(2, 1 To 10) As Long, D3(0 To 9, 0 To 9, 0 To 9) As String. Нужны они для того, чтобы к элементам массива можно было обращаться по индексу.
Lasciate ogni speranza, voi ch'entrate.

Tamplier
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 183
Зарегистрирован: 18.11.2005 (Пт) 13:35
Откуда: Москва

Сообщение Tamplier » 30.03.2006 (Чт) 15:46

по умолчанию 0 или 1

По умолчанию 0. Что бы изменить на 1 надо приписать вверху Option Base 1. Можно, конечно, поизвращаться и написать Option Base 0, но зачем засорять псевдоненужными строками свой код?

При Option Base 0 (или когда ничего нет)
Dim arr(5)
и
Dim arr(0 To 5)
одно и тоже

А при Option Base 1
Dim arr(5) [элементы: 1, 2, 3, 4, 5]
Dim arr(0 To 5) [элементы: 0, 1, 2, 3, 4, 5]

Создавать массив можно начиная с любого элемента
Dim arr(3 To 7), arr2(10 To 400)
все зависит от того, что тебе удобно при выполнении программы.

Тип массива задается так же, как задается переменной
Dim N As Long, arr(2) As Long

При объявлении массивов нельзя использовать переменные
(недопустимо)
Dim N As Long
N=5
Dim arr(N)

Для того чтобы создать массив с неизвестным заранее числом элементов создавай динамический массив и изменяй его размеры с помощью оператора ReDim
Dim arr() As Long, arr2() As Long, arr3() As Long
Dim n As Long
n=5
ReDim arr(n), arr2(2 To n), arr3(n To 50)

Вообще массывй созданы для упрощения обращения к переменным. Допустим, чтобы в цкле не писать такую чушь
Код: Выделить всё
For i=1 To 3
If i=1 then
Var1=i
ElseIf i=2 Then
Var2=i
Else
Var3=i
End If
Next

Лучше сделать так
Код: Выделить всё
For i=1 To 3
Var(i)=i
next

В данном случае Var(i) - это тот элемент массива, какой у нас аейчас i

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

Сообщение alibek » 30.03.2006 (Чт) 15:51

Tamplier писал(а):Допустим, чтобы в цкле не писать такую чушь

Допустим, такую чушь писать действительно не надо. В данном случае вполне можно написать и Choose(i, Var1, Var2, Var3).
Lasciate ogni speranza, voi ch'entrate.

Tamplier
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 183
Зарегистрирован: 18.11.2005 (Пт) 13:35
Откуда: Москва

Сообщение Tamplier » 31.03.2006 (Пт) 11:36

Choose

Необъятны просторы языка VB...
Согласен, я там немного некорректно написал.

AndreyG_80
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 169
Зарегистрирован: 10.03.2006 (Пт) 13:27

Сообщение AndreyG_80 » 31.03.2006 (Пт) 13:43

Раз уж тема про массивы, тогда такой вопрос:

Такая ситуация:
считываю строки с текстового файла с разделителями
Например: слово1;слово2;слово3 и т.д.
в массиве эта строка а(1)=слово1, а(2)=слово2 и т.д.
кол-во таких элементов неизвесно. Можно конечно узнать кол-во разделителей в считаной строке и соответственно будет ясно сколько элементов в массиве.
Но, можно как-то узнать кол-во элементов массива имея массив с (n) элементами?

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 31.03.2006 (Пт) 13:48

MsgBox LBound(arr)
MsgBox UBound(arr)

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 31.03.2006 (Пт) 13:49

lbound(arr), ubound(arr)
нижняя и верхняя границы массива arr

CORBA
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 179
Зарегистрирован: 22.11.2003 (Сб) 13:41
Откуда: Ukraine-Crimea-Feodosia

Сообщение CORBA » 31.03.2006 (Пт) 15:41

Konst_One писал(а):lbound(arr), ubound(arr)
нижняя и верхняя границы массива arr


а кол-во эл-тов = ubound(arr) - lbound(arr) :)
У каждой сложной задачи есть множество простых для понимания, но неправильных решений.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 31.03.2006 (Пт) 15:45

CORBA
Ты опять написал фигню. Вот из-за таких моментов и появляются buffer overrun'ы.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 31.03.2006 (Пт) 15:50

он наверное перестарался :lol: , так как подумал, что я повторил топик Amed-а, но я не специально, видно у Amed-а секретарша быстрее на клавиатуре работает :wink:

а если серьезно, то конечно такое заявление в общем случае НЕ верно:
а кол-во эл-тов = ubound(arr) - lbound(arr)

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

Сообщение alibek » 31.03.2006 (Пт) 15:52

Не в общем случае, оно всегда неверно. +1 должно быть.
Lasciate ogni speranza, voi ch'entrate.

CORBA
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 179
Зарегистрирован: 22.11.2003 (Сб) 13:41
Откуда: Ukraine-Crimea-Feodosia

Сообщение CORBA » 31.03.2006 (Пт) 15:54

alibek писал(а):Не в общем случае, оно всегда неверно. +1 должно быть.
Даже при OPTION BASE 1 ?
У каждой сложной задачи есть множество простых для понимания, но неправильных решений.

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

Сообщение alibek » 31.03.2006 (Пт) 15:55

Всегда.
Lasciate ogni speranza, voi ch'entrate.

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 31.03.2006 (Пт) 15:55

Konst_One, оно же всегда неверно, как alibek говорит :)

Даже нулевой элемент массива - элемент. Вот если есть массив контролов, тогда да. Запросто может быть 'пробел' в середине.

CORBA
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 179
Зарегистрирован: 22.11.2003 (Сб) 13:41
Откуда: Ukraine-Crimea-Feodosia

Сообщение CORBA » 31.03.2006 (Пт) 15:55

А ну да, извеняюсь, был не прав.
У каждой сложной задачи есть множество простых для понимания, но неправильных решений.

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

Сообщение alibek » 31.03.2006 (Пт) 15:56

hCORe писал(а):А сколько, по-твоему, дней прошло с 1 по 6 число? 5 или 6? Твой код скажет "5", что неверно.

Неудачный пример :)
Дни - не дискретная величина.
Lasciate ogni speranza, voi ch'entrate.

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 31.03.2006 (Пт) 15:57

hCORe, а вот тут надо уточнение. Сколько дней прошло, или сколько полных дней прошло.

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

Сообщение alibek » 31.03.2006 (Пт) 16:00

На металлической линейке есть разметка, в сантиметрах и миллиметрах. Миллиметровые риски на ней подписаны. Сколько миллиметров между риской 0 и риской 5?
То же самое и с днями. Даже условие "полных дней" недостаточно.
Lasciate ogni speranza, voi ch'entrate.

Morion
Новичок
Новичок
Аватара пользователя
 
Сообщения: 44
Зарегистрирован: 11.03.2006 (Сб) 15:51
Откуда: Сургут

Сообщение Morion » 31.03.2006 (Пт) 16:36

Спасибо за разъяснения! :!:
Компьютер – отличная вещь! Он позволяет решать все проблемы, которые до изобретения компьютера просто не существовали!..

Roman-vb
Обычный пользователь
Обычный пользователь
 
Сообщения: 91
Зарегистрирован: 24.01.2006 (Вт) 18:31
Откуда: БРЯНСК

Сообщение Roman-vb » 31.03.2006 (Пт) 21:51

Вообще не стоит использовать OPTION BASE. Это из прошлого (а жалко :cry: ). Также не пиши
Код: Выделить всё
Dim a(1 to n)
- тоже устарело. Индексация теперь начинается с нуля:
Код: Выделить всё
Dim A(n) as type

Также массивы можно объявлять зарезервир. словами Private, Public, Global. Последнее, к стати, тоже устарело.
При использовании REDIM можно исп. кл. слово Preserve для сохранения значений, хранящихся в массиве.

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 31.03.2006 (Пт) 21:59

Roman-vb, а
Код: Выделить всё
Dim a(b to n)
отнюдь не устарело. Индексация начинается с того места, с которого надо.

Roman-vb
Обычный пользователь
Обычный пользователь
 
Сообщения: 91
Зарегистрирован: 24.01.2006 (Вт) 18:31
Откуда: БРЯНСК

Сообщение Roman-vb » 31.03.2006 (Пт) 22:09

Amed
Если в VB6, то да, но а если в VB7, VB8? - Такого там уже нет. Значит устарело. Пора отвыать не только писать на VB6 "Dim a(b to n)", но и вообще писать на VB6 Хотя это и не так просто.

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 31.03.2006 (Пт) 22:45

Каждый для себя решает сам, на чем писать.

А вопрос задан в форуме VB6, поэтому и отвечать надо по VB6.

След.

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

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

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

    TopList