目录
前言
程序单元包括主程序、子例程、模块、函数子程序。
在Fortran中,大型程序可以拆分成多个独立运行和调试的子任务,即程序单元(亦称为外部过程)。
Fortran中有两种外部过程:子例程和函数子程序。这种机制的优点是:
- 子任务单独测试,相互之间不影响;
- 避免重复造轮子,调用即可;
- 将实现某一功能的代码封装起来,避免不经意修改导致代码错误而不自知。
Fortran子例程(SUBROUTINE)
1) 使用方式
子例程(亦可称为子程序)是一个Fortran过程,通过CALL
语句进行调用,并通过参数表获取输入数值和返回结果。
定义语句格式:
SUBROUTINE subroutine_name( argument_list_dum ) ! 定义子例程名和相关参数表
(声明部分)
...
(执行部分)
...
RETURN
END SUBROUTINE [ subroutine_name ] ! []表示可选
注意事项:
subroutine_name
由字母、数字和下划线组成 ,最大长度可达63个字符,第一个字符为字母;argument_list_dum
,形参,一系列变量和/或数组,从调用程序传递给子例程;- 子例程是一个独立的程序单元,开始于
SUBROUTINE
,结束于END SUBROUTINE
,其中的局部变量名和语句标号(“行号”)可以在其它地方复用(不用担心重名); - 实际上没有给形参分配内存。
调用语句格式:
CALL subroutine_name( argument_list_act )
注意事项:
- 任何可执行程序单元都可以调用子例程,但不能调用自身(除非定义为递归类型);
argument_list_act
,实参。实参的个数、顺序与类型必须和形参的个数、顺序与类型相匹配。- 主程序和子例程之间采用地址传递进行参数传递,具体过程是:由于主程序中的实参有具体的内存存储位置,当调用子例程时,主程序将生成多个指针来指向各个实参所对应的存储位置,并将指针传递给子例程,子例程调用的是参数的内存位置,而非实参数据本身。
2) 子例程示意
已知三角形的两条直边,计算斜边。要求计算过程用子例程,主程序直接输入相应数据后直接调用。
PROGRAM calc_hypotenuse_test ! 主程序
IMPLICIT NONE
REAL :: s1
REAL :: s2
REAL :: hypot
WRITE(*,*) '测试计算斜边的子例程'
WRITE(*,*)'输入第一条直边的长度:'
READ(*,*) s1
WRITE(*,*)'输入第二条直边的长度:'
READ(*,*) s2
CALL calc_hypotenuse( s1, s2 , hypot ) ! 调用子例程
WRITE( *, 100 ) hypot
100 FORMAT('斜边长度为ÿ