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