dimension attribute on an object specifies that that object is an array. There are, in Fortran 2008, five array natures:1
Take the three rank-1 arrays2
integer a, b, c dimension(5) a ! Explicit shape (default lower bound 1), extent 5 dimension(:) b ! Assumed or deferred shape dimension(*) c ! Assumed size or implied shape array
With these it can be seen that further context is required to determine fully the nature of an array.
An explicit shape array is always the shape of its declaration. Unless the array is declared as local to a subprogram or
block construct, the bounds defining shape must be constant expressions. In other cases, an explicit shape array may be an automatic object, using extents which may vary on each invocation of a subprogram or
subroutine sub(n) integer, intent(in) :: n integer a(5) ! A local explicit shape array with constant bound integer b(n) ! A local explicit shape array, automatic object end subroutine
An assumed shape array is a dummy argument without the
pointer attribute. Such an array takes its shape from the actual argument with which it is associated.
integer a(5), b(10) call sub(a) ! In this call the dummy argument is like x(5) call sub(b) ! In this call the dummy argument is like x(10) contains subroutine sub(x) integer x(:) ! Assumed shape dummy argument end subroutine sub end
When a dummy argument has assumed shape the scope referencing the procedure must have an explicit interface available for that procedure.
An assumed size array is a dummy argument which has its size assumed from its actual argument.
subroutine sub(x) integer x(*) ! Assumed size array end subroutine
Assumed size arrays behave very differently from assumed shape arrays and these differences are documented elsewhere.
A deferred shape array is an array which has the
pointer attribute. The shape of such an array is determined by its allocation or pointer assignment.
integer, allocatable :: a(:) integer, pointer :: b(:)
An implied shape array is a named constant which takes its shape from the expression used to establish its value
integer, parameter :: a(*) = [1,2,3,4]
The implications of these array declarations on dummy arguments are to be documented elsewhere.
1A Technical Specification extending Fortran 2008 adds a sixth array nature: assumed rank. This is not covered here.
2 These can equivalently be written as
integer, dimension(5) :: a integer, dimension(:) :: b integer, dimension(*) :: c
integer a(5) integer b(:) integer c(*)