[futurebasic] Re: [FB] Passing Arrays again...

Message: < previous - next > : Reply : Subscribe : Cleanse
Home   : October 2002 : Group Archive : Group : All Groups

From: Jay <jktr@...>
Date: Sat, 19 Oct 02 01:27:59 -0500
Hello FB-ers:
   I'm looking for the (a) way of passing arrays (and their bounds) to 
another function.  I believe that I have seen an example from Staz, but I 
cannot find it now.  I have tried all the permutations that I think of 
right off but none seem to work.  Short of making the array(s) global or 
using PEEK and POKE, I find that it is difficult to specify the name and 
bounds of the array when using handles, ptrs, or XREFs in that they all 
seem to require that the name and/or bounds be known to the calling 
and/or target FN at compile time. I'd like to be able to index the array  
in the Array(x,y) fashion at both ends of the call and return.
   I'm blocked.  I give up.  How should it be done?
   The snippet below is a silly but illustrative example.  Thank you 
(anyone) in advance for helping with this.   Hayden Coon

Hayden,

To work with 2-dimensional arrays, FB must know at compile time what size 
the array groups will be. That makes it impossible to use FB arrays that 
change size within a FN as you are trying to do.

The work-around is to calculate your own offsets into a 
single-dimensional array. The following code is not as pretty as what you 
wished for, but it gets the job done.

 e-e
 =J= a  y
  "

'Passing Arrays?

LOCAL FN PrintArrayAndModify(@address, length, wide)
DIM AS INT m, n
XREF genericArray(_maxlong) AS BYTE
genericArray = address
FOR m = 0 TO length
FOR n = 0 TO wide
PRINT genericArray((wide + 1) * m + n);
NEXT n
PRINT 'new line
NEXT m
genericArray((wide + 1) * 3 + 3) = 117 'modify array after printing
END FN

clear LOCAL FN LoadArrays
DIM First(4,3) AS BYTE
DIM Second(5,4) AS BYTE
DIM AS INT m,n

FOR m=1 TO 4
FOR n=0 TO 3
First(m,n) = 99
NEXT n
NEXT m

FOR m=0 TO 5
FOR n=1 TO 4
Second(m,n) = 11
NEXT n
NEXT m

//send them off for printing and check to see what we got
PRINT:PRINT " The First Array ="
FN PrintArrayAndModify(First(0,0),4,3)
PRINT "First(3,3)=";First(3,3)'should be 117

PRINT:PRINT " The Second Array ="
FN PrintArrayAndModify(Second(0,0),5,4)
PRINT "Second(3,3)=";Second(3,3)'should be 117

END FN

'~Main

WINDOW 1
FN LoadArrays

'-----------------
DO
HANDLEEVENTS
UNTIL 0
'-----------------