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)
。对于此处的普通伪参数,它仅指其值(在该赋值语句中立即定义)。
我在 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)
。对于此处的普通伪参数,它仅指其值(在该赋值语句中立即定义)。