我在使用 gfortran 编译 Fortran 代码时遇到以下错误
Error: Interface of ‘rfunct’ at (1) must be explicit
接口被定义为这样的模块的一部分。
interface
subroutine ifunct(rfunct) bind(c)
import :: c_double
real (kind=c_double), external, bind(c) :: rfunct
end subroutine
end interface
这里,
rfunct
是调用例程传递的函数指针。例如。,
call setvalue(rang)
这里,
rang
是被调用的实际函数,在单独的模块中定义为公共函数,并返回实数(R8)值。
我尝试使用多个编译器编译此代码。使用g95,可以成功编译。我正在尝试使用 gfortran 做同样的事情,因为 g95 没有得到积极维护。
声明函数时,无论在哪里,绝对不允许使用
这样的形式real, external, bind(c) :: func
这明显违反了 Fortran 标准。1
类似的函数声明
real, external :: func
表示
func
是一个函数,其函数结果为REAL类型,并且它有一个隐式接口。 gfortran 的错误消息有点不对劲,但试图说 func
具有 BIND 属性意味着 func
应该具有 an explicit 接口。 这是一个矛盾。
您需要决定
func
是否具有隐式或显式接口。
如果您希望问题的虚拟过程
rfunct
有一个隐式接口,您可以使用 real(kind=..), external :: rfunct
形式;如果您希望它有一个显式接口,您需要提供该接口(使用procedure
语句或接口块)。
由于
rang
(实际参数过程)是一个公共模块过程,因此使用显式接口似乎是合理的。
1 在 Fortran 2023 中为 C803。