我可以在Fortran中使用可分配数组作为intent(out)矩阵吗?

时间:2018-01-27 03:56:23

标签: arrays fortran fortran95

考虑以下子程序

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中可以做到这一切吗?

2 个答案:

答案 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
!!!!!!!!!!!!!!!!!!!