Zero-length arrays in VBScript
arrays, vbscript
Solution
For:
Dim arr1 : arr1 = Array()
Dim arr2
Dim arr3 : ReDim arr3(1) : Erase arr3
WScript.Echo UBound(arr1)
WScript.Echo UBound(arr2)
WScript.Echo UBound(arr3)
Will return -1 for arr1, but "VBScript runtime error: Subscript out of range: 'UBound'" for arr2 and arr3.
A general purpose function to test if an array is "Dimmed" or "Empty" should also (probably) test if the variable is actually an array.
Function IsDimmedArray(arrParam)
Dim lintUBound : lintUBound = 0
Dim llngError : llngError = 0
IsDimmedArray = False
If Not IsArray(arrParam) Then : Exit Function
'' Test the bounds
On Error Resume Next
lintUBound = UBound(arrParam)
llngError = Err.Number
If (llngError <> 0) Then : Err.Clear
On Error Goto 0
If (llngError = 0) And (lintUBound >= 0) Then : IsDimmedArray = True
End Function ' IsDimmedArray(arrParam)
For me, 99% of the time when I am checking if an array is "Dimensioned", is if I need to get the UBound of the array and I want to prevent a runtime-error in the cases where the array is not dimensioned. So I will usually pass the UBound as a parameter like:
Function IsDimmedArray(arrParam, intUBoundParam)
intUBoundParam = 0
...
I don't know if this practice actually saves any "Time", but it does save 1 line of code with nearly every use, and is an easy way to enforce the practice of error checking.
Also, I include it for completeness, but in practice, the checking of "UBound >= 0" in IsDimmedArray:
If (llngError = 0) And (lintUBound >= 0) Then : IsDimmedArray = True
is typically not necessary because usually it will be used in cases like:
Dim arrX
Dim lintUBound
Dim intNdx
arrX = Array()
lintUBound = UBound(arrX)
WScript.Echo "arrX is an array with UBound=" & lintUBound
For intNdx = 0 to lintUBound
WScript.Echo "This will not print: " & intNdx
Next
So, in this case, lintUBound = -1 and the For ... Next will be skipped.
Problem
I have to do some ASP work and I found out that the language doesn't provide a way to detect zero-length arrays (well, I suppose you can detect the exception they throw when you try to use them...). Why would Split() return an empty array if there isn't any sane way to handle it? Or am I missing something? I concocted the following hack to detect empty arrays, but there has to be an easier way. Which is it? TIA ``` function ArrayEmpty (a) dim i, res res = true for each i in a res = false exit for next ArrayEmpty = res end function ```