还是以一个例子开始吧:
点击(此处)折叠或打开
- program main
- implicit none
- real :: x,y !在调用处也要声明上相应的变量x,y。在子程序中y作为返回值,无需给它传值。但是子程序会得到其数值,而且会修改该处的y值。
- x=2.0
- call test(x,y)
- write(*,*)x,y
- call test(3.0,y) !这里看的更明显,y作为返回值,无需给它传值
- write(*,*)x,y
- stop
- end program
- subroutine test(x,y) !在这里,x作为输入参量,而y作为输出参量
- implicit none
- real :: x,y
- y=x*x
- end subroutine
点击(此处)折叠或打开
- program main
- implicit none
- real :: x,y
- real,external :: test
- x=2.0
- y=1.0
-
- write(*,*)test(x,y)
- stop
- end program
- real function test(x,y) !x,y都是输入参量,不能作为返回值
- implicit none
- real :: x,y
- test=x*x+y*y !函数名作为返回值的“变量名”
- return
- end function
而且利用子程序还可以实现参数的多级传递。例如(这个例子或许不太恰当):
点击(此处)折叠或打开
- program main
- implicit none
- real :: x,y,z
- x=2.0
- y=1.0
- call test1(x,y,z)
- write(*,*)z
- call test1(2.0,1.0,z)
- write(*,*)z
- stop
- end program
- subroutine test1(x,y,z)
- implicit none
- real :: x,y,z !这里只是暂时存储了一下z,然后把其数据传递给了主函数
- call test2(x,y,z)
- return
- end subroutine
- subroutine test2(x,y,z)
- implicit none
- real :: x,y,z
- z=x*x+y*y
- end subroutine