考虑以下子程序
subroutine myProc(m,n,flag,X)
Integer, intent(in) :: m,n
logical, intent(in) :: flag
real(8), intent(out), allocatable :: X(:,:)
if (flag) then
allocate(X(m,n))
! some more code here
else
allocate(X(m-1,n))
! some more code here
end if
end subroutine myProc
!!!!!!!!!!!!!!!!!!!
另外,如何在程序中调用此过程?假设我写了
!... some code before
call myProc(5,6,.TRUE.,X)
我是否需要将X定义为(4,6)实数组或将可分配数组传递给子例程?
在Fortran 95中可以做到这一切吗?
答案 0 :(得分:1)
将可分配的伪参数传递给Fortran 2003及更高版本的子例程是完全可以的。 IIRC首先允许TS(技术规范)到Fortran 95。所有编译器今天都支持它。
传递给可分配的伪参数时,不必分配实际参数。如果碰巧被分配,它将在这里自动解除分配,因为在进入子例程时,虚拟符号intent(out)
和allocatable, intent(out)
参数会自动解除分配。
您的代码应该可以正常工作,但有一个重要方面,子例程必须具有显式接口。所以它必须放在一个模块中。或者它必须是内部的(contains
之后)或必须使用interface
块(丑陋)。
你可以在展示时调用它
call myProc(5,6,.TRUE.,X)
并且不必分配X
。
答案 1 :(得分:-3)
您可以将X放入模块中,在调用程序中声明它并将其分配到子例程中。使用这样的模块的任何程序,函数或子例程都引用相同的内存空间,因此这些变量甚至不作为参数传递。它看起来像这样:
module Global
real(8), allocatable :: X(:,:)
end module Global
program main
use Global
!... some code before
call myProc(5,6,.TRUE.)
end program main
subroutine myProc(m,n,flag)
use Global
Integer, intent(in) :: m,n
logical, intent(in) :: flag
if (flag) then
allocate(X(m,n))
! some more code here
else
allocate(X(m-1,n))
! some more code here
end if
end subroutine myProc
!!!!!!!!!!!!!!!!!!!