是否可以将两个(或更多)不同类型的参数传递给子例程?
我试过了:
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
但是,由于我不想两次声明变量sp
和dp
的种类,这会破坏我的目的。
答案 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中一样:你需要声明每个参数的类型,即使参数的类型已经在其他地方声明了。