home *** CD-ROM | disk | FTP | other *** search
- ############################################################################
- #
- # File: array.icn
- #
- # Subject: Procedures for n-dimensional arrays
- #
- # Author: Ralph E. Griswold
- #
- # Date: August 23, 1992
- #
- ###########################################################################
- #
- # create_array([lbs], [ubs], value) creates a n-dimensional array
- # with the specified lower bounds, upper bounds, and with each array element
- # having the specified initial value.
- #
- # ref_array(A, i1, i2, ...) references the i1-th i2-th ... element of A.
- #
- ############################################################################
-
- record array(structure, lbs)
-
- procedure create_array(lbs, ubs, value)
- local lengths, i
-
- if (*lbs ~= *ubs) | (*lbs = 0) then stop("*** bad specification")
-
- lengths :=list(*lbs)
-
- every i := 1 to *lbs do
- lengths[i] := ubs[i] - lbs[i] + 1
-
- return array(create_struct(lengths, value), lbs)
-
- end
-
- procedure create_struct(lengths, value)
- local A
-
- lengths := copy(lengths)
-
- A := list(get(lengths), value)
-
- if *lengths > 0 then
- every !A := create_struct(lengths, value)
-
- return A
-
- end
-
- procedure ref_array(A, subscrs[])
- local lbs, i
-
- if *A.lbs ~= *subscrs then
- stop("*** bad specification")
-
- lbs := A.lbs
- A1 := A.structure
-
- every i := 1 to *subscrs - 1 do
- A1 := A1[subscrs[i] - lbs[i] + 1] | fail
-
- return A1[subscrs[-1] - lbs[-1] + 1]
-
- end
-