我想知道在现代 Fortran 中是否可以使用它自己或它的一部分来分配一个可分配的数组来做到这一点。这是一个简单的例子:
module modu
implicit none
type :: t
integer :: i
end type
contains
subroutine assign(a,b)
type(t), allocatable, intent(out) :: a(:)
type(t), intent(in) :: b
allocate(a(1))
a(1) = b
end subroutine
end module
!----------------------
program test
use modu
implicit none
type(t), allocatable :: a(:)
allocate(a(1))
a(1)%i = 2
call assign(a, a(1))
print*, a(1)%i
end program
此代码使用 ifort 18 给出正确答案,并使用 gfortran 7.4 返回“分段错误”。
注意:最初的问题有点复杂,因为call assign(a, a(1))
应该用call assign(a, a(1)+b)
operator + 正确重载来代替,但结论(尊重 ifort 和 gfortran)是相同的。
注意:在 fortran 重载赋值中的自赋值线程检查中,@IanH 区分了call assign(a,a)
和, call assign(a,(a))
但我相信它不能解决这个问题,因为我有可分配的参数。
注意:在 Fortran 分配时的线程自动数组分配中,@francescalus 解释了内在分配的自动分配,但我再次相信它不适用于这里。