- 第一章 Fortran 语言程序设计初步
- 第二章 改变程序流程
- 第三章 循环结构
- 第四章 数据结构
- 第五章 数组
- 第六章 过程和模块
- 第七章 输入输出和文件
6.3.2 模块的用法
a) 定义模块
模块单元的一般形式是:
MODULE 模块名
类型说明部分
[CONTAINS
内部过程
…
[内部过程]]
END MODULE [模块名]
MODULE 语句下面写各种变量、数组等实体的类型说明语句,以及派生类型定义及接口块。注意到其中只有说明部分,没有执行部分。自 CONTAINS 语句开始连同它后面的各内部过程是可选的,一般不用。通常在为某一个派生类型规定新的操作符时,就把实现这些新操作的过程作为模块的内部过程放在 CONTAINS 后面,以便把这种操作定义供各外部过程共享。当模块有内部过程时,必须把整个过程完整地写入。各内部过程(可以是函数或子程序)次序可以任意。
模块程序单元可以不至一个,每个模块都独立编写,而后与主程序单元、外部过程单元一起输入机中编译、连接,才可以运行。
例: MODULE DATA_MODULE
REAL, DIMENSION(1:10) :: A
INTEGER, PARAMETER :: I=15
INTEGER :: B=5
END MODULE DATA_MODULE
这个例子中,模块的实体只有类型说明语句,没有内部过程。如果有某一个外部过程引用了这一模块,则相当于把其中的三条类型说明语句移到该外部过程的说明部分中,I 及 B 的初值传递给外部过程中同名的实体。
例: MODULE STUDENT_MODULE
TYPE STUDENT_TYPE
CHARACTER(LEN=20) :: NAME
INTEGER :: SCORE
END TYPE STUDENT_TYPE
END MODULE STUDENT_MODULE
该模块内把学生数据结构定义成一个派生类型。对于每个引用这个模块的外部过程而言,相当于把这一派生类型的定义移到自己的说明部分中,因而可以使用这个类型来说明程序体内的变量名。
例: MODULE MY_MODULE
REAL, PARAMETER :: Pi=3.141592654
CONTAINS
SUBROUTINE SWAP(X,Y)
REAL :: TEMP,X,Y
TEMP=X
X=Y
Y=TEMP
END SUBROUTINE SWAP
END MODULE MY_MODULE
该模块内有一内部过程 SWAP,引用这个模块的外部过程都将包含有此内部过程。
b) 引用模块
任何程序单元,要共享模块程序单元内的内容,只需引用该模块名,引用方法是在本程序单元说明部分的最前面加上 USE 语句。通过模块共享可以取代各程序单元间哑实结合,使有哑元的过程改为无哑元的过程。USE 语句的一般形式为:
USE 模块名 1, 模块名 2, … 模块名 n
USE 语句表示在本程序单元中引用了模块 1、模块 2、…、模块 n,即相当于把这些模块中的语句内容都移植到本程序单元内。使之其中的全部公用实体成为可访问的。USE 语句还可以有多种引用方式,可视不同需要灵活引用模块,譬如可以只对模块中一部分变量共享等。它包括两方面:模块定义时规定只有哪些内容允许共享、引用模块时只要求共享哪些内容。
模块的 PRIVATE 属性:
当定义派生类型的 TYPE 块写在模块中时,可以限制该派生类型定义的使用范围,以及类型定义内各成员的使用范围。譬如规定模块内的该派生类型或派生类型内的成员只供本模块内引用,不许模块外程序单元引用。其形式是:
TYPE,PRIVATE :: 派生类型名
成员 1 类型说明
……
成员 n 类型说明
END TYPE [派生类型名]
使用 PRIVATE 专用特性后,可以禁止一切外部过程(包括主程序)访问派生类型的内部成员,而只是把派生定义类型作为一个整体黑箱使用。以后如果派生类型内部成员要改动,只需改写派生类型部分,引用模块的各程序单元可不必改动。
模块内的变量改名:
如果需要对多个模块进行访问,而在不同的模块中可能用到了相同的名字,因此允许 USE 语句对被访问的实体重新命名,以解决局部实体和模块中访问实体之间的名字冲突问题。要重新命名时,USE 语句具有下列形式:
USE 模块名 [,改名列表]
其中,改名列表的形式为:局部名 1=>块中名 1, 局部名 2=>块中名 2, …。其中,局部名是使用 USE 语句的程序单元中用的名字,块中名是待改的模块内部使用的变量名。
如模块中定义的变量名是 A、B,程序单元中同名变量 A、B 与之共享,但若要在程序单元中把变量名改为 C、D,则只需在单元内把引用语句写成:
USE 模块名, C=>A, D=>B
即可,而无需修改模块。
ONLY 选项:
可以规定只取模块中一部分变量与本程序单元中实体共享,即只需要使用模块中的部分实体,其它实体没有共享关系。这时可在 USE 语句中使用 ONLY 选项。这时 USE 语句具有下列形式:
USE 模块名, ONLY : [,仅用名列表]
其中,仅用名列表的形式为:[局部名 1=>]块中名 1, [局部名 2=>]块中名 2, …。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

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