Есть ли в VB ссылочные переменные?

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

Есть ли в VB ссылочные переменные?

Сообщение Kurt » 15.05.2003 (Чт) 19:11

Народ! Очень надо и очень срочно!!! Меня тут заставили написать прогу на VB, чтоб с деревьями работала. А я в VB прямо скажем слабоват. :(
Короче вопрос: есть ли VB ссылочные переменные (указатели) типа как в Pascal или C++? Может, кто поможет или знает, где прочитать про это?
P.S. Повторяю: ОЧЕНЬ надо... :)

FaKk2
El rebelde gurú
El rebelde gurú
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

Сообщение FaKk2 » 15.05.2003 (Чт) 22:46

Нету...
самому нужно было...(кто помнит..)....
Для получения ответа надо продемонстрировать качества, позволяющие стать компетентным — внимательность, вдумчивость, наблюдательность, желание активно участвовать в выработке решения.

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 16.05.2003 (Пт) 0:04

FAKK2 писал(а):Нету...

Зачем же дезинформировать людёв? Их есть!
Все работают со ссылками, но в неявном виде.

Код: Выделить всё
Set fso = New Scripting.FileSystemObject

fso не что иное как ссылка на экземпляр объекта FileSystemObject

Списки создаются как коллекции классов.
Грубый набросок:
Код: Выделить всё
'Class Node
Option Explicit

Private moPrevNode As Node
Private moNextNode As Node
Private mvValue As Variant

Public Property Get PrevNode() As Node
    Set PrevNode = moPrevNode
End Property

Public Property Set PrevNode(ByRef newNode As Node)
    Set moPrevNode = newNode
End Property

Public Property Get NextNode() As Node
    Set NextNode = moNextNode
End Property

Public Property Set NextNode(ByRef newNode As Node)
    Set moNextNode = newNode
End Property

Public Property Get Value()
    If (IsObject(mvValue)) Then
        Set Value = mvValue
    Else
        Value = mvValue
    End If
End Property

Public Property Set Value(ByRef newValue As Variant)
    Set Value = newValue
End Property

Public Property Let Value(ByRef newValue As Variant)
    If (IsObject(newValue)) Then
        Set mvValue = newValue
    Else
        mvValue = newValue
    End If
End Property


Код: Выделить всё
'Class Nodes
Option Explicit

Private moNodes As New Collection

Public Function Add(ByRef Value As Variant) As Node
   
    Dim Node As New Node
    Dim PrevNode As Node
   
    If (moNodes.Count) Then
        Set PrevNode = moNodes(moNodes.Count)
    End If
   
    With Node
        .Value = Value
        If (Not PrevNode Is Nothing) Then
            Set .PrevNode = PrevNode
            Set PrevNode.NextNode = Node
        End If
        moNodes.Add Node
    End With
   
End Function

Public Function Node(ByVal Index As Variant) As Node
    Set Node = moNodes(Index)
End Function

Public Property Get Count() As Long
    Count = moNodes.Count
End Property


Код: Выделить всё
'Module modTest
Option Explicit

Public Function test()
   
    Dim oNodes As New Nodes
    Dim oNode As Node
   
    oNodes.Add "aaa"
    oNodes.Add "bbb"
    oNodes.Add "ccc"
   
    Debug.Print "Nodes 1 to n"
    Set oNode = oNodes.Node(1)
    Do Until (oNode Is Nothing)
        Debug.Print oNode.Value
        Set oNode = oNode.NextNode
    Loop
   
    Debug.Print "Nodes n to 1"
    Set oNode = oNodes.Node(oNodes.Count)
    Do Until (oNode Is Nothing)
        Debug.Print oNode.Value
        Set oNode = oNode.PrevNode
    Loop
   
End Function


Код: Выделить всё
'Immediate window
test
Nodes 1 to n
aaa
bbb
ccc
Nodes n to 1
ccc
bbb
aaa

FaKk2
El rebelde gurú
El rebelde gurú
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

Сообщение FaKk2 » 16.05.2003 (Пт) 0:32

Зачем же дезинформировать людёв? Их есть!


Ага, щас они появились, а раньше их небыло!
Кто же это людей дезинформирует?
Или я ошибаюсь и ссылочные переменные и указатели это не одно и тоже?
Для получения ответа надо продемонстрировать качества, позволяющие стать компетентным — внимательность, вдумчивость, наблюдательность, желание активно участвовать в выработке решения.

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 16.05.2003 (Пт) 0:34

Раньше это когда? В доконтуперную эру? Вроде бы всегда были.

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

Сообщение GSerg » 16.05.2003 (Пт) 8:41

Вот именно, всегда были. Язык, не поддерживающий указатели, обречён на перелопачивание в памяти огроменных кусяр данных, и будем он работать так медленно, что не стоит о нём говорить.

