Hi Gang!
Aurel's question (link) about REDIM, caused me to start thinking.
http://www.ionicwind.com/forums/index.php?topic=3838.msg30367;topicseen#new (http://www.ionicwind.com/forums/index.php?topic=3838.msg30367;topicseen#new)
Here is a simple class and test program (EB Console).
It is for an integer array that will automatically grow when an index is accessed that is beyond the array's current size.
I think the class could easily be changed to accommodate any data type, including UDTs.
(I don't have any patience lately. It could be messed up. But, it seems to work alright.)
DTB.
'---------------------------------------------------------
'---------------------------------------------------------
CLASS AUTOMATICINTARRAY
DECLARE INITIALIZE(INT INITSIZE)
DECLARE GETVALUE(INT INDEX), INT
DECLARE SETVALUE(INT INDEX, INT VALUE)
DECLARE SPECIFYSIZE(INT NEWSIZE)
DECLARE PRINTALLVALUES()
POINTER A
POINTER B
INT SWITCH
INT INITIALSIZE
INT CURRENTSIZE
ENDCLASS
'---------------------------------------------------------
SUB AUTOMATICINTARRAY::INITIALIZE(INT INITSIZE)
INITIALSIZE = INITSIZE
A = NEW(INT, INITIALSIZE)
CURRENTSIZE = INITIALSIZE
SWITCH = 0
ENDSUB
'---------------------------------------------------------
SUB AUTOMATICINTARRAY::GETVALUE(INT INDEX), INT
INT I
INT OLDCURRENTSIZE
IF INDEX <= CURRENTSIZE - 1
IF SWITCH = 0 THEN RETURN #<INT>A[INDEX]
IF SWITCH = 1 THEN RETURN #<INT>B[INDEX]
ENDIF
OLDCURRENTSIZE = CURRENTSIZE
'MAKE THE ARRAY GROW IN INCREMENTS OF INITIALSIZE.
WHILE CURRENTSIZE < (INDEX + 1)
CURRENTSIZE += INITIALSIZE
ENDWHILE
IF SWITCH = 0
B = NEW(INT, CURRENTSIZE)
FOR I = 0 TO OLDCURRENTSIZE - 1
#<INT>B[I] = #<INT>A[I]
NEXT I
DELETE(A)
SWITCH = 1
RETURN #<INT>B[INDEX]
ENDIF
IF SWITCH = 1
A = NEW(INT, CURRENTSIZE)
FOR I = 0 TO OLDCURRENTSIZE - 1
#<INT>A[I] = #<INT>B[I]
NEXT I
DELETE(B)
SWITCH = 0
RETURN #<INT>A[INDEX]
ENDIF
RETURN 0
ENDSUB
'---------------------------------------------------------
SUB AUTOMATICINTARRAY::SETVALUE(INT INDEX, INT VALUE)
INT I
INT OLDCURRENTSIZE
IF INDEX <= CURRENTSIZE - 1
IF SWITCH = 0
#<INT>A[INDEX] = VALUE
ELSE
#<INT>B[INDEX] = VALUE
ENDIF
RETURN
ENDIF
OLDCURRENTSIZE = CURRENTSIZE
'MAKE THE ARRAY GROW IN INCREMENTS OF INITIALSIZE.
WHILE CURRENTSIZE < (INDEX + 1)
CURRENTSIZE += INITIALSIZE
ENDWHILE
IF SWITCH = 0
B = NEW(INT, CURRENTSIZE)
FOR I = 0 TO OLDCURRENTSIZE - 1
#<INT>B[I] = #<INT>A[I]
NEXT I
#<INT>B[INDEX] = VALUE
DELETE(A)
SWITCH = 1
RETURN
ENDIF
IF SWITCH = 1
A = NEW(INT, CURRENTSIZE)
FOR I = 0 TO OLDCURRENTSIZE - 1
#<INT>A[I] = #<INT>B[I]
NEXT I
#<INT>A[INDEX] = VALUE
DELETE(B)
SWITCH = 0
RETURN
ENDIF
ENDSUB
'---------------------------------------------------------
SUB AUTOMATICINTARRAY::SPECIFYSIZE(INT NEWSIZE)
INT I
INT NUMVALUES = NEWSIZE
IF CURRENTSIZE < NEWSIZE THEN NUMVALUES = CURRENTSIZE
CURRENTSIZE = NEWSIZE
IF NEWSIZE = 0
IF SWITCH = 0 THEN DELETE(A)
IF SWITCH = 1 THEN DELETE(B)
RETURN
ENDIF
IF SWITCH = 0
B = NEW(INT, NEWSIZE)
FOR I = 0 TO NUMVALUES - 1
#<INT>B[I] = #<INT>A[I]
NEXT I
DELETE(A)
SWITCH = 1
RETURN
ENDIF
IF SWITCH = 1
A = NEW(INT, NEWSIZE)
FOR I = 0 TO NUMVALUES - 1
#<INT>A[I] = #<INT>B[I]
NEXT I
DELETE(B)
SWITCH = 0
RETURN
ENDIF
ENDSUB
'---------------------------------------------------------
SUB AUTOMATICINTARRAY::PRINTALLVALUES()
INT I
INT VALUE
STRING S1, S2, S3
PRINT
PRINT "INDEX VALUE"
PRINT
FOR I = 0 TO CURRENTSIZE - 1
VALUE = GETVALUE(I)
S1 = USING("0###", I)
S2 = USING("0###", VALUE)
S3 = APPEND$(" ", S1, " ", S2)
PRINT S3
NEXT I
ENDSUB
'---------------------------------------------------------
'---------------------------------------------------------
'TEST PROGRAM
INT I, V
INT INITNUM = 10
AUTOMATICINTARRAY AIA
'SET THE INITIAL SIZE.
AIA.INITIALIZE(INITNUM)
'SET THE INITIAL VALUES.
FOR I = 0 TO INITNUM - 1
AIA.SETVALUE(I, I)
NEXT I
'SET SOME MORE VALUES.
'THE ARRAY WILL AUTOMATICALLY GROW.
AIA.SETVALUE(14, 253)
AIA.SETVALUE(17, 429)
AIA.SETVALUE(26, 106)
AIA.SETVALUE(34, 3)
'PRINT OUT THE ARRAY VALUES.
AIA.PRINTALLVALUES()
'CHOP THE ARRAY OFF AT 23 ELEMENTS.
AIA.SPECIFYSIZE(23)
'PRINT OUT THE ARRAY VALUES AGAIN.
AIA.PRINTALLVALUES()
'SET ANOTHER VALUE.
'THE ARRAY WILL GROW AGAIN.
AIA.SETVALUE(49, 666)
'PRINT OUT THE ARRAY VALUES AGAIN.
AIA.PRINTALLVALUES()
'ASK FOR A VALUE WHOSE INDEX IS BEYOND THE RANGE OF THE ARRAY.
'THE ARRAY WILL GROW, AND RETURN THE UNSET VALUE OF ZERO.
V = AIA.GETVALUE(60)
'PRINT OUT THE ARRAY VALUES AGAIN.
AIA.PRINTALLVALUES()
INPUT I
END
'---------------------------------------------------------
'---------------------------------------------------------
Does EB accept .length sufix in arrays? If yes, all that code can be updated to just like 3 or 4 lines of code.
Quote from: JoaoAfonso on January 11, 2010, 05:05:56 AM
Does EB accept .length sufix in arrays? If yes, all that code can be updated to just like 3 or 4 lines of code.
No
Larry