Fortran派生类型赋值

sti*_*aan 14 fortran gfortran fortran2003

假设我有一个Fortran派生类型

type :: atype
    integer :: n
    integer :: a(10)
    integer, allocatable :: b(:)
 end type
Run Code Online (Sandbox Code Playgroud)

我有两个这种类型的实例

type(atype) :: t1, t2
Run Code Online (Sandbox Code Playgroud)

当我做以下任务时到底发生了什么?

t2 = t1
Run Code Online (Sandbox Code Playgroud)

我对此感兴趣,因为我想正确地创建派生类型变量的副本意味着,标量组件应该相等,数组组件的每个元素应该相等,并且可分配的数组应该具有相同的分配大小,并且元素应该相等.目前我只想写一个子程序,它正确地复制和分配组件.

subroutine copy_atype(from, to)
    type(atype) :: from, to
    to%n = from%n
    to%a = from%a
    if (allocated(to%b)) deallocate(to%b)
    if (allocated(from%b) then
        allocate(to%b(size(from%b)))
        to%b = from%b
    end if
end subroutine
Run Code Online (Sandbox Code Playgroud)

我希望指导标准中的相应部分.

我正在使用gfortran 4.7.

Ian*_*anH 14

如果没有合适的定义的赋值过程可以将一个类型赋值给另一个类型,则会发生内在派生类型赋值.这在F2008 7.2.1.3中描述.对于您的类型定义,内部派生类型赋值基本上执行您的过程所做的事情:

  • 不可分配的组件(它们本身没有类型绑定定义的赋值)使用内部赋值进行分配.如果它们确实具有类型绑定分配,则使用该分配.

  • 如果已分配,则分配给的对象中的可分配组件将被释放,使用相同类型,类型参数和所分配表达式的边界重新分配,然后键入绑定定义的赋值(如果适用)或使用内部赋值来传输值.

也:

  • 指针组件是指定的指针;

  • coarray组件必须在变量和表达式之间的分配状态中匹配,并使用内部赋值进行传输.

  • 在原始示例“t2=t1”中,假设“t1%b”未分配,而“t2%b”已分配。当你执行 `t2=t1` 时,`t1%b` 会被释放吗?对于这种情况,答案有点不清楚。 (2认同)