主题:怎样判断一个动态数组是否重分配过大小
靠VB吃饭的人
[专家分:5840] 发布于 2007-04-27 17:55:00
怎样判断一个动态数组是否重分配过大小
比如Dim a() as Double
在后面的操作中会根据情况决定是否Redim a(10) as Double
但最后要判断该数组是否有元素以便决定是否画图.
可是我用UBound会出错9,如果我让这个错误忽略执行下一句并不是我所希望,我也不愿加一些布尔变量根据错误类型判断它是否被重分配过;
我用IsEmpty, IsNull, Is Nothing等都试过,前两个都是False,当我尝试给数组设为Empty或Null时,提示不适用数组,第三个根本类型就不匹配,因为不是对象;
我没辙了,难道VB没有办法做到判断一个动态数组是否重分配过大小?
回复列表 (共10个回复)
沙发
老大徒伤悲 [专家分:29120] 发布于 2007-04-27 20:54:00
“如果我让这个错误忽略执行下一句并不是我所希望,我也不愿加一些布尔变量根据错误类型判断它是否被重分配过;”
这个可以利用而不忽略错误。有错误,似乎就可以说明没有执行过redim,也就是你要的判断阿
板凳
shigx [专家分:1790] 发布于 2007-04-28 12:19:00
提供一个程序员不屑一顾的一个办法:
在dim a()之后,立刻redim a(1),并赋值a(0)=0
然后在后面的操作中,你可以再次redim它,并且redim的方式是不加Preserve关键词的...
最后在画图的时候,判断数组是否是一个元素,并且是否是0,如果是,则没有数据,否则有数据,可以画图。
3 楼
靠VB吃饭的人 [专家分:5840] 发布于 2007-04-30 09:30:00
按照老大的办法,我改了下程序
将On Error Goto ...改成On Error Resume Next
程序也做了改变,如下:
If UBound(fac_bp) >= 1 Then
If Err = 0 Then
ReDim Preserve fac_bp(UBound(fac_bp) - 1) As Double
Else
Err.Clear
End If
End If
感觉虽然麻烦一些,但是也许是目前为止最好的办法了.
4 楼
brokenworld [专家分:2640] 发布于 2007-04-30 10:03:00
把数组用完之后立即 erase a
5 楼
靠VB吃饭的人 [专家分:5840] 发布于 2007-04-30 12:22:00
没用,我用了Erase,这和没重分配一样.
6 楼
家人 [专家分:6760] 发布于 2007-04-30 14:26:00
不是麻烦,是有点别扭。
是不是应该重构一下思路?
呵呵
7 楼
靠VB吃饭的人 [专家分:5840] 发布于 2007-04-30 15:30:00
愿闻其详
8 楼
家人 [专家分:6760] 发布于 2007-04-30 15:53:00
我的意思是,我觉得要在代码中去判断数组是否有过redim很别扭,是不是整个思路上有问题。
如果一定要这样,感觉shigx的方法似乎更恰当一点, 有时候on error resume next还是有一定危险性的
9 楼
靠VB吃饭的人 [专家分:5840] 发布于 2007-04-30 17:28:00
说得对,确实是有一定危险,毕竟我无法考虑到所有其它错误.
10 楼
天天学习 [专家分:4570] 发布于 2009-03-19 16:20:00
帖子是2007年的,到09年再被翻出来,呵呵
可以用
Private Declare Function SafeArrayGetDim Lib "oleaut32.dll" (ByRef saArray() As Any) As Long
来判断。返回值为0表示没有初始化过。不过,如果Redim之后再用Erase操作,这个函数也会返回0。
Option Explicit
Private Declare Function SafeArrayGetDim Lib "oleaut32.dll" (ByRef saArray() As Any) As Long
Private Sub Command1_Click()
Dim a() As String
Debug.Print IsEmpty(a), IsNull(a), SafeArrayGetDim(a) 'False,False,0
ReDim a(0) As String
Debug.Print UBound(a), SafeArrayGetDim(a) ' 0, 非零值
Erase a
Debug.Print SafeArrayGetDim(a) ' 0
End Sub
关于用on error resume next ,在捕捉并处理错误之后再用on error goto 0把错误处理关闭了就行了。
On Error Resume Next
Debug.Print 5 / 0 'error
if err then Debug.Print "发生了错误"
on error goto 0 '关闭错误处理
如果有其它的错误处理过程,也可恢复为其它的错误处理
On Error GoTo errHandler
On Error Resume Next
Debug.Print 5 / 0 'error
If Err Then Debug.Print err.description
On Error GoTo errHandler
Debug.Print 5 / 0
Exit Sub
errHandler:
Debug.Print Err.Description
我来回复