我有三个转换角度的转换函数,代码如下所示。
函数返回与输入的类型相同。这意味着
输入角度要么是程序员希望输出的类型
例如,使用或将其转换为所需的输出类型
al = convert(Real(30),"deg_to_rad")
。
我希望程序员能够al = convert(30,"deg_to_rad")
。
我有想法使用transfer
内在的策略来定义
输出类型。
Real :: al, mold
al = convert(30,"deg_to_rad", mold)
al = convert(30.0,"deg_to_rad", mold)
Double Precision :: al, mold
al = convert(30,"deg_to_rad", mold)
al = convert(30.0,"deg_to_rad", mold)
我有自己的功能。有一些想法会很好 如何进行和实施一个好的计划。
Interface convert
Module Procedure convert
Module Procedure convert_real
Module Procedure convert_dble
Module Procedure convert_real128
End Interface convert
Contains
Function convert_real &
( &
qa, label &
) &
Result (qb)
Real, Intent (in) :: qa
Character (len=*), Intent (in) :: label
Real :: qb
If (label .contains. "angle:") Then
Block
Real :: pi, deg_to_rad
pi = 22.0 / 7.0
deg_to_rad = pi / 180.0
Select Case (Trim (label))
Case ("angle: deg_to_rad")
qb = deg_to_rad * qa
End Select
End Block
End If
End Function convert_real
Function convert_dble &
( &
qa, label &
) &
Result (qb)
Double Precision, Intent (in) :: qa
Character (len=*), Intent (in) :: label
Double Precision :: qb
If (label .contains. "angle:") Then
Block
Double Precision :: pi, deg_to_rad
pi = Dble(22) / Dble(7)
deg_to_rad = pi / Dble(180)
Select Case (Trim (label))
Case ("angle: deg_to_rad")
qb = deg_to_rad * qa
End Select
End Block
End If
End Function convert_dble
Function convert_real128 &
( &
qa, label &
) &
Result (qb)
Real (Real128), Intent (in) :: qa
Character (len=*), Intent (in) :: label
Real (Real128) :: qb
If (label .contains. "angle:") Then
Block
Real (Real128) :: pi, deg_to_rad
pi = Real(22,Real128) / Real(7,Real128)
deg_to_rad = pi / Real(180,Real128)
Select Case (Trim (label))
Case ("angle: deg_to_rad")
qb = deg_to_rad * qa
End Select
End Block
End If
End Function convert_real128
当输入和输出不同时,我试图使用子程序 类型。但是我得到了以下错误
Subroutine convertor &
( &
qa, label, qb &
)
Class (*), Intent (in) :: qa
Character (len=*), Intent (in) :: label
Class (*), Intent (out) :: qb
Select Type (qb)
Type Is (Real)
qb = convert (Real(qa),label)
Type Is (Double Precision)
qb = convert (Dble(qa),label)
Type Is (Real (Real128))
qb = convert (Real(qa,Real128),label)
End Select
End Subroutine convertor
这是错误
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:890.26:
qb = convert (Real(qa),label)
1
Error: 'a' argument of 'real' intrinsic at (1) must be a numeric type
lib/meidum.f:893.26:
qb = convert (Dble(qa),label)
1
Error: 'a' argument of 'dble' intrinsic at (1) must be a numeric type
lib/meidum.f:896.26:
qb = convert (Real(qa,Real128),label)
1
Error: 'a' argument of 'real' intrinsic at (1) must be a numeric type
答案 0 :(得分:3)
如果我理解你要做什么,这似乎不必要地复杂化。不使用transfer
作为模型,而是使用算术内在函数,例如sin
。 Fortran(自FORTRAN 77开始)可以根据参数自动区分各种正弦函数(实数,双精度,四精度)。编写每个函数,然后将interface
列为module procedure
,以使其成为通用函数。示例:Overloading functions with Fortran
编辑: 这取决于你想要的东西:
result = convert (input)
对我而言,似乎最自然的是函数返回的类型由参数input
的类型控制。这就是我所描述的,并且是示例中显示的内容。如果result
的类型不同,Fortran将转换赋值...缺点是如果您选择了编译器选项以便生成警告。因此,如果您希望result
的类型控制convert
计算的类型,则必须修改此技术。您不能使用函数,因为函数返回不区分此重载。使用子程序,然后将有一个参数区分:
call convert (input, result)
使用接口/模块程序可以正常工作。我不确定为什么认为这不起作用。使用它可能比赋值语句/函数表示法更不优雅。