受到this question答案的启发,我为空数组创建了 factory 。它通常有效,但有时它不起作用。使用该帖子中描述的技术创建的数组,在ReDim
之后编辑并且为其元素分配了一些值,从某些观点看似破坏,从其他观点看似正确。
例如在我的实际代码中,我在Locals窗口中看到其元素中的所有正确值,我在Watch窗口看到<Variable uses an Automation type not supported in Visual Basic>
,我在某些函数的所有元素上看到了正确的值,我看到了其他功能上只有几个正确的值。例如,如果F1()
创建数组并将其传递给F2()
,则F1
会看到所有值,但F2
只看到其中的一些,而其他值似乎是空(在这种情况下是字符串)。
我无法在小片段中重现相同的完全相同的行为,但我在下面的代码中重现了类似的内容。这里的不良行为与我上面描述的相反:它适用于代码而且它不在Locals窗口中。
我认为解决此问题的方法也可以解决实际应用问题。
立即窗口的输出是正确的:
Watch窗口的输出失败:
“本地”窗口的输出错误:
以下是代码:
Private Declare Sub GetMem2 Lib "msvbvm60" (src As Any, dest As Any)
Sub Test()
Dim S() As String, I As Integer
S = NewArrayString
ReDim Preserve S(9)
For I = 0 To 9
S(I) = String(I + 1, "x")
Next I
For I = 0 To 9
Debug.Print I; S(I)
Next I
Stop
End Sub
Function NewArrayString() As String()
Dim V As Variant, NewTypeCode As Integer
V = Array()
NewTypeCode = vbArray Or vbString
GetMem2 NewTypeCode, V
NewArrayString = V
End Function