VB6数组的上界设为-1

5

一些函数,如Split(),如果数组没有任何元素,则返回上限为-1,下限为0的数组,例如:

Dim s() As String
s = Split("", ",")
Debug.Print UBound(s)
Debug.Pring LBound(s)

在这种情况下,UBound(s)将等于-1,LBound(s)将等于0。我有很多代码检查上限是否为-1,以查看数组是否具有值。这很有效。
问题是,我现在想将数组数据类型从字符串更改为长整型。我似乎无法创建一个具有-1上限和0下限的long型数组,并且Split()和Join()函数仅适用于字符串数组。
我希望能够返回一个上限为-1的长整型数组。这个可能吗?

2
我可能没有理解你的观点,但是你可以用upperbound-1来创建一个Long数组:Dim lngArray(-1 to -1) As Long - Matt Wilko
@Matt @bugtussle Bugtussle,你应该在问题中解释你想要一个下限为零和一个上限为-1!否则你必须非常了解Split的行为。我会相应地编辑你的问题。 - MarkJ
4个回答

4

我认为你不能在VB6本身中完成它。但是,如果你愿意使用Windows API函数SafeArrayCreateVector,你就可以做到:

Private Declare Function LongSplitEmulator Lib "OLEAUT32.DLL" Alias "SafeArrayCreateVector" _
    (Optional ByVal vt As VbVarType = vbLong, _
     Optional ByVal low As Long = 0, _
     Optional ByVal count As Long = 0) As Long()

Dim a() As Long
a = LongSplitEmulator()
MsgBox UBound(a)

如果您需要对其他数据类型执行此操作,可以更改vt参数。
请注意,我认为我最初是从Vi2对discussion的回答中发现了这一点。

这将创建一个具有lbound 0和ubound -1的数组,其行为与s = Split("", ",")时的split函数完全相同。谢谢。 - bugtussle

1
你可以编写自己的分割函数来实现这个功能:
Private Sub SplitLongs(ByVal strData As String, ByRef lng() As Long)
    Dim i As Integer
    Dim s() As String
    s = Split(strData, ",")
    If UBound(s) = -1 Then
        ReDim lng(-1 To -1)
    Else
        ReDim lng(LBound(s) To UBound(s))
        For i = LBound(s) To UBound(s)
            If IsNumeric(s(i)) Then lng(i) = s(i)
        Next
    End If
End Sub

1
我正在寻找 redim lng(-1 to -1)。谢谢。我只尝试了 ReDim(-1)ReDim(0 to -1),但是都收到了错误提示 :P - bugtussle

0

另一种方法是使用强类型的“工厂”函数:

Private Declare Function SafeArrayRedim Lib "oleaut32.dll" (ByVal ArrayPtr As Long, ByRef DataPtr As tagSAFEARRAYBOUND) As Long

Private Type tagSAFEARRAYBOUND
  cElements As Long
  lLbound As Long
End Type

Public Type Feed
  ID As String
  Name As String
  Active As Boolean
  BasePath As String
End Type

Public Sub EmptyFeedArray(ByRef Arr() As Feed)
Dim Data As tagSAFEARRAYBOUND
Dim lngErr As Long

  'Redim to one item
  ReDim Arr(0 To 0)
  'Reset the safe array to empty
  lngErr = SafeArrayRedim(Not Not Arr, Data)
  'Raise any errors
  If lngErr <> 0 Then Err.Raise lngErr
End Sub

我认为这也适用于整数类型。


0
VB6的一个问题是没有可靠地创建或检测空(或未初始化)数组的方法。有时,可以通过检查上界是否大于下界来检测未初始化的数组;然而,这既不优雅也没有文档记录。正确完成此操作的最佳方法是将数组封装在Variant中,并将Variant设置为Empty以取消初始化数组。然后,您可以使用类似于If VarType(v) = vbEmpty ...的检查。

我认为这很优雅。你可以将其视为空对象模式。 - MarkJ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接