Array Descriptors

Modified March 2016; minor edits

XTREE enhancement: array descriptors. Provides an alternate method of specifying the answer and data arrays, using the following structure as defined in XTREE.SDF in SOSLIB:[907,16]:

DEFSTRUCT ST_XTRARYDESC    ! [136] array descriptor

    map2 BASEADDR64             ! [136] address of base of array

        map3 BASEADDR'LO,B,4    ! [136] low 32 bits

        map3 BASEADDR'HI,B,4    ! [136] hi 32 bits (for 64 bit mode future)

    map2 LOADFROM,B,4           ! [136] element # to start loading from (base 1)

    map2 FLAGS,B,4              ! [136] misc flags

    map2 WIDTH,B,4              ! [136] array width

    map2 TOTROWS,B,4            ! [136] total rows in ENTIRE array

ENDSTRUCT

 

To retrieve the address of the base of the array (and for convenience, the width as well), use XCALL GETADR as follows:

MAP1 xtary'desc,ST_XTRARYDESC

MAP1 xtary(5000),S,99

 

xcall GETADR, xtary(1), xtary'desc.BASEADDR64, xtary'desc.WIDTH

 

That would load the BASEADDR64 and WIDTH members of the structure. You can get the total number of elements using the .EXTENT() function:

xtary'desc.TOTROWS = .EXTENT(xtary())

Then just specify the desired starting row with an assignment:

xtary'desc.LOADFROM = 1     ! start loading from 1st element

This descriptor structure can then be used in place of the data or answer array, e.g.:

XCALL XTREE, srow, scol, answer, xtary'desc, itemcount, coldef, ...

Note that you still need to set the ITEMCOUNT parameter to the number of rows to be loaded, just as you normally would. (The TOTROWS member of the descriptor is just there as a safety check against accidentally trying to load more rows than exist. (Either way, XTREE has to trust you on the total size of the array, but if you use the .EXTENT() function as shown above, it should be easy to avoid mistakes there.)

The ST_XTRARYDESC structure definition has been added to ASHINC:XTREE.SDF

History

2012 June, A-Shell 6.1.1307:  XTREE Array descriptors added to A-Shell.