Redim suggested additional example

Forum for discussion about the documentation project.
Post Reply
andykmv
Posts: 58
Joined: Feb 12, 2015 9:50

Redim suggested additional example

Post by andykmv »

getting my head around dim redim and redim preserve i thought an additonal example for the FBWiki : KeyPgRedim page may be useful.
here's my example and example output:

Code: Select all

'Example of using ReDim to resize a variable-length array

Type FileSpecs
    FilenameOnly as string 
    FilePathOnly as string
    FileSize as longint
    FileDate as double
    Index as integer
End type
Dim as Integer x = 0

'create an array as a variable-length array
Dim MyFileList(any) as FileSpecs		
Print "Lower and Upper boundaries before array size is set";lbound(MyFileList);" ";ubound(MyFileList)

'Use ReDim to set the bounds for the array
ReDim MyFileList(100) as FileSpecs 	
Print "Lower and Upper boundaries after array is sized: ";lbound(MyFileList);" ";ubound(MyFileList)

'we have more data to store coming up than the current size set by ReDim MyFileList(100) allows
for x=1 to 500
	if x>ubound(MyFileList) then 
		ReDim Preserve MyFileList(ubound(MyFileList)+50) As FileSpecs
        Print "Array resized to: ";lbound(MyFileList);" ";ubound(MyFileList)
	else
		MyFileList(x).Index=x
	endif
next x	
and the output :

Code: Select all

Lower and Upper boundaries before array size is set 0 -1
Lower and Upper boundaries after array is sized:  0  100
Array resized to:  0  150
Array resized to:  0  200
Array resized to:  0  250
Array resized to:  0  300
Array resized to:  0  350
Array resized to:  0  400
Array resized to:  0  450
Array resized to:  0  500
It's not elegant, but it illustrates how dynamic resizing can work to the uninitiated/inexperienced (although the type def could be removed and use Integer instead to simplify it a little more)
Last edited by andykmv on Apr 01, 2018 11:23, edited 1 time in total.
fxm
Moderator
Posts: 12107
Joined: Apr 22, 2009 12:46
Location: Paris suburbs, FRANCE

Re: Redim suggested additional example

Post by fxm »

Your example causes index field initialization holes for some array variables (for the index values 101, 151, 201, ...).
My corrected version:

Code: Select all

'Example of using ReDim to resize a variable-length array

Type FileSpecs
   FilenameOnly as string
   FilePathOnly as string
   FileSize as longint
   FileDate as double
   Index as integer
End type

'create an array as a variable-length array
Dim MyFileList(any) as FileSpecs      
Print "Lower and Upper boundaries before array size is set";lbound(MyFileList);" ";ubound(MyFileList)

'Use ReDim to set the bounds for the array
ReDim MyFileList(100)    
Print "Lower and Upper boundaries after array is sized: ";lbound(MyFileList);" ";ubound(MyFileList)

'we have more data to store coming up than the current size set by ReDim MyFileList(100) allows
for x as integer=1 to 500
   if x>ubound(MyFileList) then
      ReDim Preserve MyFileList(ubound(MyFileList)+50)
      Print "Array resized to: ";lbound(MyFileList);" ";ubound(MyFileList)
   endif
   MyFileList(x).Index=x
next x   
But what more brings this example compared to the two existing on the page REDIM?
andykmv
Posts: 58
Joined: Feb 12, 2015 9:50

Re: Redim suggested additional example

Post by andykmv »

@fxm, thanks for picking that up!

The last point in the ReDim notes talks about the use of Redim (resizing) with a complex expression, yet there is no example of resizing using a complex expression. The current examples use fixed values for the ReDim examples, therefore i thought an additional example using a complex expression may help to expand the understanding of the uses of ReDim on first read.

and i simplified the example so its more in keeping with existing examples

Code: Select all

'resizing a variable-length array using a complex expression
ReDim array(10) as integer
Dim as Integer x = 0
for x=1 to 100
	if x>ubound(array) then 
		ReDim Preserve array(ubound(array)+10)
        Print "Array resized to: ";ubound(array)
	endif
	array(x)=x
next x
fxm
Moderator
Posts: 12107
Joined: Apr 22, 2009 12:46
Location: Paris suburbs, FRANCE

Re: Redim suggested additional example

Post by fxm »

About the following sentence on the REDIM documentation page:
  • For use of ReDim (resizing) with a complex expression, (especially if the array expression itself contains parentheses), the array expression must be enclosed in parentheses in order to solve the parsing ambiguity.
Your provided example does not required additional parentheses surrounding the array expression like this :
  • Redim (array_expression)(lowerbound To upperbound)
I just added this example to the documentation (REDIM page):

Code: Select all

'' Define a variable-length array as UDT field
Type UDT
   Dim As Integer array(Any)
End Type

Dim As UDT u(0 To 3)

'' For use of Redim with a complex array expression
'' (especially if the array expression itself contains parentheses),
'' the array expression must be enclosed in parentheses
'' in order to solve the parsing ambiguity:
''    Redim u(0).array(0 To 9)
''    induces error 4: Duplicated definition, u in 'Redim u(0).array(0 To 9)'
ReDim (u(0).array)(0 To 9)
  • KeyPgRedim → fxm [Added example with complex array expression requiring enclosing parentheses]
Post Reply