Результат выполнения функции
Релиб
Форумы       Участники    Календарь    Кто он-лайн?
Добро пожаловать, гость ( Вход | Регистрация )
        



Результат выполнения функции Expand / Collapse
Автор
Сообщение
25.04.2007 16:31
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 23.06.2008 8:38
Сообщ.: 91, Visits: 451
Есть у меня функция

private function GetValue(i) as String

мне нужно чтобы возвращаемым значением была переменная, которую я туда присваиваю, а не значение этой переменной.

как можно сделать?

Сообщ. #912808
26.04.2007 9:55
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 26.10.2007 9:10
Сообщ.: 166, Visits: 1 538
А ты прочитай значение своей переменной после вызова функции. И если в теле функции есть инструкции, присваивающие этой переменной соответствующее значение, то будешь приятно удивлён. В противном случае выложи свой код.

Желаю успехов.

Сообщ. #912814
27.04.2007 12:15
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 23.06.2008 8:38
Сообщ.: 91, Visits: 451
В-общем указателей в VB нет. Я этого не знал.

Короче задача такая: есть переменная, созданная на основе собственного типа данных, который достаточно сложен и разветвлен. Есть функция, которая на выходе выдает кусок этой переменной. Мне нужно: получить доступ к этому куску и изменить в нем некоторые значения.

В VB указатели используются исключительно при передаче переменных в функции и процедуры с помощью служебного слова ByRef. Функция всегда возвращает не ссылку на переменную, а ее копию. В-общем буду что-нибудь кривое делать. Мыслишки кое-какие есть.

Сообщ. #912829
27.04.2007 12:38
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 26.10.2007 9:10
Сообщ.: 166, Visits: 1 538
Суть в общем понятна, но есть много вопросов по деталям. Выложи код (хотя бы ключевые фрагменты). Где и как описана переменная? Откуда и как вызывается функция? что она делает с переменной? Как должен использоваться результат её работы?
Сообщ. #912830
03.05.2007 11:03
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 23.06.2008 8:38
Сообщ.: 91, Visits: 451
Вот код - смотрите

Private Type CharacterType
    id As Long
    ChName As String
End Type

Private Type MyType
    id As String
    ArOfCharacters() As CharacterType
End Type

Dim MyVar() As MyType
'Возвращает кусок глобальной переменной
Private Function GetCharacter(id, ChId) As CharacterType
    GetCharacter.ChName = "BLANK"
    For i = LBound(MyVar) To UBound(MyVar)
        If MyVar(i).id = id Then
            For j = LBound(MyVar(i).ArOfCharacters) To UBound(MyVar(i).ArOfCharacters)
                If MyVar(i).ArOfCharacters(j).id = ChId Then
                    GetCharacter = MyVar(i).ArOfCharacters(j)
                    Exit Function
                End If
                Exit Function
            Next j
        End If
    Next i
End Function
'Процедура замены атрибута ChName у заданного элемента глобальной переменной
Private Function RenameElement(id, ChId, NewName) As Boolean
    RenameElement = False
    With GetCharacter(id, ChId) 'Функция возвращает копию куска глобальной переменной, а ну жна ссылка на него
        If .ChName <> "BLANK" Then
            .ChName = NewName 'Изменяю атрибут у копии куска глобальной переменной, а не у нее самой
        End If
    End With
End Function

Сообщ. #912939
04.05.2007 11:30
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 26.10.2007 9:10
Сообщ.: 166, Visits: 1 538
В приведенном коде не хватает процедуры, из которой вызываются твои функции. А это место и представляет наибольший интерес. Если это не очень тебя затруднит...
Сообщ. #912986
04.05.2007 11:50
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 23.06.2008 8:38
Сообщ.: 91, Visits: 451
Пожалуйста - вот обработчик кнопочки "Ок":

Private Sub OkButton_Click()
    'Изменяем значение выбранного элемента в списке CharactersListBox
    CharactersListBox.List(CharactersListBox.ListIndex) = RenameCharacterTextBox.Text
    'Отображаем эти изменения в структуре данных
    Flazhok = RenameElement(ItemsListBox.ListIndex, CharactersListBox.ListIndex, RenameCharacterTextBox.Text)
End Sub

Вопросы типа - почему и зачем так сделано будут излишни. Я просто смоделировал подобную ситуацию. На мой код форума не хватит и никто в нем разбираться не будет.

Небольшое пояснение: структура данных содержит информацию об индексах и значениях списков ItemListBox и CharactersListBox. По кнопке "Ок" в список CharactersListBox в выделенный элемент списка заносится значение из RenameCharacterTextBox и это изменение вносится в структуру данных.

Сообщ. #912987
04.05.2007 14:44
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 26.10.2007 9:10
Сообщ.: 166, Visits: 1 538
До обеда написал тебе довольно много чего критического, но сообщение пропало. Повторяться не буду. Посмотри на мой код и подумай: не хочешь ли ты получить что-то похожее. Обрати внимание, что для доступа к чати сложной переменной я не использую функции. Честно говоря, я даже не представляю, как их можно было бы здесь использовать. Если твоя задача не похожа на мой пример, то укажи чем именно. По твоему коду я ничегошеньки не понял, кроме одного - он неоправдано сложен и запутан.

Type MyType
  L As Long
  S As String
End Type

Type MyComplexType
  L As Long
  A(1 To 8) As MyType
End Type

Dim MySuperArray(1 To 5) As MyComplexType

Sub Main()
  Dim i As Integer, j As Integer
  For i = 1 To 5
    MySuperArray(i).L = i
    For j = 1 To 8
      MySuperArray(i).A(j).L = j
      MySuperArray(i).A(j).S = "Значение элемента №" & j
    Next j
  Next i
  MsgBox MySuperArray(3).L
  MsgBox MySuperArray(3).A(7).L
  MsgBox MySuperArray(3).A(7).S
  MySuperArray(3).A(7).S = "Изменённое значение элемента №7"
  MsgBox MySuperArray(3).A(7).S
End Sub

Сообщ. #912998