Fortran:传递两种不同类型的参数

时间:2014-03-11 19:31:31

标签: fortran

是否可以将两个(或更多)不同类型的参数传递给子例程?

我试过了:

program Main
    real(4) :: sp = 1.0
    real(8) :: dp = 1.0
    call Test(sp,dp)
contains
    subroutine Test(sp,dp)
        real, intent(in) :: sp,dp
        print *, sp
        print *, dp
    end subroutine
end program

subroutine Test(sp,dp)
    real, intent(in) :: sp
    real, intent(in) :: dp
    print *, sp
    print *, dp
end subroutine

但是他们在编译时都给出了完全相同的错误:

call Test(sp,dp)
              1
Error: Type mismatch in argument 'dp' at (1); passed REAL(8) to REAL(4)

我能够使其发挥作用的唯一方法是:

program Main
    real(4) :: sp = 1.0
    real(8) :: dp = 1.0
    call Test(sp,dp)
contains
    subroutine Test(sp,dp)
        real(4), intent(in) :: sp
        real(8), intent(in) :: dp
        print *, sp
        print *, dp
    end subroutine
end program

但是,由于我不想两次声明变量spdp的种类,这会破坏我的目的。

3 个答案:

答案 0 :(得分:3)

如果您需要具有该值的种类,则必须这样做。每个变量和每个伪参数都应该有一个声明的类型。因此,你的最后一个例子是正确的。

答案 1 :(得分:3)

您需要指定两次种类,因为有两个变量称为sp(和dp):一个在主程序中,另一个在子程序中。在子例程调用中,需要伪参数(子例程中的sp)与实际参数(主程序中的sp)匹配。

在通用解决方案方面,这是一件好事。

但请注意,在您的情况下,您不需要这样做,因为子程序是主程序的内部,不需要传递参数:您可以使用sp来自子程序中的主程序而不重新声明它。但一般情况下,您需要。

另外,你的前两个案例

real, intent(in) :: sp
real, intent(in) :: dp

real, intent(in) :: sp,dp

意思是同样的事情。

答案 2 :(得分:1)

如果不重新声明子例程中的变量类型,就无法完成您要做的事情。它就像在C / C ++ / C#/ Java中一样:你需要声明每个参数的类型,即使参数的类型已经在其他地方声明了。