Возвращение значений из функций в структурах в Visual Basic - PullRequest
0 голосов
/ 20 декабря 2018

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

  Structure ComNum
    Dim Re As Double
    Dim Im As Double
    Function add(ByVal br As ComNum) As ComNum
        add.Re = br.Re + Re
        add.Im = br.Im + Im
    End Function
    Function subt(ByVal br As ComNum) As ComNum
        subt.Re = br.Re - Re
        subt.Im = br.Im - Im
    End Function
End Structure

Sub Main()
    Dim a, b, c As ComNum

    a.Re = 2
    a.Im = 3
    b.Re = 4
    b.Im = 5

    c = a.add(b).add(b).subt(b)

    Console.WriteLine("The second number added twice and subtracted once from the first number gives {0}+{1}i", c.Re, c.Im)

End Sub

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

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

1 Ответ

0 голосов
/ 21 декабря 2018

При настройке этих функций эти функции создают новую пустую структуру ComNum каждый раз, когда вы вызываете их (с именем add или subt в зависимости от имени функции).Если вы не вернете их вручную раньше, по умолчанию будет возвращена функция с именем struct.

    Function add(ByVal br As ComNum) As ComNum
        add.Re = br.Re + Re
        add.Im = br.Im + Im
    End Function

В основном делает эквивалент:

    Dim add As New ComNum
    add.Re = br.Re + Re
    add.Im = br.Im + Im
    Return add

Хотя, как заметил Ларс, яне уверен, почему вы хотите, чтобы это была функция против подпрограммы.Чтобы использовать его в том виде, в котором вы его настроили, теперь вам нужно сделать что-то подобное, чтобы получить значения сложения / вычитания, потому что вам нужно захватить возвращенный объект ComNum.

    Dim a As New ComNum With {.Im = 1, .Re = 1}
    'Im = 6, Re = 6
    a = a.add(New ComNum With {.Im = 5, .Re = 5}) 

Делать что-то подобное имеет больше смысла дляme.

Structure ComNum
    Dim Re As Double
    Dim Im As Double
    Sub add(ByVal br As ComNum)
        Re += br.Re
        Im += br.Im
    End Sub
    Sub subt(ByVal br As ComNum)
        Re -= br.Re
        Im -= br.Im
    End Sub
End Structure

Тогда вы можете просто назвать его так, чтобы обновить структуру без необходимости перехвата возвращаемых значений.

a.add(New ComNum With {.Im = 5, .Re = 5}) 

Редактировать: Зная больше сейчас, как предполагается упражнениечтобы быть выполненным, я бы предложил что-то вроде этого для структуры:

    Public Overrides Function ToString() As String
        Return String.Format("Re: {0}  Im: {1}", Re, Im)
    End Function

Затем вы можете вызвать метод .ToString () следующим образом.Хотя, просто мысль.

    Console.WriteLine("The second number added twice and subtracted once from the first number gives {0}", c.ToString())
...