【问题标题】:Returning values from functions in structures in Visual Basic从 Visual Basic 结构中的函数返回值
【发布时间】:2019-05-21 09:35:45
【问题描述】:

我希望帖子的标题不要太乱。我正在复习上周的一些课程材料,关于这个特定的结构和其中的加减函数,我只有一件事不明白:

  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

现在,我理解函数的方式是,一旦从它返回任何内容,函数的执行就会停止在返回值的确切行处,并且在执行后什么也没有。据此,它应该添加实部并退出函数。

我知道我在这里遗漏了一个关键的东西,如果有人可以向我解释这一点,我将不胜感激。

【问题讨论】:

  • 很不清楚你被困在什么地方。没有什么会提前退出函数。这看起来几乎像 VB6 语法。我“猜测”你希望这是一个 void,而不是一个函数,Re += br.Re 等。不知道。
  • 顺便说一句,我会警告不要使用可变结构。他们往往非常难以推理。有时会在您意想不到的时候制作副本。
  • @Craig 我会牢记这一点,谢谢。但这是学校里的一项特殊练习,所以它必须是这样的:)

标签: vb.net function data-structures procedure


【解决方案1】:

您设置这些函数的方式是在您每次调用它们时创建一个新的空 ComNum 结构(根据函数名称命名为 add 或 subt)。除非您提前手动返回它们,否则它将默认返回名为结构的函数。

    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

虽然像 Lars 指出的那样,我不确定您为什么希望这是一个函数而不是一个子函数。按照现在的设置方式使用它需要您执行类似的操作来获取加/减值,因为您需要捕获返回的 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}) 

做这样的事情对我来说更有意义。

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())

【讨论】:

  • 在修改了代码之后,我设法弄清楚了一切是如何工作的,但是你给了我很大的帮助,为我指明了正确的方向。谢谢 :) 至于为什么这样做,就像我在编辑开篇文章时所说的那样,这是对结构、函数和调用链的练习。关键是在结构中定义这些操作,而不改变已经输入的数字以实现灵活性。
  • 很高兴我能提供帮助,您对练习的描述在那种情况下是有道理的。在现实世界的应用程序中,我可能会使用该结构的列表来计算加法/减法。但是家庭作业/学习应用程序具有非常严格的结构,因此可以正常工作。我添加了一个可能覆盖 .ToString() 方法的编辑,因此您可以调用 c.ToString() 与每次手动格式化输出。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多