我想实现一个子程序,它可以使用单精度,双精度和扩展精度的实数。我能想出的唯一解决方案如下面的代码所示。这个解决方案有效但我必须复制代码3次。可以避免此代码重复吗?
module mymodule
....
! some code here
interface my_func
module procedure my_func_sp
module procedure my_func dp
module procedure my_func_ep
end interface
contains
subroutine my_func_sp(x,y)
real(kind=sp), dimension(:) :: x,y
... LONG IMPLEMENTATION HERE ...
end subroutine
subroutine my_func_dp(x,y)
real(kind=dp), dimension(:) :: x,y
... LONG IMPLEMENTATION HERE THAT IS EXACTLY THE SAME AS ABOVE ...
end subroutine
subroutine my_func_ep(x,y)
real(kind=ep), dimension(:) :: x,y
... LONG IMPLEMENTATION HERE THAT IS EXACTLY THE SAME AS THE TWO ABOVE ...
end subroutine
end module
答案 0 :(得分:6)
可以避免这些代码重复吗?不是真的,这是Fortran的工作方式。你可以:
include
文件写入每个子程序中。请注意包含的语句对各种类型都有效。还要注意相同的陈述可以跨越各种类型。例如,如果您包含的行包括与容差的比较,就像许多数字代码一样,您可能需要特别注意公差的调整 wrt 那种。答案 1 :(得分:0)
如果整个代码将使用单精度,双精度或四重精度实数,则可以在模块中定义参数real_kind,并使用该参数指定整个代码中的种类,包括子程序中实变量的声明。如果您的代码在一次运行中调用多个my_func_sp,my_func_dp和my_func_ep,则此解决方案不起作用。