如何確定是否在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)將導致下標超出范圍錯誤。

猛跑小豬
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
添加回答
舉報
0/150
提交
取消