array variable, it inherits the lower bounds of the variable, otherwise, the lower bounds default to 1. Fortran 2003 allows specifying arbitrary lower bounds on pointer association, like window(r:,s:) => table(m:n,p:q) so that the bounds of window become r:r+n-m,s:s+q-p. Fortran 95 does not have this feature; however, it can be simulated using the following trick (based on the pointer association rules for assumed shape array dummy arguments): FUNCTION remap_bounds2(lb1,lb2,array) RESULT(ptr) INTEGER, INTENT(IN) :: lb1,lb2 REAL, DIMENSION(lb1:,lb2:), INTENT(IN), TARGET :: array REAL, DIMENSION(:,:), POINTER :: ptr ptr => array END FUNCTION : window => remap_bounds2(r,s,table(m:n,p:q)) The source code of an extended example of the use of pointers to support a data structure is in pointer.f90. Intrinsic procedures Most of the intrinsic functions have already been mentioned. Here, we deal only with their general classification and with those that have so far been omitted. All intrinsic procedures can be used with keyword arguments: CALL DATE_AND_TIME (TIME=t) and many have optional arguments. The intrinsic procedures are grouped into four categories: elemental - work on scalars or arrays, e.g. ABS(a); inquiry - independent of value of argument (which may be undefined), e.g. PRECISION(a); transformational - array argument with array result of different shape, e.g. RESHAPE(a, b); subroutines, e.g. SYSTEM_CLOCK. The procedures not already introduced are Bit inquiry BIT_SIZE Number of bits in the model Bit manipulation BTEST Bit testing IAND Logical AND IBCLR Clear bit IBITS Bit extraction IBSET Set bit IEOR Exclusive OR IOR Inclusive OR ISHFT Logical shift ISHFTC Circular shift NOT Logical complement Transfer function, as in INTEGER :: i = TRANSFER('abcd', 0) (replaces part of EQUIVALENCE) Subroutines DATE_AND_TIME Obtain date and/or time MVBITS Copies bits RANDOM_NUMBER Returns pseudorandom numbers RANDOM_SEED Access to seed SYSTEM_CLOCK Access to system clock CPU_TIME Returns processor time in seconds Data transfer (This is a subset only of the actual features and, exceptionally, lower case is used in the code examples.) Formatted input/output These examples illustrate various forms of I/O lists with some simple formats (see below): integer :: i real, dimension(10) :: a character(len=20) :: word print "(i10)", i print "(10f10.3)", a print "(3f10.3)", a(1),a(2),a(3) print "(a10)", word(5:14) print "(3f10.3)", a(1)*a(2)+i, sqrt(a(3:4)) Variables, but not expressions, are equally valid in input statements using the read statement: read "(i10)", i If an array appears as an item, it is treated as if the elements were specified in array element order. Any pointers in an I/O list