我正在使用fortran一段时间,但在fortran中使用子程序时我没有检查隐式转换问题 . 例如
subroutine printa(a)
double precision :: a
...
endsubroutine printa
当我调用子程序时
call printa(1)
我看到错误#6633:实际参数的类型与伪参数的类型不同 . [1]我知道这是因为我使用整数而不是双精度作为输入参数 . 但我刚刚意识到使用子程序时没有隐式转换 .
如果我想要一个处理整数和双精度数据的子程序,我似乎必须定义2个子程序来做这些事情 . 有没有办法让隐式转换发生(就像在c中调用函数一样)?或者还有另一种方法可以做到吗?
谢谢 .
2 回答
在Fortran中,reals(包括不同的精度)和整数是不同的,并且你需要不同的子程序来处理它们 . 如果你想要一次调用的方便,类似于Fortran内在函数,如
sin
,它们隐含了几个不同的函数,你可以编写几个不同的过程,然后创建一个通用接口来在它们之间进行选择 . 然后,Fortran将根据实际参数选择正确的实际过程,以匹配伪参数 . 以下是通过数组参数的等级来执行此操作的示例:how to write wrapper for 'allocate' . 它也可以根据您的意愿按参数类型完成 .您可以重载子例程名称,以便在提供“错误”类型的参数时,它将转换为正确的类型并用于调用子例程,如下所示 .
输出:
数字是1 .
数字是1 .