15

假设我有一个 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。

4

2 回答 2

15

如果没有合适的已定义赋值过程可用于将一种类型分配给另一种类型,则会发生内在派生类型分配。这在 F2008 7.2.1.3 中进行了描述。对于您的类型定义,内部派生类型分配基本上完成了您的过程所做的事情:

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

  • 被分配对象中的可分配组件如果已经分配则被释放,使用相同类型、类型参数和被分配表达式的边界重新分配,然后使用类型绑定定义的赋值(如果适用)或内在赋值来传递值。

还:

  • 指针组件是指针分配的;

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

于 2013-10-01T11:05:51.640 回答
3

这与几天前提出的一个问题非常相似: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

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

于 2013-10-01T08:42:15.587 回答