2013-10-01 78 views
12

说我有一个Fortran派生类型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。

回答

11

缺席可以访问一个合适的已定义的分配过程,以便将一个atype分配给另一atype,就会发生固有的派生类型分配。这在F2008 7.2.1.3中有描述。为了您的类型定义,本质派生类型分配基本上没有你的程序做什么:

  • 非分配组件(即本身并不具有约束类型定义分配)跨使用内部赋值分配。如果它们具有类型绑定分配,则使用该分配。

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

另外:

  • 指针组件指针横跨分配;

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

1

这是非常相似的一个问题问了几天就回来: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类型的变量。你甚至可以通过提供一个逗号分隔的适当的子程序列表扩展分配给其他类型的变量。

+0

好知道,但不正是我一直在寻找。 – stiaan