3

如何使用 ISO Fortran Env 的内在函数以 Fortran 2008 惯用的方式设置函数的返回 KIND 值?

通常在主程序中,我可以使用 ISO Fortran 内部函数,如下所示:

program name here
    use iso_fortran_env
    implicit none
    integer, parameter :: double=REAL64
    real(kind=double) :: some_variable
end program name here

但是似乎没有一种方便的方法可以将这些内在函数用于外部函数,因为 REAL64 和 double 都只能在上面的 main 函数中定义。尝试在 main 中定义函数的 KIND 如下:

program name here
    use iso_fortran_env
    implicit none
    integer, parameter :: double=REAL64
    real(kind=double) :: some_function
    ! Do stuff
end program name here
real function some_function()
    ! Do stuff
end some_function

至少在我的系统上,会引发类型不匹配错误(double 被定义为 KIND=8,而默认 real 在我的系统上被定义为 KIND=4)。我总是可以只使用real(kind=8) function some_function(),但出于便携性的考虑,我不希望这样做。另外,在一个地方使用来自 iso_fortran_env 的 REAL64 感觉很脏,只是转身在另一个地方使用 KIND=8。

是否有一种简单(或至少可读)的方法来实现这一点,如下所示?

real(kind=REAL64) function some_function()
4

3 回答 3

5

你开始你的问题提供了一个解决方案,并且该解决方案运作良好。正如 IanH 指出的那样,标准措辞存在一些歧义,但我认为它是允许的,并且编译器确实接受这种语法:

fundef.f90:

real(kind=REAL64) function some_function()
  use iso_fortran_env
  some_function = 1._real64
end

编译:

> gfortran -c funkind.f90 
> 

您可以使用在函数内部使用的模块中定义的种类。还使用 Intel Fortran 和 Oracle Studio 进行了测试。

在现代 Fortran中,无论如何都应该在模块中定义所有函数,但是如果您希望从仅在函数内部使用的模块中获得一种,那么可能性就在这里。

于 2018-05-30T06:52:44.837 回答
3

扩展 @chw21 的答案:

您始终可以选择在函数的规范部分声明函数结果的类型,并通过其中的主机关联访问模块中的参数。

编辑:«正如@Vladimir F 所指出的,您还可以通过主机关联从函数体内声明的模块访问变量。»

事实上,这是将属性应用于函数结果的唯一方法,如指针、可分配、维度等。

此外,您还可以通过result后缀为函数结果声明一个新名称。

pure function some_other_function_with_a_long_name() result(out)
    use, intrinsic :: iso_fortran_env, only: rk => real64
    implicit none
    real(rk), dimension(5) :: out
    out = 1.0_rk
    ! (...)
end
于 2018-05-30T04:26:53.003 回答
2

我通常在发布之前尝试一下,但我认为这应该可行:

function some_function()
    use iso_fortran_env, only: real64
    implicit none
    real(kind=real64) :: some_function
    some_function = 1.0_real64
end function some_function

或在模块内

module some_module
    use iso_fortran_env, only: real64
    implicit none
contains
    real(kind=real64) function some_function()
        some_function=1.0_real64
    end function some_function
end module some_module
于 2018-05-30T02:34:33.543 回答