亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何確定是否在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 關注
  • 1149 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號