(4.3) 函数的参数
COMMON
是FORTRAN77中使用全局变量的方法,它可以将不同作用域下的变量联系起来。
PROGRAM main
IMPLICIT NONE
!INTEGER,COMMON :: a,b !错误写法
INTEGER :: a,b
COMMON a,b
a = 1
b = 2
CALL showCommon() !□□1□□2
END PROGRAM main
SUBROUTINE showCommon()
IMPLICIT NONE
INTEGER :: num1,num2
COMMON num1,num2
WRITE(*,"(2I3)") num1,num2
END SUBROUTINE showCommon
取用全局变量时,是根据它们声明时相对位置关系来做对应,而不是使用变量名称来对应。所以在上面这个程序中
num1
对应a
,num2
对应b
。COMMON
还可以在变量很多的时候进行分组:
PROGRAM main
IMPLICIT NONE
INTEGER :: a,b,c,d,e,f
COMMON /group1/ a
COMMON /group2/ b
COMMON /group3/ c
COMMON /group4/ d
COMMON /group5/ e
COMMON /group6/ f
f = 1
CALL show_common_6() !□□1
END PROGRAM main
SUBROUTINE show_common_6()
IMPLICIT NONE
INTEGER :: num6
COMMON /group6/ num6
WRITE(*,"(I3)") num6
END SUBROUTINE show_common_6
COMMON
变量还可以用BLOCK DATA
程序模块中的DATA
语句批量赋值。
PROGRAM main
IMPLICIT NONE
INTEGER :: a,b
COMMON a,b
INTEGER :: c,d
COMMON /group/ c,d
WRITE(*,"(4(I3))") a,b,c,d
END PROGRAM main
BLOCK DATA assign_common_variable
IMPLICIT NONE
INTEGER a,b
COMMON a,b
DATA a,b /1,2/
INTEGER c,d
COMMON /group/ c,d
DATA c,d /3,4/
END BLOCK DATA assign_common_variable
BLOCK DATA
这一段程序也很类似于子程序。它也是一段独立的程序模块,也拥有自己的变量声明,不过它不需要被别人调用就可以自己执行。事实上这一段程序会在主程序执行前就会生效,不过它的功能只在于设置全局变量的初值,不能有其他执行命令的出现。还有一点需要指出,全局变量不能声明成常量,所以BLOCK DATA
中不能出现PARAMETER
。
(4.4) 几类特殊函数
函数除了可以让别人调用,还可以自己调用自己,这叫做递归(recursion)。递归函数每次被调用时,函数中声明的局部变量都会使用不同的地址,比较经典的案例是用递归计算阶乘:
PROGRAM main
IMPLICIT NONE
INTEGER :: n = 5
INTEGER,EXTERNAL :: factorial
WRITE(*,*) factorial(n)
END PROGRAM main
RECURSIVE INTEGER FUNCTION factorial(n) RESULT(ans) !递归函数必须使用RESULT来改名
IMPLICIT NONE
INTEGER,INTENT(IN) :: n !参数n只能由外部传入
IF(n < 0) THEN
STOP
ELSE IF(n <= 1) THEN
ans = 1
RETURN
END IF
ans = n * factorial(n-1) !调用自己来计算(n-1)!
END FUNCTION factorial
(4.5) 一些少用的功能
PROGRAM main
IMPLICIT NONE
CALL head_sub() !Hello\World!
CALL mid_sub() !World!
END PROGRAM main
SUBROUTINE head_sub()
IMPLICIT NONE
WRITE(*,*) "Hello!"
ENTRY mid_sub() !另一个入口
WRITE(*,*) "World!"
END SUBROUTINE head_sub
PROGRAM main
IMPLICIT NONE
INTEGER :: a
WRITE(*,*) "请随便输入一个数:"
READ(*,*) a
CALL judge_number(a,*100,*200,*300) !指定了三个折返点
100 WRITE(*,*) "Negative."
STOP
200 WRITE(*,*) "Zero."
STOP
300 WRITE(*,*) "Positive."
END PROGRAM main
SUBROUTINE judge_number(num,*,*,*)
IMPLICIT NONE
INTEGER :: num
IF(num < 0) THEN
RETURN 1 !返回第一个折返点
ELSE IF(num == 0) THEN
RETURN 2 !返回第二个折返点
ELSE
RETURN 3 !返回第三个折返点
END IF
END SUBROUTINE judge_number
《 F O R T R A N S Y N T A X 》系列博客创作参考资料来源 《FORTRAN\ SYNTAX》系列博客创作参考资料来源 《FORTRAN SYNTAX》系列博客创作参考资料来源
- 《Fortran95程序设计》.彭国伦.中国电力出版社.
- 《工程分析程序设计》.陈斌、周屈兰.西安交通大学出版社.
- 《Fortran程序设计(第四版)》.Stephen J.Chapman.中国电力出版社.
博客创作: A i d e n L e e 博客创作:Aiden\ Lee 博客创作:Aiden Lee
特别声明:文章仅供学习参考,转载请注明出处,严禁盗用!