使用 Iso_Fortran_Env 设置函数的 Kind 值
Using Iso_Fortran_Env to set a function's Kind value
如何使用 ISO Fortran Env 的内在函数以 Fortran 2008 惯用的方式设置函数的 return 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()
我通常在发帖前尝试一下,但我认为这应该有效:
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
扩展@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
您的问题一开始就提供了解决方案,并且该解决方案运行良好。正如 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 中,所有函数 无论如何都应该在模块 中定义,但是如果您希望从仅在函数内部使用的模块中得到一个类型,那么可能性就在这里。
如何使用 ISO Fortran Env 的内在函数以 Fortran 2008 惯用的方式设置函数的 return 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()
我通常在发帖前尝试一下,但我认为这应该有效:
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
扩展@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
您的问题一开始就提供了解决方案,并且该解决方案运行良好。正如 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 中,所有函数 无论如何都应该在模块 中定义,但是如果您希望从仅在函数内部使用的模块中得到一个类型,那么可能性就在这里。