Fortran模块全局变量

时间:2014-11-30 07:17:53

标签: function generics module fortran

调用函数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

1 个答案:

答案 0 :(得分:3)

错误消息可能会分散注意力。

变量的初始化程序必须是Fortran 2008中的一个常量表达式(旧版本中的初始化表达式)。这基本上是一个可以在编译时评估的表达式。常量表达式中不允许使用用户定义的函数(评估函数需要执行函数,这通常不能在编译时完成)。

您需要创建一个语句,为right_angl变量赋予其值某种可执行语句 - 在某些情况下,这是通过使用" Intialise"或模块中的类似程序,必须在模块中的任何其他内容之前调用。