Estoy tratando de escribir un contenedor para la función 'allocate', es decir, la función que recibe un conjunto y las dimensiones, asigna memoria y devuelve el conjunto asignado. Lo más importante es que la función debe funcionar con matrices de diferente rango. Pero tengo que indicar explícitamente rango de matriz en la interfaz de función, y en este caso el código solo se compila si paso las matrices de cierto rango como un parámetro. Por ejemplo, este código no se compila: errorcómo escribir el contenedor para 'asignar'
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
Compilación:
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)
¿Hay alguna manera de poner en práctica tales envoltorio ..
Gracias?!
¡Muchas gracias! A pesar de que requiere la duplicación de código en el módulo de asignación, al menos puedo usar un nombre común cuando llamo a esta función de asignador. Esto es lo que yo quería. – robusta