【问题标题】:Type-bound function overloading in Fortran 2003Fortran 2003 中的类型绑定函数重载
【发布时间】:2014-07-26 02:48:47
【问题描述】:

我有一个 Fortran 派生类型 T,它包含(许多)不同等级和类型的数据数组。这些数组隐藏在一个复杂的数据结构中,我希望有一个 getter 函数来执行以下操作:

a => T%get(data_id)

其中“a”是给定类型的数组指针,data_id 是一个整数,用于查找数据结构内的数据。我通过在一个通用名称下重载许多“get_thistype()”函数来做到这一点。

TYPE T
   PROCEDURE :: get_real
   PROCEDURE :: get_integer
   GENERIC   :: get => get_real,get_integer
END TYPE

如果 get_thistype() 例程是子例程,则此方法有效,但如果它们被编写为函数,则无效。这意味着我的代码如下所示:

CALL T%get(a,data_id)

我发现它的可读性要差得多。有没有办法重载具有相同参数列表但返回类型不同的函数?还是我必须为此使用子例程?

【问题讨论】:

  • 我认为编译器很难仅根据返回类型找出正确的函数,所以这可能是不可能的。我只会使用子程序。

标签: fortran


【解决方案1】:

当在 fortran 中执行(指针)赋值语句时,右侧总是在赋值发生之前被完全评估。这种情况独立于左侧发生,因此 LHS 绝对不可能影响 RHS 的评估结果。这就是语言的设计方式。

【讨论】:

    【解决方案2】:

    我刚刚看到这篇文章,所以为了方便大家以后看到这个:

    如果我正确理解了这个问题,您可以通过重载赋值运算符来完成此操作。示例:

    文件 X.f90:

    MODULE XModule
    
    TYPE :: X
       INTEGER, DIMENSION(:), POINTER :: IntArray
       REAL,    DIMENSION(:), POINTER :: RealArray
    END TYPE
    
    INTERFACE ASSIGNMENT (=)
       MODULE PROCEDURE PointToInt
       MODULE PROCEDURE PointToReal
    END INTERFACE
    
    CONTAINS
    
    SUBROUTINE PointToInt(Ip, V)
       INTEGER, POINTER, DIMENSION(:), INTENT(OUT) :: Ip
       TYPE(X), INTENT(IN) :: V
       Ip => V%IntArray
    END SUBROUTINE PointToInt
    
    SUBROUTINE PointToReal(Rp, V)
       REAL, POINTER, DIMENSION(:), INTENT(OUT) :: Rp
       TYPE(X), INTENT(IN) :: V
       Rp => V%RealArray
    END SUBROUTINE PointToReal
    
    END MODULE
    

    测试驱动文件Driver.f90:

    PROGRAM Driver
    USE XModule
    TYPE(X) :: Var
    INTEGER, DIMENSION(:), POINTER :: I
    REAL, DIMENSION(:), POINTER :: R
    
    ALLOCATE(Var%IntArray(2))
    ALLOCATE(Var%RealArray(3))
    
    Var%IntArray = [1, 2]
    Var%RealArray = [1., 2., 3.]
    
    I = Var
    PRINT*, I
    
    R = Var
    PRINT*, R
    
    END PROGRAM
    

    输出:

               1           2
       1.000000       2.000000       3.000000    
    

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-11
      相关资源
      最近更新 更多