无法使用数组成员变量分配数组

Posted

技术标签:

【中文标题】无法使用数组成员变量分配数组【英文标题】:Can't assign array using array member variable 【发布时间】:2011-09-02 16:52:51 【问题描述】:

我有一个类,其中一个成员变量是一个数组。我正在尝试将数组分配给对象,但不断收到“无法分配数组”编译错误。我也很好奇如何在对象中获取数组的 UBound。 UBound(obj.array) 无法编译。我正在使用 excel 07 vba。

'Test routine that keeps failing

Sub test()  

Dim Arr(2) As String
Arr(0) = ""
Arr(1) = "Pizza"
Arr(2) = "Hoes"

Dim obj As Cats
Set obj = New Cats
obj.avry = Arr
obj.field = 4    
MsgBox UBound(obj.ary)

End Sub  


'Class declaration
Private pary() As String
Private pfield As Long

Public Property Get ary(ByVal index As Long) As String
    Set ary = pary(index)
End Property

Public Property Let avry(Value() As String)
    ReDim pary(UBound(Value)) As String
    For i = LBound(Value) To UBound(Value)
        pary(i) = Value(i)
    Next i
End Property

Public Property Get field() As Long
    field = pfield
End Property

Public Property Let field(Value As Long)
    pfield = Value
End Property

Private Sub Class_Initialize()
    pfield = 0
End Sub

【问题讨论】:

【参考方案1】:

这对我有用

Sub test()

Dim Arr(2) As String
Arr(0) = ""
Arr(1) = "Pizza"
Arr(2) = "Hoes"

Dim obj As Cats
Set obj = New Cats
obj.avry = Arr
obj.field = 4
MsgBox obj.ary(2)

End Sub

Public Property Get ary(ByVal index As Long) As String
    ary = pary(index)
End Property

Public Property Let avry(vValue As Variant)
    ReDim pary(UBound(vValue)) As String
    Dim i As Long
    For i = LBound(vValue) To UBound(vValue)
        pary(i) = vValue(i)
    Next i
End Property

Public Property Get field() As Long
    field = pfield
End Property

Public Property Let field(Value As Long)
    pfield = Value
End Property

Private Sub Class_Initialize()
    pfield = 0
End Sub

正如 Tim 所说,您可以将数组作为变体传递。您的 MsgBox 正在尝试查找 String 数据类型的 UBound,所以这是一个问题。此外,您没有将参数传递给 MsgBox 中的 ary。 ary 属性返回一个字符串,但您使用的是 Set 关键字,这是另一个问题。

【讨论】:

感谢这工作。我没有使用 UBound,而是在数组的赋值运算符的 for 循环中添加了第三个成员变量作为计数器。我还必须将 pary 声明为 pary()【参考方案2】:

将数组参数传递给类属性似乎存在问题。

您可以通过将 Let 参数切换为 Variant 来解决此问题:

Public Property Let avry(ByRef arrVal As Variant)
    Dim i As Integer
    If IsArray(arrVal) Then
        ReDim pary(LBound(arrVal) To UBound(arrVal))
        For i = LBound(arrVal) To UBound(arrVal)
            pary(i) = arrVal(i)
        Next i
    End If
End Property

【讨论】:

尝试了您的解决方案,但仍然遇到相同的错误。我应该提一下,在我将 ary 用于 get 和 let 属性之前,我遇到了“同一属性的属性过程定义不一致”错误。将 get 更改为 avry 作为解决方法。 Public Property Get ary(ByVal index As Long) As String Public Property Let ary(ByRef Value() As Variant) 给出了该错误。也许这与数组分配问题有关。 如果 Let/Set 和 Get 类型不同(在您的情况下是数组与字符串),您应该使用不同的属性名称。这就是你原来的“不一致的定义”错误告诉你的。请注意,test() 中的 Msgbox() 调用存在问题:您的属性 ary Get 返回一个字符串,但您试图通过在返回值上调用 UBound() 将其视为一个数组。

以上是关于无法使用数组成员变量分配数组的主要内容,如果未能解决你的问题,请参考以下文章

Swig:将成员变量(指向值的指针)转换为 python 列表

java类中成员变量初始化后存放在堆内存中还是栈内存中?

在C中为结构指针数组成员分配地址

使用 const 成员变量索引数组

Java中成员变量分配在哪个空间?

正确转换二维数组的成员变量