Ich versuche, einen Wrapper für "allocate" -Funktion zu schreiben, d. H. Funktion, die ein Array und Dimensionen erhält, Speicher reserviert und zugewiesenes Array zurückgibt. Das Wichtigste ist, dass die Funktion mit Arrays unterschiedlichen Ranges arbeiten muss. Aber ich muss explizit den Rang des Arrays in der Funktionsschnittstelle angeben, und in diesem Fall kompiliert der Code nur, wenn ich Arrays bestimmten Rangs als Parameter übergebe. Zum Beispiel ist dieser Code nicht kompilieren:Wie Wrapper für "allocate" schreiben
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
Übersetzungsfehler:
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)
Gibt es eine Möglichkeit, solche Wrapper zu implementieren ..
Dank!
Vielen Dank! Obwohl es Code-Duplizierung im Zuordnungsmodul erfordert, kann ich zumindest den allgemeinen Namen verwenden, wenn ich diese Zuweisungsfunktion aufruft. Das ist was ich wollte. – robusta