使用Iso_Fortran_Env设置函数的Kind值

时间:2018-05-30 01:59:39

标签: function fortran fortran2008

如何使用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()

3 个答案:

答案 0 :(得分:4)

您开始提出问题解决方案并且解决方案运行良好。正如IanH所指出的那样,标准措辞中存在一些含糊之处,但我认为它是允许的并且编译器接受这种语法:

fundef.f90:

const router = new VueRouter({
   mode: 'history',
   routes: [...]
 })

编译:

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

您可以使用函数内部使用的模块中定义的类型。与英特尔Fortran和Oracle Studio一起测试。

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

答案 1 :(得分: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

答案 2 :(得分:2)

延长@ 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