Fortran派生类型赋值

时间:2013-10-01 08:32:48

标签: fortran gfortran fortran2003

假设我有一个Fortran派生类型

type :: atype
    integer :: n
    integer :: a(10)
    integer, allocatable :: b(:)
 end type

我有两个这种类型的实例

type(atype) :: t1, t2

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

t2 = t1

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

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

我希望有关标准中适当部分的说明。

我正在使用gfortran 4.7。

2 个答案:

答案 0 :(得分:13)

在适当定义的赋值过程的缺席中,可以访问一个atype到另一个atype,可以进行内部派生类型赋值。这在F2008 7.2.1.3中描述。对于您的类型定义,内部派生类型赋值基本上执行您的过程:

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

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

此外:

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

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

答案 1 :(得分:2)

这与几天前提出的问题非常相似:Nested derived type with overloaded assignment。请参阅那里接受的答案以获得详细说明。

您可以直接使用子例程copy_atype来构建assignment运算符:

type :: atype
    integer :: n
    integer :: a(10)
    integer, allocatable :: b(:)
contains
    procedure :: copy_atype
    generic :: assignment(=) => copy_atype
end type

这样,您可以直接将相同类型的值分配给atype类型的变量。您甚至可以通过给出以逗号分隔的适当子例程列表来将赋值扩展到其他类型的变量。