【问题标题】:Passing a list of constants (array) in vb.net在 vb.net 中传递常量列表(数组)
【发布时间】:2013-11-23 00:31:29
【问题描述】:

我确信这是一个简单的问题,但我对 vb.net 很陌生,我正在努力解决这个问题。基本上在 VBA 中,您可以使用 Sub 来填充数组,只要数组已在模块中声明为 public,这可以在任何模块上看到。

Public reg12bound(1 To 5) As Double

Sub region12boundary()  
'  
'  Initialize coefficients for boundary equation  
'  
    reg12bound(1) = 348.05185628969  
    reg12bound(2) = -1.1671859879975  
    reg12bound(3) = 1.0192970039326E-03  
    reg12bound(4) = 572.54459862746  
    reg12bound(5) = 13.91883977887  
'  
End Sub

那么这可以使用下面的代码在另一个模块中看到

Private Function boundary23P(Temp)  
 Call region12boundary  
 boundary23P = (reg12bound(1) + reg12bound(2) * Temp + reg12bound(3) * (Temp ^ 2)) * 1000000  
End Function

基本上我希望在 VB.net 中重复此功能,但是当我尝试以下操作时

Public reg12bound(5) As Double

Sub region12boundary()
    '
    '  Initialize coefficients for boundary equation
    '
    ReDim reg12bound(5)
    reg12bound(1) = 348.05185628969
    reg12bound(2) = -1.1671859879975
    reg12bound(3) = 0.0010192970039326
    reg12bound(4) = 572.54459862746
    reg12bound(5) = 13.91883977887
    '
End Sub

公共函数边界23P(ByVal Temp As Double) As Double

    call region12boundary()  
    boundary23P = (reg12bound(1) + reg12bound(2) * Temp + reg12bound(3) * (Temp ^ 2)) * 1000000  

End Function

数组填充为 0 而不是值。当我在函数中填充时,该功能似乎工作正常。但我宁愿避免这种情况,因为大多数函数都引用了相同的 34 个变量数组,这些变量需要复制到每个函数中。

我也意识到没有填充 reg12bound(0) 值,这在自包含版本中似乎不是问题,所以我假设这在外部也很好

编辑添加对函数的调用

【问题讨论】:

  • 集合在 .NET 中基于零,因此它们以索引 0 而不是 1 开头。
  • 你必须展示你是如何调用boundary23P来理解可能是什么问题。 reg12bound(0) 也未填充,因为您没有填充它。

标签: arrays vb.net vba


【解决方案1】:

在 VB.NET 中,数组的下限总是 0。这是固定的。我同意 VB6 和更早的版本具有指定边界的功能。但在.NET 中没有。您不能再指定数组的下限。

话虽如此,您没有理由不能自己实现类似的功能。只需要做一点工作。

一个。创建一个类来处理 LBound 偏移量。我已经用泛型展示了它,但如果你的数组总是相同的类型,你可以删除它。

Public Class MyArray(Of T)
    Public LBound, UBound As Integer
    Private theArray() As T

    Public Sub New(ByVal lBound As Integer, ByVal uBound As Integer)
        Me.LBound = lBound
        Me.UBound = uBound
        ReDim theArray(uBound - lBound)
    End Sub

    Default Public Property Items(ByVal item As Integer) As T
        Get
            Return theArray(item - LBound)
        End Get
        Set(ByVal value As T)
            theArray(item - LBound) = value
        End Set
    End Property
End Class

B。用这个类声明替换你的数组声明:

Public arr As New MyArray(Of String)(5, 10)

C。现在您可以像以前一样在代码中设置值:

    arr(5) = "item 5"
    arr(6) = "item 6"
    arr(7) = "item 7"
    arr(8) = "item 8"
    arr(9) = "item 9"
    arr(10) = "item 10"
    arr(11) = "item 11"  '<-- this wil cause index out of bounds error.

D。并像以前一样访问存储在数组中的值:

    For i = 5 To 10
        Debug.Print(arr(i))
    Next

希望这会有所帮助。

【讨论】:

  • 谢谢,这不是我想要的,但它引导我找到了正确的方向。我以为如果我没有定义 (0) 值,它会自动给它一个值 0。用 0 替换该值似乎已经解决了问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-24
  • 2022-12-16
  • 2017-02-02
  • 1970-01-01
  • 1970-01-01
  • 2021-12-01
  • 1970-01-01
相关资源
最近更新 更多