title: how to write wrapper for 'allocate'
body: <p>I am trying to write a wrapper for 'allocate' function, i.e. function which receives an array and dimensions, allocates memory and returns allocated array. The most important thing is that the function must work with arrays of different rank. But I have to explicitly state rank of array in function interface, and in this case code only compiles if I pass arrays of certain rank as a parameter. For example, this code does not compile:</p>
  
  <pre><code>module memory_allocator
  contains 
  
    subroutine memory(array, length)
      implicit none
  
      real(8), allocatable, intent(out), dimension(:) :: array
      integer, intent(in) :: length
  
      integer :: ierr
  
      print *, "memory: before: ", allocated(array)
  
      allocate(array(length), stat=ierr)
      if (ierr /= 0) then
        print *, "error allocating memory: ierr=", ierr
      end if
  
      print *, "memory: after: ", allocated(array)
  
    end subroutine memory
  
    subroutine freem(array)
      implicit none
  
      real(8), allocatable, dimension(:) :: array
  
      print *, "freem: before: ", allocated(array)
      deallocate(array)
      print *, "freem: after: ", allocated(array)
  
    end subroutine freem
  
  end module memory_allocator
  
  program alloc
    use memory_allocator
    implicit none
  
    integer, parameter :: n = 3
    real(8), allocatable, dimension(:,:,:) :: foo
    integer :: i, j, k
  
    print *, "main: before memory: ", allocated(foo)
    call memory(foo, n*n*n)
    print *, "main: after memory: ", allocated(foo)
  
    do i = 1,n
      do j = 1,n
        do k = 1, n
          foo(i, j, k) = real(i*j*k)
        end do
      end do
    end do
  
    print *, foo
  
    print *, "main: before freem: ", allocated(foo)
    call freem(foo)  
    print *, "main: after freem: ", allocated(foo)
  
  end program alloc
  </code></pre>
  
  <p>Compilation error:</p>
  
  <pre><code>gfortran -o alloc alloc.f90 -std=f2003
  alloc.f90:46.14:
  
    call memory(foo, n*n*n)
                1
  Error: Rank mismatch in argument 'array' at (1) (1 and 3)
  alloc.f90:60.13:
  
    call freem(foo)  
               1
  Error: Rank mismatch in argument 'array' at (1) (1 and 3)  
  </code></pre>
  
  <p>Is there any way of implementing such wrapper?..</p>
  
  <p>Thanks!</p>