在 VB6 中将数组作为参数传递

问题描述 投票:0回答:4

以下代码在标记行的办公室的两台机器上以“VB.exe 中未处理的异常错误”终止 VB6 (sp6)。

''# Form1.frm
Option Explicit
Private ArrayHolder As Class2

Private Sub Command1_Click()
    Set ArrayHolder = New Class2

    Dim arr(3) As Long
    arr(0) = 1
    arr(1) = 2
    arr(2) = 3

    ArrayHolder.Add arr

End Sub

''# -----------------------------------------------------------    
''# Class1.cls
Option Explicit

Private m_myArray() As Long

Public Property Get myArray() As Long()
    myArray = m_myArray
End Property

Friend Property Let myArray(ByRef anArray() As Long)
    m_myArray = anArray
End Property

''# -----------------------------------------------------------    
''# Class2.cls
Option Explicit

Friend Function Add(newArray() As Long) As Class1
    Dim oClass As Class1
    Set oClass = New Class1

    oClass.myArray = newArray  <- This kills VB6 dead
    MsgBox "passed"

End Function

从我在各个网站上可以看出,我正确地传递了一个数组,但我实际上做得正确吗?为什么它会导致 VB6 如此可怕地死亡?

arrays vb6 parameters
4个回答
9
投票

我没有答案,这当然是一个奇怪的问题,但为什么不添加一个方法并继续前进呢?

'Passed the test
Public Sub LetMyArray(anArray() As Long)
    m_myArray = anArray
End Sub


'oClass.MyArray = newArray ' <- This kills VB6 dead
oClass.LetMyArray newArray  ' <- This works

9
投票

这是IDE中的一个bug(编译没问题),MS从未修复过。我正在使用像这样的临时数组的解决方法:

Friend Function Add(newArray() As Long) As Class1
    Dim oClass As Class1
    Dim tempArray() As Long
    Set oClass = New Class1

    tempArray = newArray
    oClass.myArray = tempArray <- Should work now
    MsgBox "passed"

End Function
仅供参考,当您不小心将鼠标悬停在参数或数组属性上时,字节数组(长数组是安全的)会变得更糟。最好让鼠标远离代码:-))


1
投票
我不知道为什么会发生这种情况,但如果你想要一个数组的副本,请在 class2 中使用 Variant:

Private m_myArray As Variant Public Property Get myArray() As Variant myArray = m_myArray End Property Friend Property Let myArray(anArray As Variant) m_myArray = anArray End Property

修复了它,但我仍然很好奇原因。


0
投票
问题似乎是这样的: Dim arr(3) As Long 在内存中,这与此没有什么不同: 变暗A一样长,B一样长,C一样长

它在本地堆栈上创建 3 个变量(12 字节)。没有数组头,所以这就是为什么当它访问一个数组头时它会崩溃(因为它不在那里) 像这样从堆中分配数组应该没问题;

dim arr() 只要 重做 arr(3)

© www.soinside.com 2019 - 2024. All rights reserved.