Как передать в процедуру значения массива?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Как передать в процедуру значения массива?

Сообщение sergey-911 » 18.08.2005 (Чт) 6:00

Доброго времени суток, уважаемые. Прошу прощения за ламерский вопрос. Нужно передать в процедуру "FindRow" значения массива. В приведенном ниже скрипте - выдается ругательное сообщение об ошибке. Как правильно передать значение массива в процедуру? Спасибо всем.
Код: Выделить всё
Dim ID() As Long
ReDim Preserve ID(0)
ID(0) = 1

ReDim Preserve ID(1)
ID(0) = 5

...
...
ReDim Preserve ID(n)
ID(n) = 3

Private Sub FindRow(ID() As Long)
...
...
End Sub
С уважением, Сергей.

SHURUP
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 440
Зарегистрирован: 15.09.2004 (Ср) 14:24
Откуда: Ирпень, Украина

Сообщение SHURUP » 18.08.2005 (Чт) 6:10

А вот это не смотрел?
http://bbs.vbstreets.ru/viewtopic.php?t=562
Нам чужого не надо, но своё мы возьмем, чьё бы оно ни было...

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

Сообщение GSerg » 18.08.2005 (Чт) 6:39

Ну и где именно выдаётся ругательное сообщение об ошибке?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

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

Сообщение Viper » 18.08.2005 (Чт) 10:56

1. что за сообщение об ошибке?
2. а как собственно вызывается FindRow?
Весь мир матрица, а мы в нем потоки байтов!

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 18.08.2005 (Чт) 21:22

Спасибо за помощь всем. Но вопрос остается открытым.
SHURUP, решения проблемы, пойдя по указанной тобою ссылки, я не нашел. :(
Дома VB сейчас нет (hdd маздай), а на работе - нет инета. Поэтому по памяти... :(
Сообщение об ошибки выдается, при запуске процедуры. Запускаю - не правильно. Ошибка типа данных передаваемого в процедуру аргумента. Точно сказать смогу только завтра вечером, после работы.
Передать пытался так:
FindRow (ID())
FindRow (ID)
FindRow ({1, 3, 456, 362})

Но это от отчаяния. Как правильно - не знаю.
Читал MSDN. Описывался способ копирования массива. Что-то наподобие "CopyToArray". Но не получается. Временно вышел из ситуации таким образом:
Объявил массив через Public, работаю с реальными значениями массива. Но хочу разобраться, уже не первый раз встречается необхоимость в этом.
Подскажите плиз. :D
С уважением, Сергей.

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

Сообщение GSerg » 19.08.2005 (Пт) 2:43

Неправильно и первое, и второе и третье, и "но в процедуре ты должен так же обьявить его как массив" тоже неправильно.

Правильно FindRow ID.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Vi
Постоялец
Постоялец
 
Сообщения: 739
Зарегистрирован: 25.01.2002 (Пт) 11:03
Откуда: Россия, Ижевск

Сообщение Vi » 19.08.2005 (Пт) 7:28

GSerg писал(а):Правильно - FindRow ID.

Все правильные способы для Sub FindRow(val() As Long)
Код: Выделить всё
Dim ID() As Long
...
FindRow ID
FindRow ID()
Call FindRow(ID)
Call FindRow(ID())

Взятие переменной в скобки означает вычисление выражения, которое для массива не может быть выполнено. Т.е. такие варианты не верны:
Код: Выделить всё
FindRow (ID)
FindRow (ID())
Call FindRow((ID))
Call FindRow((ID()))
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! (с) КВН

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

Сообщение alibek » 19.08.2005 (Пт) 10:22

И как ты собираешься узнать, правильно ли выполнилась процедура?
Lasciate ogni speranza, voi ch'entrate.

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 19.08.2005 (Пт) 17:53

Всем доброго времени суток. Огромное спасибо за помощь. :)
Разобрался.
Код: Выделить всё
Call FindRow (ID)
Этот вариант - работает, равно, как будет работать
Код: Выделить всё
Call FindRow ID

А процедуру - я заменил на функцию, которая возвращает массив.

Код: Выделить всё
Private FindRow(ID() As Long) As Variant
...
...
IDznach = ID  'Присваиваем функции значение массива
End Function


Call ID = IDznach(ID)



Прикол в том, что если функцию объявить явным способом
Код: Выделить всё
Private FindRow(ID() As Long) As Long
, а не
Код: Выделить всё
Private FindRow(ID() As Long) As Variant
, то выдается, соответственно, ошибка. Никто не скажет, как функцию объявить явным способом? Т.е. указать, что функция вернет массив, типа "Long".
С уважением, Сергей.

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

Сообщение Viper » 19.08.2005 (Пт) 17:56

а такой вариант
Код: Выделить всё
Private Function FindRow(ID() As Long) As Long()

не пробовал?

вроде это в VB работает (в VB.NET точно работает)
Весь мир матрица, а мы в нем потоки байтов!

Александр Дмитриев
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 296
Зарегистрирован: 05.01.2005 (Ср) 3:39
Откуда: Санкт-Петербург    Куда: /dev/null

Сообщение Александр Дмитриев » 19.08.2005 (Пт) 18:21

Вообще, я подобные вещи делаю не так: я объявляю пользовательский тип, в который пихаю переменный массив и процедурам передаю уже переменную этого пользовательского типа; так удобнее и глюков у меня с такой темой никогда не было:
Код: Выделить всё
Private Type MyGreatType
ID() As Long
End Type

Dim IDs As MyGreatType
ReDim Preserve MyGreatType.ID(0)
MyGreatType.ID(0) = 1

ReDim Preserve MyGreatType.ID(1)
MyGreatType.ID(1) = 5
...
...
ReDim Preserve MyGreatType.ID(n)
MyGreatType.ID(n) = 35

Private Sub FindRow(IDs As MyGreatType)
...
...
End Sub

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 19.08.2005 (Пт) 21:23

!Viper!
Спасибо, попробую. :) Но проверить смогу не раньше понедельника. Дома с кампутером беда. Два харда наелись. Ща места под ВБ нет.:(
Александр Дмитриев
А зачем мне объявлять пользовательский тип. SHURUP мне прислал интересную ссылку, по этому поводу, в этом же топике, выше. http://bbs.vbstreets.ru/viewtopic.php?t=562 Посмотри, иногда бывают проблемы. Да и зачем в программе лишний код, который будет - лишь занимать ресурсы машины? Пользовательский тип используется, на мой взгляд, для других целей. :roll:
С уважением, Сергей.

Александр Дмитриев
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 296
Зарегистрирован: 05.01.2005 (Ср) 3:39
Откуда: Санкт-Петербург    Куда: /dev/null

Сообщение Александр Дмитриев » 20.08.2005 (Сб) 3:38

sergey-911 Про ссылку http://bbs.vbstreets.ru/viewtopic.php?t=562 - у меня не переменный массив пользовательских переменных, а пользовательская переменная с переменным массивом: в натуре говорю всегда так пашет и удобно к тому же.

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 20.08.2005 (Сб) 18:09

2 Александр Дмитриев, да ладно, если тебе так удобней...
Меня интересовало вот что:

Код: Выделить всё
Private Function FindRow(ID() As Long) As Long()

(объявление функции)
и
Код: Выделить всё
ID = FindRow(ID)

(вызов)
С уважением, Сергей.


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

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

Сейчас этот форум просматривают: Google-бот и гости: 133

    TopList