Here's how a typical Fortran 77 program would manage an array whose size could vary at run time.
integer inmax parameter (inmax=100) real*8 array(inmax) . . !Some part of the code determines nmax . if (nmax.gt.inmax) then print*,'error: nmax.gt.inmax',nmax,inmax stop endifIf
nmax
is too small, the parameter statement must be changed
and the code recompiled.
Now, this same example with an allocatable array
integer :: inmax,error real*8, allocatable :: array(:) . . !Some part of the code determines nmax allocate(array(nmax),stat=error) if (stat.ne.0) then print*,'error: couldn't allocate memory for array, nmax=',nmax stop endifIn this version the size of
array
is limited only by the size
of available memory. Additionally, only the memory needed is actually used
(compared with the old method, where array
is always size
inmax
, no matter how much is used.)
To release this memory, use the deallocate
statement.
deallocate(array,stat=error) if (error.ne.0) then print*,'error in deallocating array' endif
pointer
(just like allocatable
). A pointer can be used in
an allocate statement just as if it had been declared allocatable.
Pointers seem to be needed in order to pass assumed shape arrays.
For instance,let us allocate an array in the main program and pass it to a subroutine.
program pointer real*8, pointer :: array(:,:) interface subroutine sub(array) real*8, pointer :: array(:,:) end subroutine end interface allocate(array(4,4)) call sub(array) end end program subroutine sub(array) real*8, pointer :: array(:,:)The interface block seems to be necessary to pass the array correctly.