# Assumed-Shape Specifications

An assumed-shape array is a dummy argument array that assumes the shape of its associated actual argument array. An assumed-shape specification takes the following form:

([dl]:[, [dl]:] ...)

dl | Is a specification expression indicating the lower bound of the dimension. The expression can have a positive, negative, or zero value. If necessary, the value is converted to integer type. If the lower bound is not specified, it is assumed to be 1.

The rank of the array is the number of colons (:) specified.

The value of the upper bound is the extent of the corresponding dimension of the associated actual argument array + lower-bound - 1.

## Examples

The following is an example of an assumed-shape specification:

    INTERFACE
      SUBROUTINE SUB(M)
        INTEGER M(:, 1:, 5:)
      END SUBROUTINE
    END INTERFACE
    INTEGER L(20, 5:25, 10)

    CALL SUB(L)
    SUBROUTINE SUB(M)
      INTEGER M(:, 1:, 5:)
    END SUBROUTINE

Array `M` has the same extents as array `L`, but array `M` has bounds (1:20, 1:21, 5:14).

Note that an explicit interface is required when calling a routine that expects an assumed-shape or pointer array.

Consider the following:

     SUBROUTINE ASSUMED(A)
       REAL A(:, :, :)

Array `A` has rank 3, indicated by the three colons (:) separated by commas (,). However, the extent of each dimension is unspecified. When the subroutine is called, `A` takes its shape from the array passed to it. For example, consider the following:

     REAL X (4, 7, 9)
     ...
     CALL ASSUMED(X)

This declaration gives `A` the dimensions (4, 7, 9). The actual array and the assumed-shape array must have the same rank.

Consider the following:

     SUBROUTINE ASSUMED(A)
       REAL A(3:, 0:, -2:)
     ...

If the subroutine is called with the same actual array `X`(4, 7, 9), as in the previous example, the lower and upper bounds of `A` would be:

    A(3:6, 0:6, -2:6)

Parent topic: Declarations for Arrays