Jump to content
xisto Community
Sign in to follow this  
imacul8

Safe Ubound And Lbound

Recommended Posts

Ever wanted to use LBound and UBound to get arrays boundaries without jumping over error message when the array is empty? These functions will replace the ordinary LBound and UBound procedures so you dont need to worry about errors. I've also included a way to get the dimensions of an array. Just paste the following code into a module, and the problem is solved.

 

Inputs: SafeUBound and SafeLBound: [Address to the array], [What dimension you want to obtain]

ArrayDims: [Address To the array]

Returns: As expected from the ordinary functions, except that they will return -1 when the array is empty.

Assumes: You obtain the address to an array by passing it to the VarPtrArray API call. So if you want to get the boundaries of an array called aTmp, you need to call the functions like this:

lLowBound = SafeLBound(VarPtrArray(aTmp))

lHighBound = SafeUBound(VarPtrArray(aTmp))

lDimensions = ArrayDims(VarPtrArray(aTmp))

When dealing With String arrays that isn't allocated at design time, you *must* add the value 4 To the lpArray-paramenter:

lLowBound = SafeLBound(VarPtrArray(aString) + 4)

 

Side Effects: Since the return value is minus when the array is empty it's a big chance you will get problems with minus dimensioned arrays, but who use them anyway?

 

Option ExplicitDeclare Function VarPtrArray Lib "msvbvm50.dll" Alias "VarPtr" (Ptr() As Any) As LongDeclare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)Public Function SafeUBound(ByVal lpArray As Long, Optional Dimension As Long = 1) As Long	Dim lAddress&, cElements&, lLbound&, cDims%	If Dimension < 1 Then		SafeUBound = -1		Exit Function	End If	CopyMemory lAddress, ByVal lpArray, 4	If lAddress = 0 Then		' The array isn't initilized		SafeUBound = -1		Exit Function	End If	' Calculate the dimensions	CopyMemory cDims, ByVal lAddress, 2	Dimension = cDims - Dimension + 1	' Obtain the needed data	CopyMemory cElements, ByVal (lAddress + 16 + ((Dimension - 1) * 8)), 4	CopyMemory lLbound, ByVal (lAddress + 20 + ((Dimension - 1) * 8)), 4	SafeUBound = cElements + lLbound - 1End FunctionPublic Function SafeLBound(ByVal lpArray As Long, Optional Dimension As Long = 1) As Long	Dim lAddress&, cElements&, lLbound&, cDims%	If Dimension < 1 Then		SafeLBound = -1		Exit Function	End If	CopyMemory lAddress, ByVal lpArray, 4	If lAddress = 0 Then		' The array isn't initilized		SafeLBound = -1		Exit Function	End If	' Calculate the dimensions	CopyMemory cDims, ByVal lAddress, 2	Dimension = cDims - Dimension + 1	' Obtain the needed data	CopyMemory lLbound, ByVal (lAddress + 20 + ((Dimension - 1) * 8)), 4	SafeLBound = lLboundEnd FunctionPublic Function ArrayDims(ByVal lpArray As Long) As Integer	Dim lAddress As Long	CopyMemory lAddress, ByVal lpArray, 4	If lAddress = 0 Then		' The array isn't initilized		ArrayDims = -1		Exit Function	End If	CopyMemory ArrayDims, ByVal lAddress, 2End Function

Hope this solves any problems u have of getting errors with empty arrays. <_<

 

Notice from BuffaloHELP:
Plagiarism is never tolerated in Xisto forum. If you're going to copy the program code, do not leave out the copyright statement! This code is copyrighted. Source http://forums.xisto.com/no_longer_exists/

Edited by BuffaloHELP (see edit history)

Share this post


Link to post
Share on other sites

I was just about to write it was copied from PSC, but BuffaloHELP got here before me <_<

Anyways, this code is good, since it uses Windows API, but this same code can be written in pure VB, with just a little error handling :D

Here it is:

Private Function SafeLBound() As LongOn Local Error GoTo SafeLBound_ErrSafeLBound = LBound(Niz)SafeLBound_Exit:Exit FunctionSafeLBound_Err:If Err.Number = 9 Then SafeLBound = -1Resume SafeLBound_ExitEnd FunctionPrivate Function SafeUBound() As LongOn Local Error GoTo SafeUBound_ErrSafeUBound = UBound(Niz)SafeUBound_Exit:Exit FunctionSafeUBound_Err:If Err.Number = 9 Then SafeUBound = -1Resume SafeUBound_ExitEnd Function
This code will work only with project-level, or form/module-level arrays, since building a function that checks arrays, would require a function for each data-type in Visual Basic, because useing arrays as function or procedure parameters, requires passinge them by refference (ByRef), so you can for example declare input parameter as array of variants, and pass array of strings... That would cause another run-time error :P

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...

Important Information

Terms of Use | Privacy Policy | Guidelines | We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.