Fortran 混合嵌套调用
2023-12-29 15:32 更新
一般地,子程序或者函数的参数都是一些来自主程序的局部变量,那么子程序中调用函数是否也需要在参数中进行声明呢?是的,子程序如果想要使用某个函数,需要将函数名作为参数引用。
!!! 示例 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
。
以上内容是否对您有帮助:
更多建议: