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

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

将未扩展的数组传递给VB6的Ubound函数将导致错误,因此我想在检查其上限之前检查它是否已被标注尺寸。我该怎么做呢?



德玛西亚99
浏览 1072回答 3
3回答

森林海

我只是想到了这个。很简单,不需要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)将导致下标超出范围错误。

猛跑小猪

这就是我的用途。这类似于GSerg的答案,但使用了更好的文档CopyMemory API函数,并且完全是自包含的(您只需将数组而不是ArrPtr(数组)传递给此函数)。它确实使用了VarPtr函数,微软警告说,但这是一个仅限XP的应用程序,它可以工作,所以我不担心。是的,我知道这个函数会接受你抛出的任何东西,但是我会把错误检查留给读者练习。Private&nbsp;Declare&nbsp;Sub&nbsp;CopyMemory&nbsp;Lib&nbsp;"kernel32"&nbsp;Alias&nbsp;"RtlMoveMemory"&nbsp;_&nbsp;&nbsp;(pDst&nbsp;As&nbsp;Any,&nbsp;pSrc&nbsp;As&nbsp;Any,&nbsp;ByVal&nbsp;ByteLen&nbsp;As&nbsp;Long)Public&nbsp;Function&nbsp;ArrayIsInitialized(arr)&nbsp;As&nbsp;Boolean &nbsp;&nbsp;Dim&nbsp;memVal&nbsp;As&nbsp;Long &nbsp;&nbsp;CopyMemory&nbsp;memVal,&nbsp;ByVal&nbsp;VarPtr(arr)&nbsp;+&nbsp;8,&nbsp;ByVal&nbsp;4&nbsp;'get&nbsp;pointer&nbsp;to&nbsp;array &nbsp;&nbsp;CopyMemory&nbsp;memVal,&nbsp;ByVal&nbsp;memVal,&nbsp;ByVal&nbsp;4&nbsp;&nbsp;'see&nbsp;if&nbsp;it&nbsp;points&nbsp;to&nbsp;an&nbsp;address...&nbsp;&nbsp; &nbsp;&nbsp;ArrayIsInitialized&nbsp;=&nbsp;(memVal&nbsp;<>&nbsp;0)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'...if&nbsp;it&nbsp;does,&nbsp;array&nbsp;is&nbsp;intializedEnd&nbsp;Function
打开App,查看更多内容
随时随地看视频慕课网APP