假设我有一个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。
答案 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
类型的变量。您甚至可以通过给出以逗号分隔的适当子例程列表来将赋值扩展到其他类型的变量。