【问题标题】:Fortran derived type assignmentFortran 派生类型赋值
【发布时间】:2013-10-07 08:01:50
【问题描述】:

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

【问题讨论】:

    标签: fortran gfortran fortran2003


    【解决方案1】:

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

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

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

    还有:

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

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

    【讨论】:

    • 在原始示例t2=t1 中,假设t1%b 未分配而t2%b 已分配。当您执行t2=t1 时,t1%b 会被释放吗?对于这种情况,答案有点不清楚。
    • 我认为你混淆了你的 t1 和 t2。请参阅第二个点的第一部分 - 解除分配操作对= 右侧值中组件的分配状态是无条件的。组件的重新分配必然是有条件的。
    • 我不熟悉在 Fortran 中实现/使用的指针,但我在 C/C++ 中。在这种情况下,“指针分配”是什么意思?
    • @jvriesem Fortran指针赋值动作,即lhs_pointer => rhs_target
    【解决方案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 类型的变量。您甚至可以通过给出一个以逗号分隔的适当子例程列表来将赋值扩展到其他类型的变量。

    【讨论】:

      猜你喜欢
      • 2012-10-23
      • 2019-03-02
      • 1970-01-01
      • 1970-01-01
      • 2016-10-04
      • 2014-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多