首页 文章

在程序中发生参数关联时,FORTRAN隐式转换

提问于
浏览
1

我正在使用fortran一段时间,但在fortran中使用子程序时我没有检查隐式转换问题 . 例如

subroutine printa(a)
        double precision :: a
        ...
    endsubroutine printa

当我调用子程序时

call printa(1)

我看到错误#6633:实际参数的类型与伪参数的类型不同 . [1]我知道这是因为我使用整数而不是双精度作为输入参数 . 但我刚刚意识到使用子程序时没有隐式转换 .

如果我想要一个处理整数和双精度数据的子程序,我似乎必须定义2个子程序来做这些事情 . 有没有办法让隐式转换发生(就像在c中调用函数一样)?或者还有另一种方法可以做到吗?

谢谢 .

2 回答

  • 2

    在Fortran中,reals(包括不同的精度)和整数是不同的,并且你需要不同的子程序来处理它们 . 如果你想要一次调用的方便,类似于Fortran内在函数,如 sin ,它们隐含了几个不同的函数,你可以编写几个不同的过程,然后创建一个通用接口来在它们之间进行选择 . 然后,Fortran将根据实际参数选择正确的实际过程,以匹配伪参数 . 以下是通过数组参数的等级来执行此操作的示例:how to write wrapper for 'allocate' . 它也可以根据您的意愿按参数类型完成 .

  • 1

    您可以重载子例程名称,以便在提供“错误”类型的参数时,它将转换为正确的类型并用于调用子例程,如下所示 .

    module foo
    implicit none
    interface printa
       module procedure print_int,print_real
    end interface printa
    contains
    !
    subroutine print_real(x)
    real, intent(in) :: x
    print*,"number is ",x
    end subroutine print_real
    !
    subroutine print_int(i)
    integer, intent(in) :: i
    call print_real(real(i))
    end subroutine print_int
    !
    end module foo
    
    program main
    use foo, only: printa
    implicit none
    call printa(1)
    call printa(1.0)
    end program main
    

    输出:

    数字是1 .

    数字是1 .

相关问题