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组件必须在变量和表达式之间的分配状态中匹配,并使用内部赋值进行传输.