April 27, 2024, 05:14:30 PM

News:

IonicWind Snippit Manager 2.xx Released!  Install it on a memory stick and take it with you!  With or without IWBasic!


Automatic Resizing Array

Started by danbaron, January 10, 2010, 04:11:38 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

danbaron

January 10, 2010, 04:11:38 PM Last Edit: January 10, 2010, 04:46:45 PM by danbaron
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

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

'---------------------------------------------------------
'---------------------------------------------------------

"You can't cheat an honest man. Never give a sucker an even break, or smarten up a chump."  -  W.C. Fields

JoaoAfonso

Does EB accept .length sufix in arrays? If yes, all that code can be updated to just like 3 or 4 lines of code.
JoÃÆ'ƒÂÃ,£o Afonso
Viriato
-----------------
Iberia MUD
www.iberiamud.com
iberiamud.com:5900

LarryMc

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
LarryMc
Larry McCaughn :)
Author of IWB+, Custom Button Designer library, Custom Chart Designer library, Snippet Manager, IWGrid control library, LM_Image control library