Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Передача параметров по ссылке / 13 сообщений из 13, страница 1 из 1
27.01.2009, 11:45
    #35779491
Melissa_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров по ссылке
Помогите, пожалуйста.

Есть подпрограмма. Как я понимаю параметры передаются по ссылке.

Private Sub xxx(a As Integer, b As Integer)
...
a = 10
b = 20

End Sub

В вызывающей программе дело обстоит так:

Dim a, b As Integer

a = 1
b = 2

Call xxx((a),(b))

После вызова подпрограммы значения переменных не изменилось.
Как быть?
...
Рейтинг: 0 / 0
27.01.2009, 12:01
    #35779536
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров по ссылке
Код в студию целиком.
...
Рейтинг: 0 / 0
27.01.2009, 12:06
    #35779551
Melissa_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров по ссылке
Код чего? Вызывающая программа огромна. Код не имеет отношения к делу.
Суть вопроса: как изменить в подпрограмме переменные и отдать их в вызывающую программу.
...
Рейтинг: 0 / 0
27.01.2009, 12:21
    #35779592
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров по ссылке
Ну тогда хотя бы вызов подпрограммы, объявление подпрограммы и код, меняющий значения переменных.
...
Рейтинг: 0 / 0
27.01.2009, 12:34
    #35779649
FAndrew
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров по ссылке
Параметры нужно объявить с ByRef.

А вообще хороший тон всегда явно указывать как передается параметр ByVal/ByRef.
...
Рейтинг: 0 / 0
27.01.2009, 12:41
    #35779682
Бенедикт
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров по ссылке
Melissa_,
всё верно. Ставя скобки вокруг параметра при вызове процедуры, вы говорите: "вычисли выражение, результат помести во временную переменную, временную переменную передай по ссылке в процедуру, выполни процедуру, уничтожь временную переменную". Как быть - решайте сами.

P.S. Dim a, b As Integer означает Dim a As Variant, b As Integer
...
Рейтинг: 0 / 0
27.01.2009, 12:45
    #35779699
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров по ссылке
FAndrewПараметры нужно объявить с ByRef.По умолчанию они и есть ByRef.
...
Рейтинг: 0 / 0
27.01.2009, 13:02
    #35779761
Melissa_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров по ссылке
Бенедикт,
спасибо! Дело действительно в описании. Если я убирала скобки компилятор ругался.
Получается нельзя описывать переменные через запятую? Это только для Integer или для всех типов?
...
Рейтинг: 0 / 0
27.01.2009, 13:04
    #35779774
Melissa_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров по ссылке
Чушь написала. Все поняла.
...
Рейтинг: 0 / 0
27.01.2009, 13:07
    #35779788
Melissa_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров по ссылке
А еще не подскажете как задать значения массива в его описании.
...
Рейтинг: 0 / 0
27.01.2009, 15:07
    #35780228
Бенедикт
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров по ссылке
Melissa_,
значения элементов в описании массива задать нельзя - нет такого синтаксиса. В классическом BASIC-е есть пара операторов DATA/READ:
Код: plaintext
1.
2.
 10  DATA  1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 
 20  FOR I= 1  TO  9 
 30  READ A(I):NEXT I
В VB этих операторов нет, но они легко эмулируются:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
'Модуль
Option Explicit

Private m_Data()
Private m_DataIndex As Long

Public Sub DATA(ParamArray Params())
 Dim I As Long
 Dim lb As Long, ub As Long
 Erase m_Data
 lb = LBound(Params)
 ub = UBound(Params)
 m_DataIndex = lb
 ReDim m_Data(lb To ub)
 For I = lb To ub
    m_Data(I) = Params(I)
 Next I
End Sub

Public Sub READ(Param)
 Param = m_Data(m_DataIndex)
 m_DataIndex = m_DataIndex +  1 
End Sub
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
'Проверка
Public Sub Test()
 Dim I As Long
 Dim A( 1  To  9 ) As Integer
 
 DATA  1 ,  2 ,  3 ,  4 ,  5 ,  6 ,  7 ,  8 ,  9 
 For I =  1  To  9 
 READ A(I): Next I
 
 For I =  1  To  9 : Debug.Print A(I);: Next I: Debug.Print
End Sub
Конечно, это вряд ли лучший способ, но при отстутствии языковых средств всё обычно сводится к написанию некой процедуры инициализации, которой надо передать массив и значения его элементов.
...
Рейтинг: 0 / 0
27.01.2009, 16:43
    #35780576
Melissa_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров по ссылке
Бенедикт,
спасибо! После ваших ответов (как в присутствии мудреца) вопросы затихают.
Скажите, вы даете столь исчерпывающие ответы только по BASIC-у или с вами можно пообщаться на других языках? И возможно ли в будущем обратиться с вопросом к вам непосредственно?
...
Рейтинг: 0 / 0
28.01.2009, 18:27
    #35783802
Бенедикт
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров по ссылке
Пожалуйста. Я пока не похож на седовласого мудреца ни внутренне, ни внешне :) Надеюсь, Вы понимаете, что форум тем и силён, что представляет разные точки зрения, что кто-то силён в одной области, а кто-то в другой, у кого-то сейчас нет свободного времени и/или желания на ответ, а у кого-то есть, и что большинство участников искренне старается помочь друг другу. Но если возникают вопросы, обсуждение которых, как Вам представляется, не будет иметь ценности для настоящих и будущих участников и читателей форума, можете обращаться ко мне напрямую, адрес в профиле. "На других языках" - это на каких? Например, немецкий и Haskell для меня - тёмный лес .
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Передача параметров по ссылке / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]