具有可配置的实际精度的调用功能

tgo*_*ens 0 fortran gfortran

目标:

具有可配置的工作精度的功能.

当我尝试这个:

program vierkantsvergelijking
implicit none

integer, parameter :: dp = kind(0.d0)
integer, parameter :: sp = kind(0.0)

print *, algoritme1(-5771.,2.,dp)
contains

  function algoritme1(b,c,wp) result( solution)
    integer :: wp ! working precision
    real(kind=wp) :: b,c,D
    real(kind=wp), dimension(2) :: solution
    D = sqrt((b/2)**2 - c)
    solution(1) = -b/2 + D
    solution(2) = -b/2 - D
  end function algoritme1

end program
Run Code Online (Sandbox Code Playgroud)

我得到:错误:在(1)的参数'b'中键入不匹配; 将REAL(4)传递给UNKNOWN

为什么这不起作用,我怎样才能实现目标?

Hig*_*ark 5

是的,或者说不是,这不会起作用,也不会起作用.英特尔Fortran编译器抱怨,关于这一行:

real(kind=wp) :: b,c,D
Run Code Online (Sandbox Code Playgroud)

A kind type parameter must be a compile-time constant.   [WP]
Run Code Online (Sandbox Code Playgroud)

它也有同样的抱怨real(kind=wp), dimension(2) :: solution.这是Fortran的根深蒂固的特征.

要做你想做的事,你必须沿着这些方向定义一个通用接口

interface algoritme1
    procedure :: algoritme1_sp, algoritme1_dp
end interface
Run Code Online (Sandbox Code Playgroud)

并为这两个程序编写代码.然后编译器可以确定函数签名调用哪一个; 可能会有一个sp论点,其他dp论点.

您可能会认为这一切都意味着Fortran不会执行通用程序,我会将这个问题留给诡辩者和语言挑剔者.搜索周围是值得的generic programming in Fortran; 即使在这里,有关于如何更好地避免编写程序员认为(与编译器不一致)的多个实现是"相同"代码的技巧和提示.