codecamp

Fortran 混合嵌套调用

一般地,子程序或者函数的参数都是一些来自主程序的局部变量,那么子程序中调用函数是否也需要在参数中进行声明呢?是的,子程序如果想要使用某个函数,需要将函数名作为参数引用。

!!! 示例 10
subroutine subrout(subr, xmin, xmax, n)
implicit none
real xmin, xmax, dx, y
integer n, i
dx = (xmax - xmin)/n
do i = 0, n
call subr(dx*i+xmin, y)
print *, i, y
enddo
end subroutine subrout

subroutine funcout(fun, xmin, xmax, n)
implicit none
real fun, xmin, xmax, x, dx, y
integer n, i
dx = (xmax-xmin)/n
do i = 0, n
x = dx*i + xmin
y = func(x)**3
print *, x, y
enddo
end subroutine funcout

subroutine sub(x, y)
implicit none
real y, x
y = 2*sin(x) + cos(x**2)
end subroutine sub

function fun(x)
implicit none
real fun, x
fun = sin(x)**3
end function fun

program test_func
implicit none
real, external :: fun
external sub
call subrout(sub, 0.0, 3.0, 10)
call funcout(fun, 0.0, 3.0, 10)
end program test_func

!!! 执行结果
>>> 0 1.00000000
1 1.58699322
2 2.06518173
3 2.25615215
4 1.99450183
5 1.36681640
6 0.952533364
7 1.42861772
8 2.21715832
9 1.38931477
10 -0.628890276
0.00000000 0.00000000
0.300000012 1.71903503E-05
0.600000024 5.83394058E-03
0.900000036 0.111042053
1.20000005 0.530770957
1.50000000 0.977679431
1.80000007 0.787805617
2.10000014 0.266100109
2.40000010 2.92694476E-02
2.70000005 4.75692534E-04
3.00000000 2.21971472E-08

上面的示例 10 是子程序和函数副程序的混合嵌套使用的一个范例,上述代码的主要结构如下所示:在主程序 test_func 中调用子程序 subrout 和 funcout,再由子程序 subrout 调用子程序 sub 以及子程序 funcout 调用函数副程序 fun

test_func(主程序)
├── subrout(子程序)
│ └── sub(子程序)
└── funcout(子程序)
└── fun(函数副程序)

这里比较重要的是,在主程序中需要对递归调用的子程序和函数副程序进行声明。主程序中的递归子程序调用声明只需要 external 加上子程序名即可,而主程序中的递归函数副程序调用声明需要同时定义函数变量和函数名,因此写为 real, external :: 加上函数副程序名。

当然在直接调用函数副程序 fun 的子程序 funcout 中也需要定义函数同名变量,写为 real fun

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; }