具有重载分配的自动 LHS 重新分配
Automatic LHS reallocation with overloaded assignment
我有一个代码,在对 LHS 上的未分配可分配对象进行赋值时,我手头的所有编译器都会出现段错误,而 RHS 上有结构构造函数。结构(派生类型)本身具有重载赋值。我认为,LHS 的自动重新分配应该在调用分配例程之前发生,但似乎并非如此。
在代码下方,演示了问题。取消注释 allocate 语句使一切正常,但我不明白,为什么在这种情况下需要显式分配。有趣的是,如果我删除重载的分配,事情也会正常进行。
有什么提示吗?
module dummy
implicit none
type :: DummyType
integer :: ii
contains
procedure :: assignDummyType
generic :: assignment(=) => assignDummyType
end type DummyType
interface DummyType
module procedure DummyType_init
end interface DummyType
contains
function DummyType_init(initValue) result(this)
integer, intent(in) :: initValue
type(DummyType) :: this
this%ii = initValue
end function DummyType_init
subroutine assignDummyType(this, other)
class(DummyType), intent(out) :: this
type(DummyType), intent(in) :: other
this%ii = other%ii + 1
end subroutine assignDummyType
end module dummy
program test_dummy
use dummy
implicit none
type(DummyType), allocatable :: aa
!allocate(aa) ! Should be covered via automatic reallocation...
aa = DummyType(42)
end program test_dummy
有一个 recent discussion on comp.lang.fortran 处理这个主题。
赋值语句是内部赋值或定义赋值。内部赋值允许[重新]分配左侧,定义的赋值不允许。
当你为一个程序提供赋值通用标识符时,你的赋值就是定义赋值。对应于左侧的参数的特征则要求分配左侧。
我有一个代码,在对 LHS 上的未分配可分配对象进行赋值时,我手头的所有编译器都会出现段错误,而 RHS 上有结构构造函数。结构(派生类型)本身具有重载赋值。我认为,LHS 的自动重新分配应该在调用分配例程之前发生,但似乎并非如此。
在代码下方,演示了问题。取消注释 allocate 语句使一切正常,但我不明白,为什么在这种情况下需要显式分配。有趣的是,如果我删除重载的分配,事情也会正常进行。
有什么提示吗?
module dummy
implicit none
type :: DummyType
integer :: ii
contains
procedure :: assignDummyType
generic :: assignment(=) => assignDummyType
end type DummyType
interface DummyType
module procedure DummyType_init
end interface DummyType
contains
function DummyType_init(initValue) result(this)
integer, intent(in) :: initValue
type(DummyType) :: this
this%ii = initValue
end function DummyType_init
subroutine assignDummyType(this, other)
class(DummyType), intent(out) :: this
type(DummyType), intent(in) :: other
this%ii = other%ii + 1
end subroutine assignDummyType
end module dummy
program test_dummy
use dummy
implicit none
type(DummyType), allocatable :: aa
!allocate(aa) ! Should be covered via automatic reallocation...
aa = DummyType(42)
end program test_dummy
有一个 recent discussion on comp.lang.fortran 处理这个主题。
赋值语句是内部赋值或定义赋值。内部赋值允许[重新]分配左侧,定义的赋值不允许。
当你为一个程序提供赋值通用标识符时,你的赋值就是定义赋值。对应于左侧的参数的特征则要求分配左侧。