Fortran函数/子例程,可以返回实数,整数或字符串。

时间:2018-01-18 16:38:17

标签: fortran derived-types

我想知道如何创建一个返回实数,整数或字符串的函数。

例如,调用将是write(*,*)dt%get(),其中get()将返回:

  • dt%isInteger = .true.
  • 的整数
  • 一个真实的dt%isReal = .true.
  • dt%isStr = .true.
  • 的字符

我相信这可能是通过使用抽象接口使过程get()指向过程getInteger()getReal()getStr(),但抽象接口定义需要定义输出类型,在我的例子中,是变量。

以下是相关代码:

type :: dt
    real(dp) :: realValue
    integer :: integerValue
    character(*) :: strValue
    logical :: isReal, isInteger, isStr
    procedure(intf), pointer :: get
contains
    procedure :: getReal, getInteger, getStr
end type

abstract interface
    function intf(self)
        import dt
        class(dt) :: self
        ??? :: intf
    end function
end interface

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

这在Fortran中根本不可能。

您可以使用具有不同特定功能的通用接口,但这些函数必须具有不同类型的参数(请参阅几个内部函数,如transfer()使用mold参数)。这称为TKR(类型,种类,等级)分辨率。无法根据参数的值来区分通用函数

type :: dt
    real(dp) :: realValue
    integer :: integerValue
    character(*) :: strValue             !!!! <= THIS IS WRONG !!!!
    logical :: isReal, isInteger, isStr
contains
    generic :: get => getReal, getInteger, getStr
    procedure :: getReal, getInteger, getStr
end type

function getReal(self, mold)
  class(dt) :: self
  real, intent(in) :: mold
end function

function getInteger(self, mold)
  class(dt) :: self
  integer, intent(in) :: mold
end function

function getString(self, mold)
  class(dt) :: self
  character(*), intent(in) :: mold
end function

如您所见,调用get()时必须知道正确的类型。你称之为

real_variable = object%get(1.0)
integer_variable = object%get(1)

还要注意不同长度的琴弦。我把它标记在上面。您可能需要character(:), allocatable

您还可以创建返回通用容器的函数,然后从容器中提取值。甚至可以使用容器的重载分配直接完成提取。

你也可以只返回一个无限多态变量(class(*))。