没有显式接口将未分配的数组传递给例程有什么问题吗?

mgi*_*son 5 fortran subroutine

考虑:

program main
real, allocatable, dimension(:) :: foo
integer n
n=10
call dofoo(foo,n,1)
allocate(foo(n))
call dofoo(foo,n,0)
end program main

subroutine dofoo(foo,n,mode)
real foo(n)
integer i,n,mode
if(mode.eq.1)then
   n=6
   return
endif
do i=1,n
   foo(i)=i
enddo
return
end subroutine dofoo
Run Code Online (Sandbox Code Playgroud)

上面的代码有什么问题吗?(它适用于gfortran)我第一次传入一个未分配的数组,但是我没有触及它 - 标准中是否有任何可能导致它以系统相关方式运行的东西?

Ian*_*ush 5

你差不多回答了自己的问题.是的,根据标准,如果您没有范围内的接口,则将未分配的可分配数组作为实际参数传递始终是非法的.

如果在范围内有接口,那么伪参数也是可分配的,这是合法的.

是的,我被它咬了.我的工作是在通话前分配到零大小.

  • 传输可分配的数组直到TR到F95标准才被清除.分配的状态和维度是可分配数组变量的_part_.这很重要,因为诸如intent(in)或intent(out)之类的东西不仅告诉你数组的_values_是否可以改变,而且它的大小或分配状态是否可以改变.如果没有显式接口,程序在传递可分配数组时必须假设最差 - 它甚至可能在返回时不知道大小.在通常的情况下,这是一个巨大的性能损失,所以决定一个人必须有明确的接口. (3认同)