调用函数convert时遇到以下错误。功能 是fortran模块中的通用名称。
gfortran -o build/lib/foul.o -c -ffree-form -g -J./build/lib lib/foul.f
gfortran -o build/lib/meidum.o -c -ffree-form -g -J./build/lib lib/meidum.f
lib/meidum.f:55.23:
Real :: right_angl = convert (90.0, "angle: deg_to_rad")
1
Error: There is no specific function for the generic 'convert' at (1)
这是模块的定义部分。有一个不同的转换功能 数据类型是真实的,双精度的和四倍的精度。
Module Meidum
Use Foul
Use, Intrinsic :: iso_fortran_env
Implicit None
Interface convert
Module Procedure convert
Module Procedure convert_dble
Module Procedure convert_real128
End Interface convert
Real :: right_angl = convert (90.0, "angle: deg_to_rad")
Contains
...
Function convert &
( &
qa, label &
) &
Result (qb)
Real, Intent (in) :: qa
Character (len=*), Intent (in) :: label
Real :: qb
If (label .contains. "angle:") Then
Block
Real :: pi
Real :: deg_to_rad, grad_to_rad, grad_to_deg
pi = 22.0 / 7.0
deg_to_rad = pi / 180.0
grad_to_rad = pi / 200.0
grad_to_deg = 9.0 / 10.0
Select Case (Trim (label))
Case ("angle: deg_to_rad")
qb = deg_to_rad * qa
Case ("angle: grad_to_rad")
qb = grad_to_rad * qa
Case ("angle: grad_to_deg")
qb = grad_to_deg * qa
Case ("angle: rad_to_deg")
qb = qa / deg_to_rad
Case ("angle: rad_to_grad")
qb = qa / grad_to_rad
Case ("angle: deg_to_grad")
qb = qa / grad_to_deg
End Select
End Block
End If
End Function convert
Function convert_dble &
( &
qa, label &
) &
Result (qb)
Double Precision, Intent (in) :: qa
Character (len=*), Intent (in) :: label
Double Precision :: qb
...
End Function convert_dble
Function convert_real128 &
( &
qa, label &
) &
Result (qb)
Real (Real128), Intent (in) :: qa
Character (len=*), Intent (in) :: label
Real (Real128) :: qb
End Function convert_real128
答案 0 :(得分:3)
错误消息可能会分散注意力。
变量的初始化程序必须是Fortran 2008中的一个常量表达式(旧版本中的初始化表达式)。这基本上是一个可以在编译时评估的表达式。常量表达式中不允许使用用户定义的函数(评估函数需要执行函数,这通常不能在编译时完成)。
您需要创建一个语句,为right_angl
变量赋予其值某种可执行语句 - 在某些情况下,这是通过使用" Intialise"或模块中的类似程序,必须在模块中的任何其他内容之前调用。