返回介绍

6.3.3 模块的应用

发布于 2025-03-08 16:28:37 字数 3158 浏览 0 评论 0 收藏 0

引入模块给程序设计带来了诸多方便,模块可应用于以下几个方面。

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文