An array is an ordered sequence of scalar data. All the elements of an array have the same type and type parameters.

A *whole array* is denoted by the name of the
array:

! In this declaration, the array is given a type and dimension REAL, DIMENSION(3) :: A ! In these expressions, each element is evaluated in each expression PRINT *, A, A+5, COS(A)

A whole array is either a named constant or a variable.

Each dimension in an array has an upper and lower bound, which determine the range of values that can be used as subscripts for that dimension. The bound of a dimension can be positive, negative, or zero.

+-------------------------------IBM Extension--------------------------------+

In XL Fortran, the bound of a dimension can be positive, negative or zero within the range -(2**31) to 2**31-1. The range for bounds in 64-bit mode is -(2**63) to 2**63-1.

+----------------------------End of IBM Extension----------------------------+

If any lower bound is greater than the corresponding upper bound,
the array is a *zero-sized* array, which has no elements but still
has the properties of an array. The lower and upper bounds of such a
dimension are one and zero, respectively.

When the bounds are specified in array declarators:

- The lower bound is a specification expression. If it is omitted, the default value is 1.
- The upper bound is a specification expression or asterisk (*), and has no default value.

**Related Information**:

- Specification Expressions
- LBOUND(ARRAY, DIM)
- UBOUND(ARRAY, DIM)

The *extent* of a dimension is the number of elements in that
dimension, computed as the value of the upper bound minus the value of the
lower bound, plus one.

INTEGER, DIMENSION :: X(5) ! Extent = 5 REAL :: Y(2:4,3:6) ! Extent in 1st dimension = 3 ! Extent in 2nd dimension = 4

The minimum extent is zero, in a dimension where the lower bound is greater than the upper bound.

+-------------------------------IBM Extension--------------------------------+

The theoretical maximum number of elments in an array is 2**31-1 elements in 32-bit mode, or 2**63-1 elements in XL Fortran 64-bit mode. Hardware addressing considerations make it impractical to declare any combination of data objects whose total size (in bytes) exceeds this value.

+----------------------------End of IBM Extension----------------------------+

Different array declarators that are associated by common, equivalence, or argument association can have different ranks and extents.

The *rank* of an array is the number of dimensions it has:

INTEGER, DIMENSION (10) :: A ! Rank = 1 REAL, DIMENSION (-5:5,100) :: B ! Rank = 2

According to Fortran 95, an array can have from one to seven dimensions.

+-------------------------------IBM Extension--------------------------------+

An array can have from one to twenty dimensions in XL Fortran.

+----------------------------End of IBM Extension----------------------------+

A scalar is considered to have rank zero.

The *shape* of an array is derived from its rank and
extents. It can be represented as a rank-one array where each element
is the extent of the corresponding dimension:

INTEGER, DIMENSION (10,10) :: A ! Shape = (/ 10, 10 /) REAL, DIMENSION (-5:4,1:10,10:19) :: B ! Shape = (/ 10, 10, 10 /)

The *size* of an array is the number of elements in it, equal to
the product of the extents of all dimensions:

INTEGER A(5) ! Size = 5 REAL B(-1:0,1:3,4) ! Size = 2 * 3 * 4 = 24

**Related Information**

- These examples show only simple arrays where all bounds are constants. For instructions on calculating the values of these properties for more complicated kinds of arrays, see the following sections.
- Related intrinsic functions are SHAPE(SOURCE), and SIZE(ARRAY, DIM). The rank of an array
`A`is`SIZE(SHAPE(A))`.