Trailing-Edge
-
PDP-10 Archives
-
decuslib10-01
-
43,50106/fake.txt
There are 2 other files named fake.txt in the archive. Click here to see a list.
NUCLEAR PHYSICS LABORATORY
OXFORD.
O.E.G. COMPUTER INFORMATION SHEET #10
FEBRUARY 1970
DYNAMICALLY DIMENSIONED ARRAYS
------------------------------
AN OFTEN SERIOUS LIMITATION OF THE FORTRAN IV LANGUAGE
IS THAT ARRAYS MUST BE DIMENSIONED AT COMPILE TIME. MANY PROGRAMS
ARE RUN IN FAR MORE CORE THAN IS NECESSARY BECAUSE ARRAYS HAVE
DIMENSIONS TO FIT THE LARGEST POSSIBLE ARRAYS WHICH MAY BE ENCOUNTERED.
E.G. AN ARRAY IS MADE LARGE ENOUGH TO HOLD AN 8K SPECTRA WHILE
USUALLY SPECTA OF ONLY 1 OR 2 K ARE PROCESSED.
A SYSTEM OF DYNAMICALLY DIMENSIONED ARRAYS HAS BEEN DEVISED
WHICH SHOULD IN MOST CASES BE APPLICABLE BUT WHICH HAVE SOME RESTICTONS.
THESE RESTRICTIONS ARE:
1. A DYNAMICALLY DIMENSIONED ARRAY MAY BE ACCESSED AS AN ARRAY ONLY IN
A SUBROUTINE OF THE PROGRAM IN WHICH IT IS DIMENSIONED.
2. A SUBROUTINE REFERENCING SUCH AN ARRAY MUST BE CALLED THROUGH
A SPECIAL SUBROUTINE CALLED 'FAKE'.
3. ALTHOUGH THE ROUTINES INCLUDE PROVISIONS FOR RECLAIMING CORE,
THERE ARE RESTRICTION ON THE SETTING UP OF DEVICE BUFFERS WHEN
THESE ROUTINES ARE USED.
4. THE ROUTINES WILL ATTEMPT TO EXPAND THE USER'S CORE WHEN
NECESSARY, HOWEVER WITHOUT A SWAPPING SYSTEM THIS IS NOT ALWAYS
POSSIBLE.
5. THE DIMENSIONS OF DYNAMIC ARRAYS MUST BE DEFINED IN THE
SUBROUTINES WHERE THEY ARE REFERENCED WITH ARGUMENTS IN THE CALLING
STRING.
A) SUBROUTINE DYNDIM
-----------------
THE MONITOR STORES THE ADDRESS OF THE FIRST FREE LOCATION
OF THE USER'S CORE AREA IN 'JOBFF'. THIS ROUTINE ASSIGNS CORE
TO AN ARRAY STARTING AT THIS ADDRESS. IT UPDATES 'JOBFF' TO
POINT TO THE FIRST LOCATION PAST THIS ARRAY.
CALLING SEQUENCE:
CALL DYNDIM(ARRAY,ID,IFLAG)
WHERE ARRAY IS A DUMMY ARRAY NAME
ID IS THE NO OF WORDS REQUIRED FOR THE ARRAY
IFLAG RETURNS TO THE USER
=0 IF THE ARRAY IS O.K.
=-1 IF NO CORE WAS AVAILABLE
=+1 IF ID WAS < OR = 0.
THE ROUTINE PLACES THE ADDRESS OF THE FIRST WORD ON THE ARRAY
IN 'ARRAY', WHERE IT CAN BE FOUND BY 'FAKE'.
THE SUBROUTINE WILL TYPE THE FOLLOWING ERROR MESSAGES FOR THE
ERROR RETURNS.
1. 'NO CORE AVAILABLE' IF, ON AN ATTEMP TO EXPAND CORE TO MAKE
ROOM FOR THE ARRAY, NO CORE WAS AVAILABLE.
2. 'CORE AVAILABLE, BUT NOT TO YOU' IF, ON AN ATTEMPT TO EXPAND
CORE, THE REQUEST WAS NOT GRANTED BECAUSE EITHER IT WOULD
EXCEED THE MAXIMUM CORE ALLOWED TO A USER (15K), OR ANOTHER
PROGRAM WAS SITED IMMEDIATELY ABOVE THE USER PREVENTING CORE
EXPANSION.
3. 'ARRAY LENGTH < OR = 0 REQUESTED'.
N.B. THERE IS NO RESTRICTION OF THE ORDER OF THE ARRAY, OR THE
NUMBER OF ARRAYS WHICH MAY BE DYNAMICALLY DIMENSIONED.
C) SUBROUTINE FAKE
---------------
THIS ROUTINE IS AN INTERMEDIATE ROUTINE BETWEEN A PROGRAM WHERE
A DYNAMIC ARRAY IS DIMENSIONED AND THE SUBROUTINE WHERE THE ARRAY
IS REFERENCED. IT ISSUES A CALL TO THE USERS SUBROUTINE
REPLACING THE ARRAY DUMMIES WITH THE ADDRESSES OF THE ARRAYS
CONTAINED IN THE ARRAY DUMMIES.
CALLING SEQUENCE:
CALL FAKE(I,J,SUBPR,ARRAY1,ARRAY2......ARG1,ARG2,ARG3....)
WHERE I IS THE NUMBER OF DYNAMIC ARRAY DUMMIES, ARRAYN
J IS THE TOTAL NUMBER OF ARGUMENTS FOR THE SUBROUTINE CALL TO
GENERATED BY FAKE.
SUBPR IS THE SUBROUTINE NAME, DEFINED IN THE FORTRAN PROGRAM
IN AN EXTERNAL STATEMENT.
ARRAYN ARE THE DYNAMICALLY DIMENSIONED ARRAY DUMMIES
ARGN ARE THE REST OF THE ARGUMENTS NEEDED FOR THE SUBROUTINE CALL
FAKE WILL GENERATE THE FOLLOWING CALL STRING
CALL SUBPR(ARADR1,ARADR2.....ARG1,ARG2,ARG3...)
WHERE 'ARADRN' ARE THE ARRAY ADDRESSES WHICH WERE PLACED IN THE
ARRAY DUMMIES 'ARRAYN' BY 'DYNDIM'.
THE MAXIMUM NUMBER OF ARGUMENTS IN THE FINAL CALL STRING (I.E. THE
MAXIMUM VALUE OF J) IS 20.
D) SUBROUTINE SETJFF
-----------------
THIS ROUTINE ALLOWS A USER TO SAVE AND RESTORE THE ADDRESS OF
THE FIRST FREE LOCATION IN THE USERS AREA (JOBFF).
CALLING SEQUENCE:
CALL SETJFF(NCOR)
WHERE NCOR=0 CAUSES JOBFF TO BE SAVED, AND NCOR TO BE RETURNED
NON-ZERO.
NCOR NON-ZERO CAUSES JOBFF TO BE RESTORED TO ITS SAVED VALUE.
DEVICE BUFFERS ARE ALSO SET UP AT RUN TIME WITH REFERENCE TO JOBFF.
FOR THIS REASON ANY DEVICE WHICH HAS SET UP BUFFERS AFTER JOBFF
HAS BEEN SAVED, MUST BE RELEASED BEFORE JOBFF IS RESTORED.
IN FORTRAN IV BUFFERS ARE SET UP FOR A DEVICE WHEN IT IS FIRST
REFERENCED OR BY CALLING THE LIBRARY ROUTINE 'BUFFER'.
EXAMPLE
-------
.
.
.
DIMENSION NDATA(10)
C DUMMY ARRAY NAMES FOR TEN SLICES
EXTERNAL SRTWR
C SUBROUTINE NAME
NCOR=0
ILPT=3
10 CALL BUFFER(ILPT,2,2)
C SET UP TWO RING BUFFER FOR OUPUT ON ILPT TO PREVENT COMPLICATIONS
C IN RECOVERING ARRAY SPACE
20 CALL SETJFF(NCOR)
C SAVE AND RESTORE JOBFF.
C SAVE JOBFF FIRST TIME THROUGH (NCOR=0), AFTER THAT RESTORE JOBFF(NCOR=1)
.
.
.
DO 2000 I=1,NUMSL
.
.
.
CALL DYNDIM(NDATA(I),IDIM(I),IFLAG)
C SET UP A DIFFERENT ARRAY FOR EACH SLICE
IF(IFLAG.LT.0) GO TO......
C CORE NOT AVAILABLE?
IF(IFLAG.EQ.1)GO TO.......
C DIMENSION < OR = 0?
.
.
.
2000 CONTINUE
.
.
.
DO 2020 I=1,NUMSL
CALL FAKE(1,4,SRTWR,NDATA(I),IDIM(I),NAME(I),I)
C OUTPUT CONTENTS OF SLICE ARRAYS
2020 CONTINUE
.
.
.
GO TO 20
.
.
**********************************************************************