Когда мы передаём аргумент в процедуру ByRef (а мы почти всегда передаём его ByRef), то мы на самом деле передаём указатель на переменную. Можно передать саму переменную, но это ByVal, и это медленнее. А массивы вообще только по ссылке передаются, понятно почему :o . И ссылки объектные, через Set устанавливаемые - это тоже указатели. Просто VB позиционируется как простой язык, поэтому работа с указателями от программера здесь скрыта. Единственное, что можно сделать - это узнать указатель через VarPtr, StrPtr или ObjPtr. Хотя сами эти функции в объекктной модели являются скрытыми, нужно явно указать Show hidden items. Воооот...

А skiperski прав, конечно, что коллекцию классов делать надо. В качестве примера можно взять объектную модель TreeView и нагло сдуть с неё основное :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

FaKk2
El rebelde gurú
El rebelde gurú
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

Сообщение FaKk2 » 16.05.2003 (Пт) 9:49

FAKK2
Бывалый



Зарегистрирован: 21.09.2002
Сообщения: 225
Откуда: Israel, Holon
Добавлено: 11.04.2003 (Пт) 10:14 Заголовок сообщения:

--------------------------------------------------------------------------------

People!!!!
Мне позарез нужны указатели!!!!!!
Их можно использовать в VB??!!?!
_________________
If you have to shoot - shoot, don't talk!

Вернуться к началу


skiperski
Постоялец



Зарегистрирован: 25.06.2002
Сообщения: 454

Добавлено: 11.04.2003 (Пт) 12:26 Заголовок сообщения:

--------------------------------------------------------------------------------

VB не поддерживает указателей по определению. Облом'с.


Кто это писал? я? :twisted:
Для получения ответа надо продемонстрировать качества, позволяющие стать компетентным — внимательность, вдумчивость, наблюдательность, желание активно участвовать в выработке решения.

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 16.05.2003 (Пт) 11:39

FAKK2 писал(а):Кто это писал? я? :twisted:

Какой вопрос - такой ответ. Ты же задачу не объяснил, а затребовал указатели. В явном виде их нетути. Т.е. ты не можешь без плясок с бубном получить адрес на куда ссылается объектная переменная и производить с ней непосредственные действия как в том же C или Pascal. Нельзя создать указатель на переменную простого типа или просто на какую-то произвольную область памяти. Поэтому можно говорить, что в VB указателей в традиционном представлении нет. Наверное в VB лучше пользоваться термином "ссылка [на объект]", а не "указатель".

FaKk2
El rebelde gurú
El rebelde gurú
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

Сообщение FaKk2 » 16.05.2003 (Пт) 12:11

FAKK2 писал(а):.... и ссылочные переменные и указатели это не одно и тоже?


Можно было и объяснить, а не вводить в заблуждение. :)
Для получения ответа надо продемонстрировать качества, позволяющие стать компетентным — внимательность, вдумчивость, наблюдательность, желание активно участвовать в выработке решения.

Алекс
Обычный пользователь
Обычный пользователь
 
Сообщения: 84
Зарегистрирован: 30.04.2003 (Ср) 15:59
Откуда: Краснодар

Сообщение Алекс » 16.05.2003 (Пт) 12:54

Вопрос:
Есть у меня массив, в нём хранятся имена
переменных. Можно ли переменной с идентификатором
MyMassiv(3, 5) присвоить значение???:?::?::?:
Алекс.

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 16.05.2003 (Пт) 13:16

Да можно! Представь себе!!! :lol: пишешь Myarr(3,5)="Name" и все! :lol:

Kurt
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 105
Зарегистрирован: 05.01.2003 (Вс) 23:25

Сообщение Kurt » 16.05.2003 (Пт) 14:03

Всем спасибо!!!! :D
Я знал, что на вас можно положиться!!!!!! :D :D :D

Алекс
Обычный пользователь
Обычный пользователь
 
Сообщения: 84
Зарегистрирован: 30.04.2003 (Ср) 15:59
Откуда: Краснодар

Сообщение Алекс » 16.05.2003 (Пт) 19:20

RayShade писал(а):Да можно! Представь себе!!! :lol: пишешь Myarr(3,5)="Name" и все! :lol:

Нет!
MyMassiv(3, 5)="Identificator"
Необходимо переменной identificator присвоить значение 8)
Алекс.

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 16.05.2003 (Пт) 19:49

Алекс писал(а):Необходимо переменной identificator присвоить значение 8)

Так сделать нельзя. Имена переменных ассоциированы ещё на этапе компиляции. Если бы это был интерпретатор, то другое дело. А зачем такие сложности? Ты можешь хранить переменные и обращаться непосредственно к массиву. Если неудобно оперировать индексами-числами, то создай Enum в которов дай смысловые имена индексам.
Код: Выделить всё
Enum EVariables
    Identificator = 0
    IdentName = 1
    UserAddr = 3
End Enum

Dim MyMassiv(5, 5) As ...

MyMassiv(1, Identificator) = 100
MyMassiv(1, IdentName) = "Vasja"
MyMassiv(1, UserAddr) = "Moscow"


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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 89

    TopList