- 第一章 Fortran 语言程序设计初步
- 第二章 改变程序流程
- 第三章 循环结构
- 第四章 数据结构
- 第五章 数组
- 第六章 过程和模块
- 第七章 输入输出和文件
6.3.3 模块的应用
引入模块给程序设计带来了诸多方便,模块可应用于以下几个方面。
a) 全局数据
如果数据是在整个可执行程序中都要用到的全局数据,可以把它们放在一个模块中统一说明,在需要这些数据的程序单元内使用 USE 语句导出它们即可。例如:
MODULE DATA_MODULE
SAVE
REAL :: A(10), B, C(50,10)
INTEGER,PARAMETER :: I=10
COMPLEX D(I,I)
END MODULE DATA_MODULE
如果要在程序单元中访问模块中定义的全部数据对象,可使用语句:
USE DATA_MODULE
如果只需访问其中的 A 和 D,则可使用语句:
USE DATA_MODULE, ONLY : A,D
如果要避免名字冲突而改名的话,则可使用语句:
USE DATA_MODULE, ONLY : A_MODULE=>A, D_MODULE=>D
b) 过程共享
利用模块,还可以把整个可执行程序中都要用到的全局过程封装在一起,即把这些过程放在一个模块中统一说明,而在需要这些过程的程序单元内使用 USE 语句导出它们即可,这就是模块过程。使用的方式是,首先在模块中把待用的全局过程定义为模块的内部过程,即写在 CONTAINS 语句之后,在调用过程单元中写上 USE 语句以调用此模块,再写上接口块,接口块的实体是模块过程语句:
USE MODULE PROCEDURE 模块过程名表
例: PROGRAM CHANGE_KIND
USE Module1
INTERFACE DEFAULT
MODULE PROCEDURE Sub1, Sub2
END INTERFACE
integer(2) in
integer indef
indef = DEFAULT(in)
END PROGRAM
MODULE Module1
CONTAINS
FUNCTION Sub1(y)
REAL(8) y
sub1 = REAL(y)
END FUNCTION
FUNCTION Sub2(z)
INTEGER(2) z
sub2 = INT(z)
END FUNCTION
END MODULE
c) 公用派生类型
模块还可用来封装一些派生类型,供其它程序单元公用。例如:
MODULE SPARSE_MATRIX
TYPE NONEZERO
REAL A
INTEGER I,J
END TYPE
END MODULE SPARE_MATRIX
定义了一个由实数和两个整数构成的数据类型,用以表示稀疏矩阵的非零元素。其中的实数表示元素的值,两个整数表示该元素的下标。于是,派生类型 NONZERO 就可被其他单元通过 USE 语句来共用。
d) 全局可分配数组
在许多程序中需要一些全局公用的可分配数组,它们的大小在程序执行前是不知道的,这时也可用模块来实现。例如:
PROGRAM MAIN
…
CAIL CONFIGURE_ARRAYS !分配数组
CALL COMPUTE !用分配好的数组进行计算
…
END PROGRAM MAIN
MODULE WORK_ARRAYS
INTEGER N
REAL,ALLOATABLE,SAVE :: A(:),B(:,:),C(:,:,:)
END MODULE WORK_ARRAYS
SUBROUTINE CONFIGURE_ARRAYS
USE WORK_ARRAYS
READ *,N
ALLOCATE(A(N),B(N,N),C(N,N,2*N))
END SUBROUTINE CONFIGURE_ARRAYS
SUBROUTINE COMPUTE
USE WORK_ARRAYS
…
END SUBROUTINE COMPUTE
e) 抽象数据类型和超载运算
可以用模块来自定义抽象数据类型,为此只需在模块中先定义派生类型,再随后定义可在这种类型值上进行的运算即可。例如:
MODULE INTERVAL_ARITHMETIC
TYPE INTERVAL
REAL LOWER,UPPER
END TYPE INTERVAL
INTERFACE OPERATOR(+)
MODULE PROCEDURE COMB_INTERVALS
END INTERFACE
INTERFACE OPERATOR(*)
MODULE PROCEDURE INTERSECTION_INTERVALS
END INTERFACE
CONTAINS
FUNCTION COMB_INTERVALS(A,B)
TYPE(INTERVAL) COMB_INTERVALS,A,B
COMB_INTERVALS%LOWER=MIN(A&LOWER,B%LOWER)
COMB_INTERVALS%UPPER=MAX(A&UPPER,B%UPPER)
END FUNCTION
FUNCTION INTERSECTION_INTERVALS(A,B)
TYPE(INTERVAL) INTERSECTION_INTERVALS,A,B
INTERSECTION_INTERVALS%LOWER=MAX(A&LOWER,B%LOWER)
INTERSECTION_INTERVALS%UPPER=MIN(A&UPPER,B%UPPER)
END FUNCTION
END MODULE INTERVAL_ARITHMETIC
模块中定义了派生类型 INTERVAL,它表示一个实数区间,通过接口块说明定义的运算符‘+’和‘*’号,它们分别是求两个去见的并计和交集。
例:求π的计算。 [pi.f90]
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论