fortran第11章过程和模块_第1页
fortran第11章过程和模块_第2页
fortran第11章过程和模块_第3页
fortran第11章过程和模块_第4页
fortran第11章过程和模块_第5页
已阅读5页,还剩114页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、下一页上一页停止放映整理整理ppt第第1 1页页第十一章第十一章: : 过程和模块过程和模块 11.1 概述概述FORTRANFORTRAN程序应由一个主程序单元和若干个过程程序单元组成。程序应由一个主程序单元和若干个过程程序单元组成。编程前应先作结构化分析,把问题分解为若干个子功能,每个子编程前应先作结构化分析,把问题分解为若干个子功能,每个子功能编成一个独立的程序单元,称为过程程序单元。再编一个主功能编成一个独立的程序单元,称为过程程序单元。再编一个主程序单元,控制整个解题过程。在主程序单元中用简练的形式调程序单元,控制整个解题过程。在主程序单元中用简练的形式调用每个过程,每次调用就是执行

2、该过程单元,完成该子功能,从用每个过程,每次调用就是执行该过程单元,完成该子功能,从而最终完成解题任务。而最终完成解题任务。F90F90中,共有四种程序单元:中,共有四种程序单元: 主程序主程序 过程或辅程序过程或辅程序 块数据单元块数据单元 模块模块 ( (F90) 通过使用模块,可以方便地共享数据和过程。通过使用模块,可以方便地共享数据和过程。 各种程序单元中,除主程序外,各程序单元可以被其他各种程序单元中,除主程序外,各程序单元可以被其他程序单元甚至自身调用。程序单元甚至自身调用。 一个程序单元不需要包含可执行语句。一个程序单元不需要包含可执行语句。下一页上一页停止放映整理整理ppt第第

3、2 2页页程序单元程序单元定义定义主程序主程序主程序是程序开始执行的标志,其第一条语句不能是主程序是程序开始执行的标志,其第一条语句不能是SUBROUTINESUBROUTINE,FUNCTIONFUNCTION,MODULEMODULE和和BLOCK DATABLOCK DATA。主程序可以用。主程序可以用PROGRAMPROGRAM语句作为第语句作为第一条语句,但不是必需的一条语句,但不是必需的过程过程子程序或函数子程序或函数块数据单元块数据单元在命名的公共块中提供变量初始值的程序单元在命名的公共块中提供变量初始值的程序单元模块模块包含数据对象定义、类型定义、函数或子程序接口和其它程序可访

4、包含数据对象定义、类型定义、函数或子程序接口和其它程序可访问的函数或子程序问的函数或子程序程序单元之间的关系:程序单元之间的关系: 联合:这种机制允许不同的程序单元共享变量,从而联合:这种机制允许不同的程序单元共享变量,从而不用重新定义变量就可以以不同的名字处理同一数据。不用重新定义变量就可以以不同的名字处理同一数据。 范围:它描述的是一个名称范围:它描述的是一个名称( (或者是全局的或者是局部的或者是全局的或者是局部的) )作用的范围。作用的范围。下一页上一页停止放映整理整理ppt第第3 3页页11.2 主程序主程序程序的执行始终是开始于主程序的第一条可执行语句,所程序的执行始终是开始于主程

5、序的第一条可执行语句,所以每个完整的以每个完整的FortranFortran程序必须有且仅有一个主程序。程序必须有且仅有一个主程序。其形式为:其形式为:PROGRAM PROGRAM 程序名程序名 说明部分说明部分 可执行部分可执行部分 CONTAINSCONTAINS内部过程内部过程 END PROGRAMEND PROGRAM程序名程序名可以看到,主程序单元中允许包含内部过程。主程序名和外可以看到,主程序单元中允许包含内部过程。主程序名和外部过程名和公共块名都被认为是部过程名和公共块名都被认为是全局名称全局名称。全局名称在一个全局名称在一个程序中必须是唯一的。程序中必须是唯一的。 下一页上

6、一页停止放映整理整理ppt第第4 4页页例:例:PROGRAM MAINPROGRAM MAIN REAL X(10),A(10,10),B(10) REAL X(10),A(10,10),B(10) ! !说明部分说明部分 CALL GAUSS(A,B,X) CALL GAUSS(A,B,X) ! !执行部分,调用内部过程执行部分,调用内部过程GAUSSGAUSS CONTAINSCONTAINS SUBROUTINE GAUSS(R,S,T) SUBROUTINE GAUSS(R,S,T) ! !内部过程的开始内部过程的开始 END SUBROUTINE GAUSS END SUBROUT

7、INE GAUSS ! !内部过程的结束内部过程的结束 EHD PROGRAM MAINEHD PROGRAM MAIN下一页上一页停止放映整理整理ppt第第5 5页页下图显示的是一个下图显示的是一个F90F90程序的标准结构。每个框都可程序的标准结构。每个框都可以是一个独立的源文件:以是一个独立的源文件:Program A1Use module ACall BContains内部子程序或内部函数End Program A1Module AContains模块子程序或函数Subroutine B(外部子程序)下一页上一页停止放映整理整理ppt第第6 6页页 Fortran Fortran可以定

8、义一个过程就是指它是一个函数或是一个子程序。可以定义一个过程就是指它是一个函数或是一个子程序。 过程的引用就是调用一个过程。过程的引用就是调用一个过程。 建立过程的目的就是建立可多次重复执行的程序段,以便多次建立过程的目的就是建立可多次重复执行的程序段,以便多次调用它们。通常过程是带有参数的,在调用它们。通常过程是带有参数的,在FortranFortran中把参数称为变元中把参数称为变元(实元或哑元),过程定义中的变元是哑元,过程引用中的变元是(实元或哑元),过程定义中的变元是哑元,过程引用中的变元是实元。在调用过程时,要用实元代替哑元,这就是哑实结合。实元。在调用过程时,要用实元代替哑元,这

9、就是哑实结合。 11.3过程过程下一页上一页停止放映整理整理ppt第第7 7页页 类型:类型: 外部过程:外部过程:它是在某个外部程序单元中定义的独立过程,或它是在某个外部程序单元中定义的独立过程,或是用非是用非FortranFortran语言编写的过程。语言编写的过程。 内部过程:内部过程:在程序单元内部定义而且只能被该程序单元调用。在程序单元内部定义而且只能被该程序单元调用。 内在过程:内在过程:由编译系统内部定义,不用任何附加声明或说明就由编译系统内部定义,不用任何附加声明或说明就可以可直接引用。可以可直接引用。模块过程:模块过程:它在模块中定义,可以被所有使用该模块的程序调它在模块中定

10、义,可以被所有使用该模块的程序调用。包含过程的模块称为宿主。用。包含过程的模块称为宿主。哑过程哑过程 :如果一个哑元被指明为过程或作为过程名出现在过如果一个哑元被指明为过程或作为过程名出现在过程引用中,那么该哑元代表的过程为一个哑过程。程引用中,那么该哑元代表的过程为一个哑过程。语句函数:语句函数:它是由单个语句定义的函数,其形式为:它是由单个语句定义的函数,其形式为: 函数名函数名(哑元名表哑元名表)标量表达式标量表达式 F90F90不推荐使用,因为它不符合过程的一般规则。不推荐使用,因为它不符合过程的一般规则。 下一页上一页停止放映整理整理ppt第第8 8页页 特性特性 将过程分为将过程分

11、为函数函数和和子程序子程序的分类特性和它的哑元的特性,的分类特性和它的哑元的特性,对于函数还包括有结果的特性。对于函数还包括有结果的特性。 一个哑元可以是一个一个哑元可以是一个虚拟数据对象、哑过程或作为选择返虚拟数据对象、哑过程或作为选择返回指示符的星号回指示符的星号。当一个哑元不是星号时,它可有。当一个哑元不是星号时,它可有OPTIONALOPTIONAL属属性,表示对该过程引用时不需要有实元与该哑元结合。性,表示对该过程引用时不需要有实元与该哑元结合。 一个一个哑元哑元数据对象的主要特性包括它的类型、种别值、形数据对象的主要特性包括它的类型、种别值、形状、输入输出意向状、输入输出意向(IN

12、TENT)(INTENT)、是否可选、是否可选(OPTIONAL)(OPTIONAL)、是否一个、是否一个指针指针(POINTER)(POINTER)或目标或目标(TARGET)(TARGET)。 哑过程的特性哑过程的特性包括其接口是否显式给出、作为过程的特性包括其接口是否显式给出、作为过程的特性( (如果其接口显式给出如果其接口显式给出) )以及它是否可选。以及它是否可选。 函数结果函数结果的主要特性包括它的类型、类别值、秩以及是否的主要特性包括它的类型、类别值、秩以及是否指针等。指针等。 下一页上一页停止放映整理整理ppt第第9 9页页 1外部过程外部过程 如果过程是一个独立于主程序单元的

13、程序单元,它就是外如果过程是一个独立于主程序单元的程序单元,它就是外部过程。部过程。 外部过程也可以通过非外部过程也可以通过非FortranFortran语言语言( (通常是汇编语言通常是汇编语言) )来定义。来定义。 外部过程可以单独以源文件存储和编译,也可以包括在主程序外部过程可以单独以源文件存储和编译,也可以包括在主程序源代码的源代码的ENDEND语句后。语句后。 外部过程本身也可以包含有内部函数或内部子程序。外部过程本身也可以包含有内部函数或内部子程序。外部过程的形式有两种:外部过程的形式有两种:外部函数外部函数 :FUNCTIONFUNCTION语句语句 说明部分说明部分 可执行部分

14、可执行部分 CONTAINSCONTAINS内部过程内部过程 END FUNTIONEND FUNTION函数名函数名 外部子程序:外部子程序:SUBROUTINESUBROUTINE语句语句 说明部分说明部分 可执行部分可执行部分 CONTAINSCONTAINS内部过程内部过程 END SUBROUTINEEND SUBROUTINE子程序名子程序名 下一页上一页停止放映整理整理ppt第第1010页页 外部子程序外部子程序:SUBROUTINESUBROUTINE一般形式为:一般形式为: 前缀前缀SUBROUTINE SUBROUTINE 子程序子程序名名(哑元列表哑元列表) . . EN

15、D SUBROUTINE END SUBROUTINE子程序名子程序名前缀前缀是是F90F90中新增的,它可以是:中新增的,它可以是: 类型说明类型说明 关键词关键词 或或关键词关键词 类型说明类型说明 。 关键词关键词是:是:RECURSIVE RECURSIVE (F90)(F90) RECURSIVERECURSIVE表示过程时可以直接或间接地调用自身,即递表示过程时可以直接或间接地调用自身,即递归调用,其过程是递归过程。归调用,其过程是递归过程。 子程序名只是用来作标识,不代表任何值。子程序名只是用来作标识,不代表任何值。下一页上一页停止放映整理整理ppt第第1111页页哑元可以是变量

16、名、数组名、过程名、指针名等均哑元可以是变量名、数组名、过程名、指针名等均可作为哑元。可作为哑元。 哑元表中的哑元个数,理论上不受限制,但从软件哑元表中的哑元个数,理论上不受限制,但从软件工程观点看,不宜过多,一般不应超过六、七个。如工程观点看,不宜过多,一般不应超过六、七个。如果太多,意味着该子程序的算法较复杂,应该把该过果太多,意味着该子程序的算法较复杂,应该把该过程再分解为几个子功能分别编写成几个子程序程再分解为几个子功能分别编写成几个子程序 哑元列表哑元列表是子程序与调用单元之间进行数据传送的主是子程序与调用单元之间进行数据传送的主要渠道,当有一个以上哑元时,它们之间用逗号隔开,要渠道

17、,当有一个以上哑元时,它们之间用逗号隔开,如果没有哑元,则一对括号可以省略。如果没有哑元,则一对括号可以省略。 从从SUBROUTINESUBROUTINE语句后面一直到语句后面一直到ENDEND语句则是子程序语句则是子程序体。它的说明部分应包括对哑元和子程序中所用变量、体。它的说明部分应包括对哑元和子程序中所用变量、数组等的说明,它的执行语句部分完成运算和操作功数组等的说明,它的执行语句部分完成运算和操作功能。其中的能。其中的ENDEND语句或语句或RETURNRETURN语句使执行流程返回到调语句使执行流程返回到调用单元。用单元。下一页上一页停止放映整理整理ppt第第1212页页调用子程序

18、形式为:调用子程序形式为: CALLCALL子程序名子程序名(实元列表实元列表) 调用子程序时的实元是和哑元相同类型的变量、数组元调用子程序时的实元是和哑元相同类型的变量、数组元素、数组和常数。当用素、数组和常数。当用CALLCALL语句予以调用时,哑元和实元语句予以调用时,哑元和实元才按列表顺序一一对应,取得同一数值。才按列表顺序一一对应,取得同一数值。注意:注意:但使用常数时要避免下例中的常数替换式,否则但使用常数时要避免下例中的常数替换式,否则将导致不可预料的错误,应尽可能用变量作实元。将导致不可预料的错误,应尽可能用变量作实元。s=1.s=1.CALL bai(1.)CALL bai(

19、1.)PRINTPRINT* *,s,sEND END 例:例:SUBROUTINE bai(x)SUBROUTINE bai(x) REAL : x REAL : x x x=2.=2.* *x x END END下一页上一页停止放映整理整理ppt第第1313页页 外部函数外部函数 :FUNCTIONFUNCTION的一般形式为:的一般形式为: f77f77 类型说明类型说明FUNCTION FUNCTION 函数名函数名(哑元列表哑元列表) . . END END f90f90 前缀前缀 FUNCTION FUNCTION 函数名函数名(哑元列表哑元列表)RESULT()RESULT(结果

20、名结果名) . . END FUNCTION END FUNCTION函数函数名名 下一页上一页停止放映整理整理ppt第第1414页页 如果没有哑元,则哑元表是一个空括号。如果没有哑元,则哑元表是一个空括号。 RESULTRESULT是关键字,要照写,后面括号内的变量名就是函是关键字,要照写,后面括号内的变量名就是函数计算的结果值。数计算的结果值。 函数结果变量名有值,必须在说明语句中说明类型,在函数结果变量名有值,必须在说明语句中说明类型,在程序执行部分中至少赋值一次。在引用时,它的值就是程序执行部分中至少赋值一次。在引用时,它的值就是函数值。函数值。 函数结果名不可列入哑元表。如果没有结果

21、名,则函数函数结果名不可列入哑元表。如果没有结果名,则函数名就是结果名。名就是结果名。 F90F90中之所以增添了结果名功能,就是为了区别函数字中之所以增添了结果名功能,就是为了区别函数字面上的名称面上的名称( (函数名函数名) )和实际运算结果变量的名称。和实际运算结果变量的名称。下一页上一页停止放映整理整理ppt第第1515页页函数调用一般形式:函数调用一般形式: 函数名函数名( (实元表实元表) ) 函数名函数名()() 系统在该位置上返回以该实元为自变量的函数结果值,系统在该位置上返回以该实元为自变量的函数结果值,参加表达式的运算。参加表达式的运算。例如,下面都是合法的例如,下面都是合

22、法的FUNCTIONFUNCTION语句:语句:FUNCTION FUN1FUNCTION FUN1FUNCTION FUN2()FUNCTION FUN2()INTEGER FUNCTION FUN3(A,B)INTEGER FUNCTION FUN3(A,B)RECURSIVE FUNCTION FUN4(X,Y,Z)RECURSIVE FUNCTION FUN4(X,Y,Z)REAL RECURSIVE FUNCTION FUN5(M,N) RESULT(R_FUN5)REAL RECURSIVE FUNCTION FUN5(M,N) RESULT(R_FUN5)下一页上一页停止放映整理

23、整理ppt第第1616页页 FUNCTION FUNCTION hexhex(n)(n) CHARACTER(LEN=8) : hex CHARACTER(LEN=8) : hex CHARACTER(LEN=1) : h(0:15) = CHARACTER(LEN=1) : h(0:15) = (/ 0, 1, 2, 3, 4, & (/ 0, 1, 2, 3, 4, & 5, 6,7, 8, 9, A, B, C, D, E, F /)5, 6,7, 8, 9, A, B, C, D, E, F /) INTEGER, INTENT(IN) : n INTEGER, INT

24、ENT(IN) : n INTEGER : nin, j, nn INTEGER : nin, j, nn hex = hex = nin = n ! n nin = n ! n仅用于输入,不能再被赋值。仅用于输入,不能再被赋值。 DO j = 8, 1, -1DO j = 8, 1, -1nn = nin/16nn = nin/16hexhex(j:j) = h(nin-16(j:j) = h(nin-16* *nn)nn)IF(nn = 0) EXITIF(nn = 0) EXITnin = nnnin = nn END DO END DO END FUNCTION END FUNCTIO

25、N例:将一个例:将一个4 4字节的整数用字节的整数用1616进制表示出来。进制表示出来。 下一页上一页停止放映整理整理ppt第第1717页页PROGRAM mainPROGRAM mainCHARACTER(LEN=8) : CHARACTER(LEN=8) : hex hex ! !函数名的类型在引用侧也须加以声明函数名的类型在引用侧也须加以声明INTEGER : iINTEGER : iPRINT PRINT * *, , Input a positive Integer or negative one to stop:Input a positive Integer or negativ

26、e one to stop:DODO READ READ * *, i; IF( i0 ) EXIT , i; IF( i0)SUM(A,DIM=2,MASK=A0)。 下一页上一页停止放映整理整理ppt第第5252页页编写有可选择变元的过程时,编写有可选择变元的过程时,可选择变元必须说明具有可选择变元必须说明具有OPTIONALOPTIONAL属性,并要使用属性,并要使用PRESETPRESET内在函数内在函数。 一个哑元是否为可选哑元,看它是否有一个哑元是否为可选哑元,看它是否有OPTIONALOPTIONAL属性,属性,有有OPTIONALOPTIONAL属性的哑元是可选变元,没有属性的

27、哑元是可选变元,没有OPTIONALOPTIONAL属性的属性的哑元是必选的。哑元是必选的。 内在函数内在函数PRESETPRESET用来反映它的自变量是否在程序执用来反映它的自变量是否在程序执行部分中出现。行部分中出现。 PRESET(A)PRESET(A)的值是一个逻辑值,当的值是一个逻辑值,当A A出现(被使用到)出现(被使用到)时,函数值为真,否则为假。利用时,函数值为真,否则为假。利用PRESETPRESET函数的真假值,函数的真假值,可以通过可以通过IFIF构造作出变元是否出现时的不同算法。构造作出变元是否出现时的不同算法。 下一页上一页停止放映整理整理ppt第第5353页页例如,

28、要求编一子程序,既能求四边形周长例如,要求编一子程序,既能求四边形周长(A+B+C+D)(A+B+C+D)的的值,也能求三角形周长值,也能求三角形周长(A+B+C)(A+B+C)的值。此时的值。此时D D就是可选择变就是可选择变元,并规定当元,并规定当D D不出现时,置不出现时,置D D值为零。值为零。子程序如下:子程序如下:SUBROUTINE SUM(S,A,B,C,D)SUBROUTINE SUM(S,A,B,C,D)IMPLICIT NONEIMPLICIT NONEREAL,INTENT(IN) : A,B,CREAL,INTENT(IN) : A,B,CREAL,INTENT(IN

29、),OPTIONAL : DREAL,INTENT(IN),OPTIONAL : DREAL,INTENT(OUT) : SREAL,INTENT(OUT) : SREAL : TEMPREAL : TEMPIF(IF(PRESET(D)PRESET(D) THEN) THENTEMP=DTEMP=DELSEELSETEMP=0.TEMP=0.END IFEND IFS=A+B+C+S=A+B+C+TEMPTEMPEND SUBROUTINE SUM END SUBROUTINE SUM 下一页上一页停止放映整理整理ppt第第5454页页 类属过程类属过程 类属过程是过程的一种,它允许用不同类

30、型的实元与类属过程是过程的一种,它允许用不同类型的实元与同一个哑元结合,也即放宽了哑实元结合时类型必须一致同一个哑元结合,也即放宽了哑实元结合时类型必须一致的条件。的条件。 编写类属过程的方法是先编写若干个功能相同的过程,编写类属过程的方法是先编写若干个功能相同的过程,它们分别以整型、实型、复型等作哑元类型。而后在主调它们分别以整型、实型、复型等作哑元类型。而后在主调程序中编写接口,为接口取一个统一的名,接口内分别列程序中编写接口,为接口取一个统一的名,接口内分别列出哑元类型不同的过程说明部分语句。这个出哑元类型不同的过程说明部分语句。这个统一的接口名统一的接口名就是类属过程名就是类属过程名,

31、可以在后面执行部分中用不同类型的实,可以在后面执行部分中用不同类型的实元作哑实结合。元作哑实结合。下一页上一页停止放映整理整理ppt第第5555页页例如,要编写求两数之和的类属函数时,分别编写哑元例如,要编写求两数之和的类属函数时,分别编写哑元是实型和整型的函数:是实型和整型的函数:FUNCTION SUM_REAL(A,B) RESULT(SUM_REAL_RESULT)FUNCTION SUM_REAL(A,B) RESULT(SUM_REAL_RESULT)REAL : A,BREAL : A,B,SUM_REAL_RESULT,SUM_REAL_RESULTSUM_REAL_RESUL

32、T=A+BSUM_REAL_RESULT=A+BEND FUNCTION SUM_REALEND FUNCTION SUM_REALFUNCTION SUM_INTEGER(A,B) RESULT(SUM_INTEGER_RESULT)FUNCTION SUM_INTEGER(A,B) RESULT(SUM_INTEGER_RESULT)INTEGER :INTEGER : A,BA,B,SUM_INTEGER_RESULT,SUM_INTEGER_RESULTSUM_INTEGER_RESULT=A+BSUM_INTEGER_RESULT=A+BEND FUNCTION SUM_INTEGE

33、REND FUNCTION SUM_INTEGER下一页上一页停止放映整理整理ppt第第5656页页PROGRAM SUMMATIONPROGRAM SUMMATIONIMPLICIT NONEIMPLICIT NONEINTERFACEINTERFACE MY_SUM MY_SUMFUNCTION SUM_REAL(A,B) RESULT(SUM_REAL_RESULT)FUNCTION SUM_REAL(A,B) RESULT(SUM_REAL_RESULT)REAL : A,B,SUM_REAL_RESULTREAL : A,B,SUM_REAL_RESULTEND FUNCTION S

34、UM_REALEND FUNCTION SUM_REALFUNCTION SUM_INTEGER(A,B) RESULT(SUM_INTEGER_RESULT)FUNCTION SUM_INTEGER(A,B) RESULT(SUM_INTEGER_RESULT)INTEGER : A,B,SUM_INTEGER_RESULTINTEGER : A,B,SUM_INTEGER_RESULTEND FUNCTION SUM_INTEGEREND FUNCTION SUM_INTEGEREND INTERFACEEND INTERFACEREAL : X,YREAL : X,YINTEGER :

35、I,JINTEGER : I,JREAD READ * *, X,Y,I,J, X,Y,I,JPRINT PRINT * *, , MY_SUM(X,Y),MY_SUM(I,J)MY_SUM(X,Y),MY_SUM(I,J)END PROGRAM SUMMATION END PROGRAM SUMMATION 现在把这两个函数过程综合成一个类属函数,类属函数名取现在把这两个函数过程综合成一个类属函数,类属函数名取为为MY_SUMMY_SUM,在主调程序应写明如下接口:,在主调程序应写明如下接口:下一页上一页停止放映整理整理ppt第第5757页页 哑元改名哑元改名过程的优点是具有广泛通用性,一旦

36、编好,解各种问题的过程的优点是具有广泛通用性,一旦编好,解各种问题的主程序都可调用它。但是在为不同目的而使用时,具体问主程序都可调用它。但是在为不同目的而使用时,具体问题的物理名称不同。为了加强可读性与可维护性,在不同题的物理名称不同。为了加强可读性与可维护性,在不同领域使用过程时,需把哑元名称改为与该领域中的物理名领域使用过程时,需把哑元名称改为与该领域中的物理名称一致,而称一致,而F90F90允许改变变元名称。名称的改变是在接口允许改变变元名称。名称的改变是在接口块中进行的,所以主调程序中要写出接口块。块中进行的,所以主调程序中要写出接口块。 例如,对于上面求周长的子程序,如调用时欲把哑元

37、名例如,对于上面求周长的子程序,如调用时欲把哑元名A,B,C,DA,B,C,D改为物理意义明确的名称改为物理意义明确的名称UPPER,DOWN,LEFT,RIGHTUPPER,DOWN,LEFT,RIGHT,只需在主调程序中写入接口块,在接口块的哑元表中用新的只需在主调程序中写入接口块,在接口块的哑元表中用新的哑元名即可:哑元名即可:下一页上一页停止放映整理整理ppt第第5858页页PROGRAM SUMMATIONPROGRAM SUMMATIONINTERFACEINTERFACESUBROUTINE SUM(S,UPPER,DOWN,LEFT,RIGHT)SUBROUTINE SUM(S

38、,UPPER,DOWN,LEFT,RIGHT)IMPLICIT NONEIMPLICIT NONEREAL,INTENT(IN) : UPPER,DOWN,LEFTREAL,INTENT(IN) : UPPER,DOWN,LEFTREAL,INTENT(IN),OPTIONAL : RIGHTREAL,INTENT(IN),OPTIONAL : RIGHTREAL,INTENT(OUT) : SREAL,INTENT(OUT) : SREAL : TEMPREAL : TEMPEND SUBROUTINE SUMEND SUBROUTINE SUMEND INTERFACEEND INTERF

39、ACEREAD READ * *, UPPER,DOWN,LEFT,RIGHT, UPPER,DOWN,LEFT,RIGHTCALL SUBROUTINE SUM(S,UPPER,DOWN,LEFT,RIGHT)CALL SUBROUTINE SUM(S,UPPER,DOWN,LEFT,RIGHT) END PROGRAM SUMMATION END PROGRAM SUMMATION 下一页上一页停止放映整理整理ppt第第5959页页 2内部过程内部过程内部过程内部过程是包含于外部过程、模块或主程序单元之中的程是包含于外部过程、模块或主程序单元之中的程序单元序单元。在宿主程序单元中,以。在宿

40、主程序单元中,以CONTAINSCONTAINS(包含)语句把(包含)语句把内部过程与其他部分分开。内部过程也具有两种形式:内部过程与其他部分分开。内部过程也具有两种形式:内部函数内部函数 :FUNCTIONFUNCTION语句语句 说明部分说明部分 可执行部分可执行部分 END FUNTIONEND FUNTION函数名函数名 注意注意: :内部过程中不能再包含内部过程,即内部过程中不能再包含内部过程,即F90F90不是过程嵌套不是过程嵌套式语言。式语言。 内部子程序内部子程序:SUBROUTINESUBROUTINE语句语句 说明部分说明部分 可执行部分可执行部分 END SUBROUTI

41、NEEND SUBROUTINE子程序名子程序名 下一页上一页停止放映整理整理ppt第第6060页页在在F77F77中,中,个源文件可以包含一个主程序和几个分别个源文件可以包含一个主程序和几个分别独立的函数或子程序(相当于独立的函数或子程序(相当于F90F90中的外部过程)。中的外部过程)。在在F90F90中,可以中,可以将若干个过程用将若干个过程用CONTAINSCONTAINS结构包含在主结构包含在主程序里,它们与宿主程序单元共享变量名程序里,它们与宿主程序单元共享变量名。而且,外部。而且,外部过程等其它程序单元都可以有自己的内部过程。过程等其它程序单元都可以有自己的内部过程。 例:例:p

42、rogram internalprogram internal real a,b,c real a,b,c call find call find print print * *,c,c containscontains subroutine find subroutine find read read * *, a,b, a,b c=sqrt(a c=sqrt(a* * *2+b2+b* * *2)2) end subroutine find end subroutine find end end下一页上一页停止放映整理整理ppt第第6161页页使用内部过程的规则:使用内部过程的规则:在宿主

43、中不要定义子程序名和函数名的类型,也不能指在宿主中不要定义子程序名和函数名的类型,也不能指定它们是有定它们是有EXTERNALEXTERNAL属性。属性。宿主中的变量名和数组名等在内部过程中有效,有相同宿主中的变量名和数组名等在内部过程中有效,有相同的数值。但同一名若在内部过程中又进行了类型声明,则的数值。但同一名若在内部过程中又进行了类型声明,则此名被视为其过程中的独立变量,无相同的数值。此名被视为其过程中的独立变量,无相同的数值。内部过程中也可引用另一内部过程。内部过程中也可引用另一内部过程。下一页上一页停止放映整理整理ppt第第6262页页内部过程的重要特征:内部过程的重要特征:没有说明

44、语句。它们的变量与主程序同名变量的值是没有说明语句。它们的变量与主程序同名变量的值是相通的。主程序内可以直接引用内部过程变量的值,或相通的。主程序内可以直接引用内部过程变量的值,或赋之以值,也即主程序内定义的变量是全局的,作用于赋之以值,也即主程序内定义的变量是全局的,作用于以以PROGRAMPROGRAM语句到语句到END PROGRAMEND PROGRAM语句之间的所有场合。语句之间的所有场合。一般没有哑元。调用内部过程时只要简单地写一个过一般没有哑元。调用内部过程时只要简单地写一个过程名。这是内部过程与外部过程的很大区别。程名。这是内部过程与外部过程的很大区别。在特殊情况下,内部过程也

45、可保留由自己单独说明的在特殊情况下,内部过程也可保留由自己单独说明的少量哑元。如果变量是在内部子程序中单独说明的,它少量哑元。如果变量是在内部子程序中单独说明的,它只是局部变量,作用域只能是局部的,对其主程序的其只是局部变量,作用域只能是局部的,对其主程序的其它部分不起作用。主程序调用时仍需通过哑实结合来传它部分不起作用。主程序调用时仍需通过哑实结合来传送数据。送数据。下一页上一页停止放映整理整理ppt第第6363页页 3内在过程内在过程内在过程是内在过程是FortranFortran含于编译器程序库中的过程,它不需含于编译器程序库中的过程,它不需任何其它声明或说明即可使用。任何其它声明或说明

46、即可使用。F90F90中定义了中定义了113113个内在过个内在过程,它们为科学计算提供了极大方便,其具体使用方法请程,它们为科学计算提供了极大方便,其具体使用方法请查看查看Visual FortranVisual Fortran的联机帮助。内在过程共分为四类:的联机帮助。内在过程共分为四类:1 1、查询函数、查询函数:它们的返回值是:它们的返回值是根据变元的性质根据变元的性质而非变元而非变元的取值。的取值。2 2、基本过程、基本过程:由变元指明的基本过程由变元指明的基本过程,但可以用标量或,但可以用标量或数组实元进行调用。有许多函数是这种基本函数,并有一数组实元进行调用。有许多函数是这种基本

47、函数,并有一种基本内在子程序。如果变元是标量,则结果也是标量。种基本内在子程序。如果变元是标量,则结果也是标量。如果变元是数组,则对数组的每个元素施加过程,其结果如果变元是数组,则对数组的每个元素施加过程,其结果是与变元形状相同的数组。是与变元形状相同的数组。 例如,例如,a a是数组的话,则是数组的话,则b=sin(a)b=sin(a)也是数组。也是数组。 下一页上一页停止放映整理整理ppt第第6464页页3 3、变换函数、变换函数:其变元是数组,但过程不施加于每个元素,而:其变元是数组,但过程不施加于每个元素,而是把变元变换成另一数组。是把变元变换成另一数组。4 4、非基本过程、非基本过程

48、:只能以标量实元进行调用,内在子程序都是:只能以标量实元进行调用,内在子程序都是非基本过程。非基本过程。如果要用内在过程名作为其它过程的实元,需要用如果要用内在过程名作为其它过程的实元,需要用INTRINSICINTRINSIC语句语句加以声明。加以声明。下一页上一页停止放映整理整理ppt第第6565页页 11.4 共享方式共享方式 共享就是让编译系统把两个变量名分配在同一个内存单共享就是让编译系统把两个变量名分配在同一个内存单元中。已知访问一个变量名,实际上就是访问它所分配的元中。已知访问一个变量名,实际上就是访问它所分配的内存单元中存贮的值。既然内存单元中存贮的值。既然A A程序单元中的变

49、量程序单元中的变量X X与与B B程序单程序单元中的变量元中的变量Y Y分配在同一存贮单元中,访问分配在同一存贮单元中,访问X X或访问或访问Y Y都是访都是访问同一个内存单元,取得的数也是相同的。问同一个内存单元,取得的数也是相同的。 如果两个变量共享存贮单元,当如果两个变量共享存贮单元,当A A程序单元中程序单元中X=2X=2时,时,B B程程序单元中序单元中Y Y也是也是2 2。如果。如果A A程序单元中执行语句程序单元中执行语句X=X+1X=X+1,则,则B B程程序单元中序单元中Y Y的值也变为的值也变为3 3,反之也然。当然,前提是,反之也然。当然,前提是X X和和Y Y的的类型必

50、须一致。如果类型不一致,其结果将很难预料。类型必须一致。如果类型不一致,其结果将很难预料。共享方式有以下几种:共享方式有以下几种: COMMONCOMMON语句语句 EQUIVALENCEEQUIVALENCE语句语句 模块模块 INCLUDEINCLUDE语句可进行语句段复制。语句可进行语句段复制。 (F77)(F77)(F90)(F90)下一页上一页停止放映整理整理ppt第第6666页页 一、一、 COMMON语句语句 F77F77中不同程序单元间数据的共享通常是用中不同程序单元间数据的共享通常是用COMMONCOMMON和和EQUIVALENCEEQUIVALENCE语句,使用这些语句共

51、享数据的效率不高,编程语句,使用这些语句共享数据的效率不高,编程时容易出错。但时容易出错。但F90F90仍保留了这两个语句以兼容以前的标准。仍保留了这两个语句以兼容以前的标准。 COMMONCOMMON语句用于语句用于在不同程序单元之间进行实体的数据批量在不同程序单元之间进行实体的数据批量传递,传递,它比哑实结合的方法进行数据传递的速度要快。其方法它比哑实结合的方法进行数据传递的速度要快。其方法是开辟一个公共块,公共块可以是无名的是开辟一个公共块,公共块可以是无名的( (只能有一个只能有一个) ),也可,也可以是有名称的,其一般形式为:以是有名称的,其一般形式为:COMMON /COMMON

52、/公共块名公共块名1/1/变量名表变量名表1,/1,/公共块名公共块名2/2/变量名表变量名表2.2.公共块名可以和变量名相同,变量实体名不得是哑元、可分配公共块名可以和变量名相同,变量实体名不得是哑元、可分配数组、自动对象、函数名或函数结果名或数组、自动对象、函数名或函数结果名或ENTRYENTRY名,并且不得有名,并且不得有PARAMETERPARAMETER属性。属性。不同程序单元中相同公用名下的变量名可以是不同的。相同公不同程序单元中相同公用名下的变量名可以是不同的。相同公用名中的变量在不同程序单元中,用名中的变量在不同程序单元中,按位置一一对应共享同一存储按位置一一对应共享同一存储单

53、元中的数值。单元中的数值。由于由于COMMONCOMMON语句是说明语句,它的位置必须在可执行语句之前,语句是说明语句,它的位置必须在可执行语句之前,通常是紧跟在程序单元的起始句之后,一个程序单元可以有多条通常是紧跟在程序单元的起始句之后,一个程序单元可以有多条COMMONCOMMON语句。语句。下一页上一页停止放映整理整理ppt第第6767页页例如:下面的例如:下面的COMMONCOMMON语句段语句段COMMON/happy/we,you,theyCOMMON/happy/we,you,theyCOMMON/ /our,your,theirCOMMON/ /our,your,theirCO

54、MMON/happy/i,he,sheCOMMON/happy/i,he,sheCOMMON/angry/dog,cat,mouseCOMMON/angry/dog,cat,mouseCOMMON my,his,herCOMMON my,his,her等价于语句段,等价于语句段,COMMON/happy/we,you,they,i,he,sheCOMMON/happy/we,you,they,i,he,sheCOMMON/angry/dog,cat,mouseCOMMON/angry/dog,cat,mouseCOMMON/ /our,your,their,my,his,herCOMMON/

55、/our,your,their,my,his,her其中,有两条有名公共块语句,而其中,有两条有名公共块语句,而/是无名的。是无名的。 下一页上一页停止放映整理整理ppt第第6868页页由于各个程序单元中的变量名是独立的,它们并不会因由于各个程序单元中的变量名是独立的,它们并不会因为名字相同而建立起数值的联系。为名字相同而建立起数值的联系。例如,主程序中名为例如,主程序中名为X X的变量和子程序中的的变量和子程序中的X X变量虽然同变量虽然同名,但它们各有自己的存储单元,互不相关。名,但它们各有自己的存储单元,互不相关。但如果我们在主程序和子程序的说明部分各自都增加一但如果我们在主程序和子程序

56、的说明部分各自都增加一条无名共用区语句:条无名共用区语句:COMMON XCOMMON X,则,则FORTRANFORTRAN编译程序在编译程序在存储区中开辟了一个公用数据区,主程序和子程序中的存储区中开辟了一个公用数据区,主程序和子程序中的COMMONCOMMON语句中的第一个变量共同占用公共块的第一个存语句中的第一个变量共同占用公共块的第一个存储单元,达到数据共享。储单元,达到数据共享。下一页上一页停止放映整理整理ppt第第6969页页例如:主程序中的语句例如:主程序中的语句COMMON X,Y,Z(3),ICOMMON X,Y,Z(3),I和子程序中的语句和子程序中的语句COMMON A

57、,B,C(3),JCOMMON A,B,C(3),J使得无名公共块中变量使得无名公共块中变量X X和和A A,Y Y和和B B,数组,数组Z Z和和C C,I I和和J J分分别被分配在相同的存储单元中。占同一个存储单元的那别被分配在相同的存储单元中。占同一个存储单元的那些变量在不同的程序单位中,它们的名字不需要相同。些变量在不同的程序单位中,它们的名字不需要相同。COMMONCOMMON语句还可用来声明数组,例如:语句还可用来声明数组,例如:COMMON /food/restruant(100),McDonald(10)COMMON /food/restruant(100),McDonald

58、(10)这条语句已经按这条语句已经按I-NI-N规则声明了实型数组和整型数组,规则声明了实型数组和整型数组,无需用无需用DIMENSIONDIMENSION语句或属性对数组名重新说明。如果语句或属性对数组名重新说明。如果要重新定义类型的话,则数组大小不得在要重新定义类型的话,则数组大小不得在COMMONCOMMON语句和语句和类型说明语句中重复出现。类型说明语句中重复出现。 下一页上一页停止放映整理整理ppt第第7070页页SUBROUTINE unit1SUBROUTINE unit1REAL(8)x(5)REAL(8)x(5)INTEGER JINTEGER JCHARACTER strC

59、HARACTER str* *1212TYPE(member) club(50)TYPE(member) club(50)COMMON/blocka/x,j,str,clubCOMMON/blocka/x,j,str,club . .SUBROUTINE unit2SUBROUTINE unit2REAL(8) z(5)REAL(8) z(5)INTEGER mINTEGER mCHARACTER chrCHARACTER chr* *1212TYPE(member) myclub(50)TYPE(member) myclub(50)COMMON/blocka/z,m,chr,myclub C

60、OMMON/blocka/z,m,chr,myclub 下一页上一页停止放映整理整理ppt第第7171页页 二、二、 EQUIVALENCE语句语句 EQUIVALENCEEQUIVALENCE语句是说明语句,它必须出现在程序单元的语句是说明语句,它必须出现在程序单元的执行语句之前。执行语句之前。变量表中,可以是变量名、数组名或数组元素等,但至少应该变量表中,可以是变量名、数组名或数组元素等,但至少应该有两个变量名,之间用逗号分开。有两个变量名,之间用逗号分开。作用:作用: 使使同一个程序单元中的两个或更多的变量共用同一同一个程序单元中的两个或更多的变量共用同一个存储单元个存储单元,以节省内存。这里特别需要强

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论