intent(out) 和可分配的 Fortran 数组:真正做了什么?

intent(out) and allocatable Fortran arrays: what is really done?

我在 Stack Overflow 上的许多帖子中读到,当将可分配数组传递到虚拟参数为 intent(out) 的子例程中时,它会被释放。

如果我考虑以下代码:

program main

 real, dimension(:), allocatable :: myArray
 integer :: L=8

 allocate(myArray(1:L))
 call initArray(myArray)
 print *, myArray
 
contains

 subroutine initArray(myArray)
 real, dimension(:), intent(out) :: myArray

 myArray(:) = 10.0
 
 end subroutine initArray
 
end program main

输出正确。因此,当发生释放时,内存被释放但数组形状保持不变。准确吗?任何详细的解释将不胜感激。

我阅读了有关该主题的不同帖子 (Can I use allocatable array as an intent(out) matrix in Fortran?, , ...)。所以我知道数组已被释放,但我想了解它是什么意思,因为在我的代码中,大小保持不变,我也很惊讶这段代码有效。

伪参数 可分配时,将发生释放。尝试

real, dimension(:), intent(out), allocatable :: myArray

实现这一目标。

主程序中的实际参数是可分配的这一事实并不重要。

我强烈建议对主程序中的数组和子程序中的参数进行不同的命名,以便更好地看出差异。

program main

 real, dimension(:), allocatable :: mainArray
 integer :: L=8

 allocate(mainArray(1:L))
 call initArray(mainArray)
 print *, mainArray
 
contains

 subroutine initArray(argArray)
 real, dimension(:), intent(out) :: argArray

 argArray(:) = 10.0
 
 end subroutine initArray
 
end program main

现在,mainArray实参argArray虚参。虚拟参数必须是可分配的才能发生释放。

你对这里发生的事情有点误解。

在使用 intent(out) 进入过程时释放的数组是那些对应于可分配虚拟对象的可分配数组。

intent(out) 对论证的意义完全取决于 dummy 而不是 actual 论证的特征。

对应于普通伪参数的可分配实际参数是释放的。 (如果是,则必须不分配不可分配的虚拟参数!)

相反,实际参数的分配状态保持不变,假定(未延迟)形状虚拟参数的形状保持不变。

虚拟参数变为未定义,作为 intent(out)。对于此处的普通伪参数,它仅指其值(在该赋值语句中立即定义)。