Fortran 2003中的类型绑定函数重载

Fortran 2003中的类型绑定函数重载,fortran,Fortran,我有一个Fortran派生的类型T,它包含(许多)不同等级和类型的数据数组。这些数组隐藏在一个复杂的数据结构中,我希望有一个getter函数,它执行以下操作: a => T%get(data_id) 其中“a”是给定类型的数组指针,data_id是用于查找数据结构内数据的整数。我通过在泛型名称下重载许多“get_thistype()”函数来实现这一点 TYPE T PROCEDURE :: get_real PROCEDURE :: get_integer GENERI

我有一个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中执行(指针)赋值语句时,总是在赋值发生之前对右侧进行完全求值。这与左侧无关,因此LHS绝对无法影响RHS评估的结果。这正是语言的设计方式。

我刚刚看到这篇文章,为了让将来看到这篇文章的人受益:

如果我理解正确,您可以通过重载赋值运算符来实现这一点。例如:

文件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    

希望这能有所帮助。

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