已阅读5页,还剩23页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
FORTRAN程序设计 扬州大学计算机中心 楚红 2007.1 第9部分 模块 l9.1 模块的定义 l9.2 USE语句 l9.3 接口块 l9.4 超载和定义操作符 l9.5 模块的应用 模块的定义 l模块定义的一般形式是: MODULE 模块名 类型说明部分 CONTAINS 内部过程子程序1 内部过程子程序N END MODULE 模块名 lMODULE是关键字,模块定义以MODULE语句开始,END MODULE 语句结束。模块名后面通常加后缀“_MODULE”(也可以不加该后缀), 以增强可读性。 模块的定义 l类型说明部分可以是类型说明语句、派生类型定义及接口块 等,但不能有执行语句、语句函数、ENTRY语句或 FORMAT语句。这些语句可以出现在模块所包含的内部过 程中。 l模块的内部过程以CONTAINS语句开始,这部分是可选的 。当模块有内部过程时,必须将整个过程完整地写入,各内 部过程次序可以任意。 l一个程序中可以有多个模块程序单元,每个模块程序单元都 要独立编写。 l模块名对程序来说是全局的,不能与本程序内的任何程序单 元名相同,也不得与模块内的任何局部变量同名。 模块的定义 l下面是一个包含模块内部过程的例子: MODULE MY_MODULE REAL,PARAMETER : PI=3.1415926 CONTAINS SUBROUTINE SWAP(X,Y) REAL TEMP,X,Y TEMP=X X=Y Y=TEMP END SUBROUTINE SWAP END MODULE MY_MODULE USE语句 lUSE语句的最简单形式为: lUSE 模块名1,模块名2,模块名N l这条语句提供了对模块的所有公共的有名数据对象、派生类型、接口块 、过程等的访问。 l在作用域单位内,USE语句必须出现在其他说明语句之前。 l如果需要对两个或两个以上的模块进行访问,可能会在不同的模块中用 到了相同的名字,因此允许USE语句对被访问的对象重新命名,以解决 局部对象和模块中访问对象之间的名字的冲突问题。要重新命名时, USE语句应具有下列形式: lUSE 模块名,更名表 l其中,更名表的形式为: l局部名=使用名,局部名=使用名, l例如: lUSE STATS_LIB, S_PROD=PROD USE语句 l对于只需要使用模块中的部分对象的情况,可在USE语句中 使用ONLY选项。这时USE语句具有下列形式: lUSE 模块名,ONLY:ONLY表 l其中,ONLY表的形式为: l局部名=使用名,局部名=使用名, l例如: lUSE STATS_LIB, ONLY:S_PROD=PROD, MULT 接口块 l要使编译器能够正确地调用子程序,它必须知道这个子程序 的一些信息,如程序名、变量的数目和变量的类型等。我们 将这些信息收集在一起,就称为子程序的接口。 l接口块必须放在调用程序的作用域内。 l接口块的一般形式为: lINTERFACE 类属说明 l 接口体 l 模块过程语句 lEND INTERFACE l接口块能将子程序中所需的信息精确的拷贝过来,通过它可 以为主调程序和被调用子程序指明一个显式接口。 几点应该注意 l(1) 接口块以INTERFACE语句开始,以END INTERFACE 语句结束,块内只能取被调用过程中的说名部分,不允许出 现任何可执行语句。 l(2) 类属说明的形式为: l类属名 l或OPERATOR(定义的运算符) l或ASSIGNMENT(=) l其中,类属名用于定义类属过程、OPERATOR用于定义运算 符、ASSIGNMENT用于超载赋值运算。 几点应该注意 l(3) 接口块内的语句称为接口体。接口体的形式为: l函数语句 l说明部分 l函数的END语句 l或 l子程序语句 l 说明部分 l子程序的END语句 l(4) 接口体中不能包含ENTRY语句、DATA语句、FORMAT语句或语句 函数。 l(5) 接口块不允许出现在BLOCK DATA程序单元中。 l(6) 当接口块说明的是一个模块的内部过程时,应使用模块过程语句来 说明。模块过程语句的形式为: lMODULE PROCEDURE 过程名表 几点应该注意 l(7) 只有当接口块中有一个类属说明,并且其宿主使一个模块或用USE语句使一 个模块可见时,才允许有模块过程语句。其中的各过程必须是其宿主中可见的 模块过程名。例如: lMODULE INTERVAL_ARITHMETIC lTYPE INTERVAL lREAL :LOWER, UPPER lEND TYPE INTERVAL lINTERFACE OPERATOR (+) l MODULE PROCEDURE COMB_INTERVALS lEND INTERFACE lCONTAINS lFUNCTION COMB_INTERVALS (A, B) l TYPE (INTERVAL):COMB_INTERVALS, A, B l COMB_INTERVALS%LOWER = MIN (A%LOWER, B%LOWER) l COMB_INTERVALS%UPPER = MAX (A%LOWER, B%LOWER) lEND FUNCTION COMB_INTERVALS l lEND MODULE INTERVAL_ARITHMETIC 几点应该注意 l(8) 一个辅程序中的接口块不允许含有一个被该辅程序定义的过程的接 口体。一个接口块中可以有多个接口体。 l(9) 接口块还可用来说明一个外部过程或虚过程,并为之提供显式的调 用接口,这比EXTERNAL语句提供了更多的信息,因而也提高了程序 的可读性。例如:下面是没有类属说明的接口块: lINTERFACE lSUBROUTINE EXT1 (X, Y, Z) lREAL ,DIMENSION ( 100, 100 ):X, Y, Z lEND SUBROUTINE EXT1 lFUNCTION EXT2 (P, Q) lLOGICAL :EXT2 lINTEGER :P (100) lLOGICAL :Q (200) lEND FUNCTION EXT2 lEND INTERFACE l这个接口块为过程EXT1、EXT2说明了显式接口。 超载和定义操作符 l类属过程 l类属过程是过程的一种。它允许不同类型的实参与同一个虚 参结合,放宽了虚实结合时类型必须一致的条件。 l例如,编写一个交换任意两个变量值的过程,但使用虚实结 合方式进行数据传递时,要求虚参和实参的类型必须一致, 这样我们就不能通过一个过程名来实现既能交换整型变量, 又能交换实型变量的操作。 l为此,可以用一个过程名SWAP来代表几个不同类型的交换 过程,各过程的名称不同,具体调用时根据实参类型选择相 应的过程,就像内在类属函数一样。 超载和定义操作符 MODULE SWAP_MODULE IMPLICIT NONE INTEGFACE SWAP MODULE PROCEDURE SWAP_INT, SWAP_REAL END INTERFACE CONTAINS SUBROUTINE SWAP_INT(A, B) INTEGER : A, B, TEMP TEMP = A; A = B; B = TEMP END SUBROUTINE SWAP_INT SUBROUTINE SWAP_REAL(A, B) REAL : A, B, TEMP TEMP = A; A = B; B = TEMP END SUBROUTINE SWAP_REAL END MODULE SWAP_MODULE PROGRAM TEST_SWAP USE SWAP_MODULE REAL : X = 1.1, Y = 2.2 INTEGER : I = 1, J = 2 CALL SWAP (X, Y) PRINT *, X, Y CALL SWAP (I, J) PRINT *, I, J END PROGRAM TEST_SWAP 运行结果: 2.2000000 1.1000000 2 1 超载和定义操作符 l超载赋值号 l在执行赋值语句时,赋值号“=”右边表达式的数据类型将会 转换为左边变量的数据类型并赋值。 l如果我们希望延伸这种功能,使得一个逻辑型的值能够赋予 一个整型变量. l如在执行赋值语句:I = L时(其中L是逻辑型,而I是整型), 使.FALSE.相当于0,使.TRUE.相当于1。 l需要编写一个过程完成此功能并用一个接口块来指明完成转 换的子程序名。 超载和定义操作符 MODULE INT_LOGICAL INTERFACE ASSIGNMENT (=) MODULE PROCEDURE INTEGER_GETS_LOGICAL END INTERFACE CONTAINS SUBROUTINE INTEGER_GETS_LOGICAL (I, L) INTEGER , INTENT (OUT) : I LOGICAL , INTENT (IN) : L IF (L) THEN I = 1 ELSE I = 0 END IF END SUBROUTINE INTEGER_GETS_LOGICAL END MODULE INT_LOGICAL PROGRAM TEST_INT_LOGICAL USE INT_LOGICAL IMPLICIT NONE INTEGER : I, J I=.FALSE. PRINT *, I J = .TRUE. PRINT *, J END PROGRAM TEST_INT_LOGICAL 运行结果: 0 1 超载赋值符的子程序必须只有两 个变量,第一个变量的INTENT 属性为OUT,第二个INTENT属 性为IN。 超载和定义操作符 l超载运算符 l如果我们希望用+代替.OR.,用*代替.AND.,用-代替.NOT. 来运算逻辑值,则可以用超载运算符来实现。 l需要在模块中写一个函数子程序和一个包含此函数子程序的 接口块。这种情况下INTERFACE语句中应包含关键字 OPERATOR。 超载和定义操作符 MODULE LOGICAL_PLUS INTERFACE OPERATOR (+) MODULE PROCEDURE LOG_PLUS_LOG END INTERFACE CONTAINS FUNCTION LOG_PLUS_LOG (X, Y) RESULT (LOG_PLUS_LOG_RES) LOGICAL : LOG_PLUS_LOG_RES LOGICAL, INTENT (IN) : X, Y LOG_PLUS_LOG_RES = X .OR. Y END FUNCTION LOG_PLUS_LOG END MODULE LOGICAL_PLUS PROGRAM TEST_LOGICAL_PLUS USE LOGICAL_PLUS IMPLICIT NONE PRINT *, .FALSE. + .FALSE. PRINT *, .TRUE. + .TRUE. PRINT *, (2.2 5.5) + (3.3 1.1) END PROGRAM TEST_LOGICAL_PLUS 运行结果: F T T 注意:第三条PRINT语语句中的 括号时时必须须的,因为为运算符“+”比 “”的运算优优先级级高。 超载载运算符的函数子程序必须须 有一个或者两个变变量(依赖赖于被超 载载的运算符),变变量的INTENT属 性必须须是IN。 超载和定义操作符 l用户定义的运算符 l除了可以“超载”FORTRAN固有的运算符之外,用户还可以定义新的运 算符。 l如果我们想在程序中加入判定一个整数是否为素数的运算,可能就没有 哪个FORTRAN固有的运算符适合于超载。这时,我们可以定义一个新 的运算符。 l它的名字应该是一个夹在两个“.”号之间长度介于1和31之间的一串字符 ,但这串字符不能与逻辑常量或者固有运算符相同。 l定义一个新的运算符与超载一个已有的运算符的方式基本相似,可以在 INTEGFACE语句中含有这个运算符的名字,定义运算的函数子程序应 该有一个或两个INTENT属性为IN的变量,函数子程序名应包含在 MODULE PROCEDURE语句中。 超载和定义操作符 lINTERFACE OPERATOR (.PRIME.) l MODULE PROCEDURE PRIME lEND INTERFACE l现在这个运算符就可以和其它一元运算符一样使用,例如下 面的IF语句: lIF(.PRIME. B .AND. B 100)THEN l一个自定义二元运算符的优先级总低于其他运算符,而一个 自定义一元运算符的优先级总高于其他运算符。 超载和定义操作符 l超载固有函数 l对于任何整数I,计算SQRT(REAL(I)和计算INT(SQRT(REAL(I)都不难,但如果只需写SQRT(I)则更 好。我们可以超载SQRT函数,使它对一个整型量进行运算并返回一个整型值。 MODULE INTEGER_SQRT INTERFACE SQRT MODULE PROCEDURE SQRT_INT END INTERFACE CONTAINS FUNCTION SQRT_INT(I) RUEULT(SQRT_INT_RESULT) INTEGER : SQRT_INT_RESULT INTEGER, INTENT (IN) : I SQRT_INT_RESULT = INT (SQRT (REAL (I) + 0.5) END FUNCTION END MODULE INTEGER_SQRT PROGRAM TEST_INTEGER_SQRT USE INTEGER_SQRT IMPLICIT NONE INTEGER : I I = 5 PRINT *, SQRT (I) END PROGRAM TEST_INTEGER_SQRT 模块的应用 l数据共享 l可以把一些在整个程序范围内都用到的数据(称全局数据)放在一个模块内统一说 明,在需要使用这些数据的程序单元内用USE语句使用它们即可。 lMODULE DATA_MODULE l SAVE l REAL :A, B (10,10), C (23,2:25) l INTEGER :D (-2:12) l COMPLEX :E (6, 8, 10) lEND MODULE l可以使用USE语句: lUSE DATA_MODULE !访问这个模块中的全部数据。 l或者使用语句: lUSE DATA_MODULE, ONLY: A, C !访问部分数据。 l为了避免名字冲突,还可以进行更名,例如可以用: lUSE DATA_MODULE, ADO = A, BEI = B 模块的应用 l模块还可以把一些将在整个可执行程序中都要用到的过程(称全局过程) 放在一个模块内的CONTAINS语句和END MODULE语句之间,作为内 部过程,共引用模块的各程序单元使用,以实现过程共享。例如:将求 四个变量之和与四个变量之积的函数作为模块内部程序写入模块中。 MODULE ABCD IMPLICIT NONE REAL : A, B, C, D CONTAINS FUNCTION ADD () RESULT (ADD_RE) REAL : ADD_RE ADD_RE = A+B+C+D END FUNCTION ADD FUNCTION PROD () RESULT (PROD_RE) REAL : PROD_RE PROD_RE = A*B*C*D END FUNCTION PROD END MODULE ABCD PROGRAM AP USE ABCD READ *, A, B, C, D PRINT *, ADD (), PROD () END PROGRAM AP 模块的应用 MODULE WORK_ARRAYS INTEGER :N REAL, ALLOCATABLE, SAVE : A(:), B(:, :), C(:, :, :) END MODULE WORK_ARRAYS PROGRAM MAIN USE WORK_ARRAYS CALL CONFIGURE_ARRAYS !分配数组 CALL COMPUTE !用分配好的数组进行计算 PRINT *, A; PRINT *, B; PRINT *, C END PROGRAM MAIN 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 DO I = 1, N A (I) = 1 DO J = 1, N B (I, J) = 1.8 * I * J DO K = 1, N C (I, J, K) = 0.2 * I * J / K END DO;END DO;END DO END SUBROUTINE COMPUTE 练习题 l一、选择题 1.下面的模块中,错误的语句是_。 A) MODULE MY_MOD B) REAL:PI C) PI=3.14 D) END MODULE MY_MOD 2.下面关于模块的描述中,不正确的是:_。 A) 模块是一种不能直接执行的程序单元 B) 模块名后面必须加后缀“_MODULE” C) 模块中类型说明部分不能有可执行语句 D) 一个程序中可以有多个模块程序单元 练习题 3.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 端午假期安全课件
- 办公楼安全知识培训课件
- 2025年二级建造师考试试题一附答案详解(精练)
- 2020年上海市《放射医学》测试卷(第560套)
- 2025年二级建造师考试通关提分题库及答案详解一套
- 印刷基础知识考核试题及答案
- 天文知识竞赛题
- 产品创新策略应用考试试卷
- 广东教师招聘教育综合基础知识模拟试题及答案一
- 食药安全主题班会课件
- 2025~2026学年四川省成都市高新技术产业开发区北师大版六年级上册期中数学试题(含答案)
- 老年医学进修汇报
- 电竞选手经纪合同范本
- 税务风险培训课件
- 2026年法律常识题库200道附参考答案【黄金题型】
- 静学系列主题班会课件:自习的“静”成长的“劲”
- 上海黄金交易所从业考试及答案解析
- 大陈唯舞课件
- 2025科级领导干部理论考试试题及答案
- 先天性心脏病护理
- 水声换能器装配工标准化作业考核试卷及答案
评论
0/150
提交评论