为了账号安全,请及时绑定邮箱和手机立即绑定

如何确定是否在VB6中初始化了一个数组?

如何确定是否在VB6中初始化了一个数组?

如何确定是否在VB6中初始化了一个数组?将未扩展的数组传递给VB6的Ubound函数将导致错误,因此我想在检查其上限之前检查它是否已被标注尺寸。我该怎么做呢?
查看完整描述

3 回答

?
森林海

TA贡献2011条经验 获得超2个赞

我只是想到了这个。很简单,不需要API调用。有什么问题吗?

Public Function IsArrayInitialized(arr) As Boolean

  Dim rv As Long

  On Error Resume Next

  rv = UBound(arr)
  IsArrayInitialized = (Err.Number = 0)End Function

编辑:我确实发现了一个与Split函数行为有关的缺陷(实际上我称之为Split函数中的一个缺陷)。举个例子:

Dim arr() As Stringarr = Split(vbNullString, ",")Debug.Print UBound(arr)

此时Ubound(arr)的价值是多少?它是-1!因此,将此数组传递给此IsArrayInitialized函数将返回true,但尝试访问arr(0)将导致下标超出范围错误。


查看完整回答
反对 回复 2019-08-28
?
猛跑小猪

TA贡献1858条经验 获得超8个赞

这就是我的用途。这类似于GSerg的答案,但使用了更好的文档CopyMemory API函数,并且完全是自包含的(您只需将数组而不是ArrPtr(数组)传递给此函数)。它确实使用了VarPtr函数,微软警告说,但这是一个仅限XP的应用程序,它可以工作,所以我不担心。

是的,我知道这个函数会接受你抛出的任何东西,但是我会把错误检查留给读者练习。

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _  (pDst As Any, pSrc As Any, ByVal ByteLen As Long)Public Function ArrayIsInitialized(arr) As Boolean

  Dim memVal As Long

  CopyMemory memVal, ByVal VarPtr(arr) + 8, ByVal 4 'get pointer to array
  CopyMemory memVal, ByVal memVal, ByVal 4  'see if it points to an address...  
  ArrayIsInitialized = (memVal <> 0)        '...if it does, array is intializedEnd Function


查看完整回答
反对 回复 2019-08-28
  • 3 回答
  • 0 关注
  • 955 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信