《Fortran的讲义第六章课件.ppt》由会员分享,可在线阅读,更多相关《Fortran的讲义第六章课件.ppt(31页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第六章第六章子程序子程序子程序的作用子程序的作用v 减少重复的代码减少重复的代码v 模块化编程的要求模块化编程的要求l l 本模块内重用本模块内重用本模块内重用本模块内重用l l 逐层分解问题,易于设计和维护逐层分解问题,易于设计和维护逐层分解问题,易于设计和维护逐层分解问题,易于设计和维护l l 相互隔离,减少干扰相互隔离,减少干扰相互隔离,减少干扰相互隔离,减少干扰l l 模块间重用模块间重用模块间重用模块间重用in.fornewfinalFortran程序的结构程序的结构Fortran90Fortran90程序程序程序程序programprogrammodulemoduleblock d
2、atablock datacontainscontainssubroutinesubroutinefunctionfunctioncontainscontainscontainscontainscontainscontains外部子程序外部子程序外部子程序外部子程序内部子程序内部子程序内部子程序内部子程序模块子程序模块子程序模块子程序模块子程序Fortran的子程序的子程序函数函数函数函数functionfunction子例行程序子例行程序子例行程序子例行程序subroutinesubroutine子程序子程序子程序子程序标准函数标准函数标准函数标准函数用户自定义函数用户自定义函数用户自定义函
3、数用户自定义函数语句函数语句函数语句函数语句函数内部函数内部函数内部函数内部函数外部函数外部函数外部函数外部函数模块函数模块函数模块函数模块函数标准子例行程序标准子例行程序标准子例行程序标准子例行程序用户自定义用户自定义用户自定义用户自定义子例行程序子例行程序子例行程序子例行程序内部内部内部内部子例行程序子例行程序子例行程序子例行程序外部外部外部外部子例行程序子例行程序子例行程序子例行程序模块子例行程序模块子例行程序模块子例行程序模块子例行程序v 函数函数函数函数(function)(function)l l 例:例:例:例:f=reshape(/1:6/),(/2,3/)f=reshape(
4、/1:6/),(/2,3/)Fortran的子程序的子程序v 子例行程序子例行程序子例行程序子例行程序(subroutine)(subroutine)l l 例:例:例:例:callcall date_and_timedate_and_time(date,time,zone,values)(date,time,zone,values)l 只只需要得到一个计算结果时使用需要得到一个计算结果时使用需要得到一个计算结果时使用需要得到一个计算结果时使用l 需要得到多个计算结果或需要执行其它操作时使用需要得到多个计算结果或需要执行其它操作时使用需要得到多个计算结果或需要执行其它操作时使用需要得到多个计算
5、结果或需要执行其它操作时使用标准子程序标准子程序ISO/IEC 1539-1标准函数标准函数标准子例行程序标准子例行程序v独立于主程序的程序模块独立于主程序的程序模块独立于主程序的程序模块独立于主程序的程序模块newfinal外部子程序(外部子程序(external procedure)v 存放的位置存放的位置存放的位置存放的位置l l 包括外部函数和外部子例行程序包括外部函数和外部子例行程序包括外部函数和外部子例行程序包括外部函数和外部子例行程序l l 一个文件只包含一个子程序一个文件只包含一个子程序一个文件只包含一个子程序一个文件只包含一个子程序l l一一一一个个个个文文文文件件件件包包包
6、包含含含含多多多多个个个个子子子子程程程程序序序序(可可可可以以以以放放放放在在在在主主主主程程程程序序序序文件中)文件中)文件中)文件中)v 外部函数外部函数外部函数外部函数exam_6_1l l functionfunction ()resultresult().endend function function 外部子程序(外部子程序(external procedure)l l functionfunction ()resultresult().endend function function l l|recursive recursive|pure pure|elemental ele
7、mentall l 调用:直接用函数名调用:直接用函数名调用:直接用函数名调用:直接用函数名v子程序的递归调用(子程序的递归调用(子程序的递归调用(子程序的递归调用(recursiverecursive)l l 子程序直接或间接地调用自身子程序直接或间接地调用自身子程序直接或间接地调用自身子程序直接或间接地调用自身l l 递归函数和递归子例行程序递归函数和递归子例行程序递归函数和递归子例行程序递归函数和递归子例行程序l l 递归程序结构清晰、简单递归程序结构清晰、简单递归程序结构清晰、简单递归程序结构清晰、简单l l 递归程序需要使用递归程序需要使用递归程序需要使用递归程序需要使用“递归工作栈
8、递归工作栈递归工作栈递归工作栈”,效率很低,效率很低,效率很低,效率很低l l 递归程序可以转化为非递归程序递归程序可以转化为非递归程序递归程序可以转化为非递归程序递归程序可以转化为非递归程序外部子程序(外部子程序(external procedure)参考书:严蔚敏、吴伟民编著,数据结构,清华大学出版社参考书:严蔚敏、吴伟民编著,数据结构,清华大学出版社参考书:严蔚敏、吴伟民编著,数据结构,清华大学出版社参考书:严蔚敏、吴伟民编著,数据结构,清华大学出版社v 外部子例行程序外部子例行程序外部子例行程序外部子例行程序exam_6_2l subroutinesubroutine ().enden
9、d subroutinesubroutine 子例行程序子例行程序子例行程序子例行程序名名名名 外部子程序(外部子程序(external procedure)l l recursive recursive|pure pure|elemental elementall l 调用调用调用调用:callcall ()v从属于主程序或外部子程序(从属于主程序或外部子程序(从属于主程序或外部子程序(从属于主程序或外部子程序(hosthost)内部子程序(内部子程序(internal procedure)l l 包括内部函数和内部子例行程序包括内部函数和内部子例行程序包括内部函数和内部子例行程序包括内部函
10、数和内部子例行程序l l位于位于位于位于containscontains之后,之后,之后,之后,endend之前之前之前之前exam_6_3l l 可以使用可以使用可以使用可以使用hosthost程序中定义的变量程序中定义的变量程序中定义的变量程序中定义的变量l l内内内内部部部部定定定定义义义义的的的的变变变变量量量量如如如如果果果果和和和和hosthost程程程程序序序序中中中中定定定定义义义义的的的的变变变变量量量量重重重重名名名名,则则则则覆盖掉覆盖掉覆盖掉覆盖掉hosthost程序中的变量程序中的变量程序中的变量程序中的变量l l 模块内的重复使用模块内的重复使用模块内的重复使用模块
11、内的重复使用l l 仅可被仅可被仅可被仅可被hosthost程序和同一模块中的其它内部子程序调用程序和同一模块中的其它内部子程序调用程序和同一模块中的其它内部子程序调用程序和同一模块中的其它内部子程序调用语句函数(语句函数(statement function)v从属于主程序或外部子程序(从属于主程序或外部子程序(从属于主程序或外部子程序(从属于主程序或外部子程序(hosthost)l l Fortran95Fortran95中废除,可用内部函数替代中废除,可用内部函数替代中废除,可用内部函数替代中废除,可用内部函数替代exam_6_4l l (形参表)(形参表)(形参表)(形参表)l l 模
12、块内的重复使用模块内的重复使用模块内的重复使用模块内的重复使用子程序和其它程序模块之间的数据交换方式子程序和其它程序模块之间的数据交换方式全局变量全局变量全局变量全局变量函数名函数名函数名函数名实参形参实参形参实参形参实参形参公用区公用区公用区公用区子程序子程序模块模块模块模块文件文件文件文件其它程序模块其它程序模块 形参与实参之间的关系形参与实参之间的关系v形参(形参(形参(形参(formal argumentformal argument)虚参、哑参(虚参、哑参(虚参、哑参(虚参、哑参(dummy argumentdummy argument)l l 变量、子程序、变量、子程序、变量、子程
13、序、变量、子程序、*l l 属性:属性:属性:属性:intentintent(in,out,in,out,inoutinout),optional,optional l l 形参的个数不宜太多形参的个数不宜太多形参的个数不宜太多形参的个数不宜太多 形参与实参之间的关系形参与实参之间的关系v实参(实参(实参(实参(actual argumentactual argument)l l 表达式(常量、变量)、子程序表达式(常量、变量)、子程序表达式(常量、变量)、子程序表达式(常量、变量)、子程序l l 实参和形参的数据传递关系实参和形参的数据传递关系实参和形参的数据传递关系实参和形参的数据传递关系
14、 类型(应该匹配)类型(应该匹配)类型(应该匹配)类型(应该匹配)位置(顺次对应或按关键字对应)位置(顺次对应或按关键字对应)位置(顺次对应或按关键字对应)位置(顺次对应或按关键字对应)引用传递(引用传递(引用传递(引用传递(call by referencecall by reference)值传递(值传递(值传递(值传递(call by valuecall by value)exam_6_5 个数(相等或省略)个数(相等或省略)个数(相等或省略)个数(相等或省略)形参与实参之间的关系形参与实参之间的关系v变量作为形参变量作为形参变量作为形参变量作为形参l l 形参为基本数据类型变量(注意字
15、符型变量)形参为基本数据类型变量(注意字符型变量)形参为基本数据类型变量(注意字符型变量)形参为基本数据类型变量(注意字符型变量)l l 形参为指针变量形参为指针变量形参为指针变量形参为指针变量l l 形参为派生数据类型变量形参为派生数据类型变量形参为派生数据类型变量形参为派生数据类型变量exam_6_6形参与实参之间的关系形参与实参之间的关系l l 形参为数组形参为数组形参为数组形参为数组 静态显式静态显式静态显式静态显式 自动数组(自动数组(自动数组(自动数组(automatic arrayautomatic array)可调数组(可调数组(可调数组(可调数组(adjustable arr
16、ayadjustable array)假定大小数组假定大小数组假定大小数组假定大小数组(assumed-sizeassumed-size)undesirableundesirable,用假定形状的数组代替用假定形状的数组代替用假定形状的数组代替用假定形状的数组代替 假定形状数组假定形状数组假定形状数组假定形状数组(assumed-shapeassumed-shape)exam_6_7,actcol.forexam_6_8exam_6_9exam_6_10exam_6_11 可分配数组可分配数组可分配数组可分配数组(allocatableallocatable array array)Fortr
17、an95Fortran95:不能作为形参,不能作为形参,不能作为形参,不能作为形参,Fortran2019Fortran2019:可以作为形参:可以作为形参:可以作为形参:可以作为形参exam_6_12v子程序作为形参子程序作为形参子程序作为形参子程序作为形参l l 外部子程序外部子程序外部子程序外部子程序exam_6_13形参与实参之间的关系形参与实参之间的关系l l 部分标准子程序部分标准子程序部分标准子程序部分标准子程序l l 模块子程序模块子程序模块子程序模块子程序exam_6_13v*(Alternate returnAlternate return)作为形参)作为形参)作为形参)作
18、为形参 (Fotran90,Fortran95 Fotran90,Fortran95 中作废中作废中作废中作废)v保留子程序中变量的值保留子程序中变量的值保留子程序中变量的值保留子程序中变量的值l l savesave 和和和和 datadataexam_6_14l l datadata不能给形参赋初值不能给形参赋初值不能给形参赋初值不能给形参赋初值l l datadata只给变量赋一次初值只给变量赋一次初值只给变量赋一次初值只给变量赋一次初值l l Visual Visual Fortran Fortran 默默默默认认认认所所所所有有有有用用用用datadata赋赋赋赋值值值值的的的的变变
19、变变量量量量,以以以以及及及及内内内内部部部部变变变变量量量量都都都都有有有有savesave属属属属性性性性。如如如如果果果果要要要要去去去去掉掉掉掉savesave属属属属性性性性,应应应应该用该用该用该用automaticautomatic属性,但是这是非标准的属性,但是这是非标准的属性,但是这是非标准的属性,但是这是非标准的形参与实参之间的关系形参与实参之间的关系v 接口是子程序和其它模块之间的界面,包括:接口是子程序和其它模块之间的界面,包括:接口是子程序和其它模块之间的界面,包括:接口是子程序和其它模块之间的界面,包括:l l 子程序名及其属性(包括函数返回值)子程序名及其属性(包
20、括函数返回值)子程序名及其属性(包括函数返回值)子程序名及其属性(包括函数返回值)l l 形参名及其属性形参名及其属性形参名及其属性形参名及其属性l l 类属标识符(类属标识符(类属标识符(类属标识符(generic identifiergeneric identifier),用于重载),用于重载),用于重载),用于重载子程序接口子程序接口(Interface)子程序接口子程序接口(Interface)l l 显式接口(显式接口(显式接口(显式接口(explicit interfaceexplicit interface)编译器自动获得子程序的接口信息,不需要显式说明编译器自动获得子程序的接口
21、信息,不需要显式说明编译器自动获得子程序的接口信息,不需要显式说明编译器自动获得子程序的接口信息,不需要显式说明l l 隐式接口(隐式接口(隐式接口(隐式接口(implicit interfaceimplicit interface)编译器不能自动获得子程序的接口信息,需要显式说明编译器不能自动获得子程序的接口信息,需要显式说明编译器不能自动获得子程序的接口信息,需要显式说明编译器不能自动获得子程序的接口信息,需要显式说明 标准子程序、内部子程序、模块子程序标准子程序、内部子程序、模块子程序标准子程序、内部子程序、模块子程序标准子程序、内部子程序、模块子程序 外部子程序、形参子程序外部子程序、
22、形参子程序外部子程序、形参子程序外部子程序、形参子程序v编编编编译译译译器器器器知知知知道道道道子子子子程程程程序序序序的的的的接接接接口口口口后后后后才才才才能能能能检检检检查查查查子子子子程程程程序序序序调调调调用过程的合法性,或完成特定的编译工作用过程的合法性,或完成特定的编译工作用过程的合法性,或完成特定的编译工作用过程的合法性,或完成特定的编译工作l l interfaceinterface module procedure module procedure end interface end interface l l|operator operator|assignmentass
23、ignmentl l :子程序去掉可执行语句、子程序去掉可执行语句、子程序去掉可执行语句、子程序去掉可执行语句、entryentry、datadata、formatformat、语句函数后剩下的部分语句函数后剩下的部分语句函数后剩下的部分语句函数后剩下的部分exam_6_1、exam_6_5、exam_6_11、exam_6_15子程序接口子程序接口(Interface)v显式说明子程序接口的语句显式说明子程序接口的语句显式说明子程序接口的语句显式说明子程序接口的语句 接口界面块接口界面块接口界面块接口界面块l l界面接口块可以放在主程序、外部子程序或模块中界面接口块可以放在主程序、外部子程序
24、或模块中界面接口块可以放在主程序、外部子程序或模块中界面接口块可以放在主程序、外部子程序或模块中l l界界界界面面面面接接接接口口口口块块块块属属属属于于于于说说说说明明明明部部部部分分分分,在在在在一一一一个个个个程程程程序序序序单单单单元元元元内内内内,一一一一般般般般放放放放在变量说明之前(在变量说明之前(在变量说明之前(在变量说明之前(implicit none implicit none 之后)之后)之后)之后)l l在在在在一一一一个个个个程程程程序序序序单单单单元元元元内内内内,一一一一个个个个子子子子程程程程序序序序只只只只能能能能有有有有一一一一次次次次显显显显式式式式接接接
25、接口口口口说说说说明明明明。因因因因此此此此除除除除非非非非重重重重载载载载子子子子程程程程序序序序名名名名,显显显显式式式式接接接接口口口口子子子子程程程程序序序序(标标标标准准准准子子子子程序、内部子程序、模块子程序)不能出现在接口块中程序、内部子程序、模块子程序)不能出现在接口块中程序、内部子程序、模块子程序)不能出现在接口块中程序、内部子程序、模块子程序)不能出现在接口块中子程序接口子程序接口(Interface)l l 具有以下特征的外部子程序:具有以下特征的外部子程序:具有以下特征的外部子程序:具有以下特征的外部子程序:有可选择的形参有可选择的形参有可选择的形参有可选择的形参 形参
26、中有假定形状数组、指针或目标变量形参中有假定形状数组、指针或目标变量形参中有假定形状数组、指针或目标变量形参中有假定形状数组、指针或目标变量 函数的返回值是数组或指针函数的返回值是数组或指针函数的返回值是数组或指针函数的返回值是数组或指针 字符串型函数,但字符串长度既不是常数字符串型函数,但字符串长度既不是常数字符串型函数,但字符串长度既不是常数字符串型函数,但字符串长度既不是常数 也不是假定长度(也不是假定长度(也不是假定长度(也不是假定长度(*)exam_6_6 子程序是子程序是子程序是子程序是elementalelemental的的的的exam_6_11exam_6_5exam_6_1子
27、程序接口子程序接口(Interface)v必须使用接口界面块的情况必须使用接口界面块的情况必须使用接口界面块的情况必须使用接口界面块的情况l l 调用子程序时出现下面情况:调用子程序时出现下面情况:调用子程序时出现下面情况:调用子程序时出现下面情况:使用了关键字使用了关键字使用了关键字使用了关键字 使用了类属标识符调用子程序使用了类属标识符调用子程序使用了类属标识符调用子程序使用了类属标识符调用子程序(多态多态多态多态)赋值号重载赋值号重载赋值号重载赋值号重载 操作符重载操作符重载操作符重载操作符重载 要求子程序是要求子程序是要求子程序是要求子程序是purepure的时候的时候的时候的时候ex
28、am_6_5子程序接口子程序接口(Interface)v 重载(重载(重载(重载(overloadingoverloading)l l 子程序重载(子程序重载(子程序重载(子程序重载(generic namegeneric name)实现多态功能实现多态功能实现多态功能实现多态功能 一个子程序名与若干个不同的子程序相关联,调一个子程序名与若干个不同的子程序相关联,调一个子程序名与若干个不同的子程序相关联,调一个子程序名与若干个不同的子程序相关联,调 用时根据参数类型选择相应的子程序。用时根据参数类型选择相应的子程序。用时根据参数类型选择相应的子程序。用时根据参数类型选择相应的子程序。exam_
29、6_16l l 操作符重载(只能用函数,至少一个形参是操作符重载(只能用函数,至少一个形参是操作符重载(只能用函数,至少一个形参是操作符重载(只能用函数,至少一个形参是inin)exam_6_17 重载已有操作符重载已有操作符重载已有操作符重载已有操作符 自定义操作符自定义操作符自定义操作符自定义操作符l l 赋值号重载赋值号重载赋值号重载赋值号重载 (只能用子例行程序,第一个形参是(只能用子例行程序,第一个形参是(只能用子例行程序,第一个形参是(只能用子例行程序,第一个形参是outout或或或或inoutinout)exam_6_18子程序接口子程序接口(Interface)其它和子程序相关
30、的内容其它和子程序相关的内容ventryentry语句语句语句语句 (undesirableundesirable)l l 使一个子程序有多个入口点使一个子程序有多个入口点使一个子程序有多个入口点使一个子程序有多个入口点 IFIF(num.GE.0)(num.GE.0)THENTHEN SUBROUTINESUBROUTINE Sign Sign CALL CALL Sign Sign WRITEWRITE(*,*)(*,*)It”sIt”s positive.positive.ELSEELSE RETURNRETURN CALLCALL Negative Negative ENTRYENTR
31、Y Negative Negative END IFEND IF WRITEWRITE(*,*)(*,*)It”sIt”s negative.negative.END SUBROUTINEEND SUBROUTINE l l在新编的程序中最好不要再使用在新编的程序中最好不要再使用在新编的程序中最好不要再使用在新编的程序中最好不要再使用entryentry其它和子程序相关的内容其它和子程序相关的内容v混合语言编程混合语言编程混合语言编程混合语言编程l l为什么需要使用混合语言编程?为什么需要使用混合语言编程?为什么需要使用混合语言编程?为什么需要使用混合语言编程?利用已有的资源利用已有的资源利用
32、已有的资源利用已有的资源充分利用不同语言的特色,以达到如下目的:充分利用不同语言的特色,以达到如下目的:充分利用不同语言的特色,以达到如下目的:充分利用不同语言的特色,以达到如下目的:(1 1)提高程序的效率(比如调用汇编语言程序)提高程序的效率(比如调用汇编语言程序)提高程序的效率(比如调用汇编语言程序)提高程序的效率(比如调用汇编语言程序)(2 2)易于维护和修改程序(比如面向对象的机制)易于维护和修改程序(比如面向对象的机制)易于维护和修改程序(比如面向对象的机制)易于维护和修改程序(比如面向对象的机制)(3 3)实现某种特定的功能(比如对端口的读写)实现某种特定的功能(比如对端口的读写
33、)实现某种特定的功能(比如对端口的读写)实现某种特定的功能(比如对端口的读写)running_time其它和子程序相关的内容其它和子程序相关的内容l l混合语言编程的要点(混合语言编程的要点(混合语言编程的要点(混合语言编程的要点(参考彭国伦书参考彭国伦书参考彭国伦书参考彭国伦书12-512-5节或节或节或节或VFVF帮助帮助帮助帮助)子程序的命名机制子程序的命名机制子程序的命名机制子程序的命名机制 (1 1)是否区分大小写?)是否区分大小写?)是否区分大小写?)是否区分大小写?(2 2)OBJOBJ文件中子程序名的命名规则?文件中子程序名的命名规则?文件中子程序名的命名规则?文件中子程序名的
34、命名规则?子程序的调用机制(堆栈的使用规则)子程序的调用机制(堆栈的使用规则)子程序的调用机制(堆栈的使用规则)子程序的调用机制(堆栈的使用规则)子程序的参数传递机制子程序的参数传递机制子程序的参数传递机制子程序的参数传递机制 (1 1)Call by value or call by reference?Call by value or call by reference?(2 2)不同数据类型传递的信息是什么)不同数据类型传递的信息是什么)不同数据类型传递的信息是什么)不同数据类型传递的信息是什么?exam_6_19、exam_6_20v 显式形状数组(显式形状数组(显式形状数组(显式形状
35、数组(explicit-shapeexplicit-shape)Fortran数组的种类数组的种类v 假定形状数组(假定形状数组(假定形状数组(假定形状数组(assumed-shapeassumed-shape)v 假定大小数组(假定大小数组(假定大小数组(假定大小数组(assumed-sizeassumed-size)v 延迟形状数组(延迟形状数组(延迟形状数组(延迟形状数组(deferred-shapedeferred-shape)l l 静态显式静态显式静态显式静态显式l l 自动数组(自动数组(自动数组(自动数组(automatic arrayautomatic array)l l 可调数组(可调数组(可调数组(可调数组(adjustable arrayadjustable array)l l 可分配数组(可分配数组(可分配数组(可分配数组(allocatableallocatable array array)l l 数组指针数组指针数组指针数组指针动态数组动态数组动态数组动态数组静态数组静态数组静态数组静态数组谢谢你的阅读v知识就是财富v丰富你的人生
限制150内