codecamp

Fortran 子程序的返回值

刚才提到的子程序中定义的变量是局部变量,不会干扰主程序中的其他变量,但是如果我们想要把子程序计算的结果返回给主程序呢?在其他的编程语言中,可能大部分是使用 return 加变量名的方式来将子程序中的变量传递回主程序。在 Fortran 中,子程序会将参数变量全部返回给主程序,可以认为是地址引用。如果主程序调用子程序时用一个算式传递变量给子程序,那么可以认为是值引用。

如下面的示例 4 所示,主程序中调用子程序时最后的变量 p 就是要保存返回值的变量。从执行结果也可以看出,变量 x 和 y 并没有受到子程序的影响,只有变量 p 带着子程序的变量 z 的值正确返回了。因为这里 x+y 作为子程序中的 x 存在,而 x+y 这个变量实际上在主程序中不存在,所以是值引用。

!!! 示例 4
program stest4
implicit none
real x, y, p
x = 10.0
y = 30.0
call subr4(x+y, 20.0, p)
print *, x, y, p
end program stest4

subroutine subr4(x, y, z)
implicit none
real x, y, z
z = x*y
end subroutine subr4

!!! 执行结果
>>> 10.0000000 30.0000000 800.000000

 值引用地址引用的定义:值引用是指引用值而不引用原来的变量或者存储器中对应的地址,地址引用是指引用原来的变量或者存储器中对应的地址。

值引用地址引用的区别:前者不会因子程序的操作而发生改变,后者可能会因子程序的操作而发生改变。如果我们仅仅是为了传递某个值给子程序作为输入,可以采用值引用,从而避免对于主程序的干扰。如果我们希望子程序的操作改变变量的值,可以采用地址引用。


Fortran 类型声明的一致性
Fortran 数组作为子程序参数
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }