J'essaie d'écrire un wrapper pour la fonction 'allocate', c'est-à-dire une fonction qui reçoit un tableau et des dimensions, alloue de la mémoire et retourne un tableau alloué. La chose la plus importante est que la fonction doit fonctionner avec des tableaux de rang différent. Mais je dois indiquer explicitement le rang de tableau dans l'interface de fonction, et dans ce cas le code compile seulement si je passe des tableaux de certain rang en tant que paramètre. Par exemple, ce code ne compile pas:comment écrire un wrapper pour 'allouer'
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
erreur de compilation:
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)
Est-il possible de mettre en œuvre cette enveloppe ..
Merci à!
Merci beaucoup! Bien qu'il nécessite la duplication de code dans le module allocateur, au moins je peux utiliser le nom commun quand j'appelle cette fonction d'allocateur. C'est ce que je voulais. – robusta