Fortran讲义 第六章

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
exam_6_3
语句函数 (statement function) function)
从属于主程序或外部子程序(host) 从属于主程序或外部子程序(host)
模块内的重复使用
exam_6_4
<函数名>(形参表)=<标量表达式> 函数名> 形参表) 标量表达式>
Fortran95中废除 Fortran95中废除,可用内部函数替代 中废除,
标准 子程 序 标准函数 ISO/IEC 1539-1 1539-
标准子例行程序
外部子程序 (external procedure) procedure)
独立于主程序的程序模块
包括外部函数和外部子例行程序
存放的位置
一个文件包含多个子程序( 一个文件包含多个子程序 ( 可以放在主程 序文件中) 序文件中) 一个文件只包含一个子程序
子程序接 口 (Interface)
exam_6_1、exam_6_5 、exam_6_11、exam_6_15
显式说明子程序接口的语句—— 显式说明子程序接口的语句—— 接口界面块
<接口界面块>→interface [<类属说明>] 接口界面块> [<类属说明 类属说明>] {<接口体 {<接口体>} 接口体>} {module procedure <模块子程序名> } 模块子程序名> end interface [<类属说明>] [<类属说明 类属说明>] <类属说明>→<generic name> | operator | assignment 类属说明>→<generic name> <接口体>:子程序去掉可执行语句、 entry、data、 接口体> 子程序去掉可执行语句、 entry、data、 format、 format、语句函数后剩下的部分
模块内的重复使用 包括内部函数和内部子例行程序 位于contains之后 end之前 位于contains之后,end之前 之后, 可以使用host程序中定义的变量 可以使用host程序中定义的变量 内部定义的变量如果和host 程序中定义的变量重名 内部定义的变量如果和 host程序中定义的变量重名 , 程序中定义的变量重名, 则覆盖掉host程序中的变量 则覆盖掉host程序中的变量 仅可被host程序和同一模块中的其它内部子程序调用 仅可被host程序和同一模块中的其它内部子程序调用
子程序接 口 (Interface)
必须使用接口界面块的情况
具有以下特征的外部子程序: 具有以下特征的外部子程序: 有可选择的形参 形参中有假定形状数组、 形参中有假定形状数组、指针或目标变量 函数的返回值是数组或指针 字符串型函数, 字符串型函数,但字符串长度既不是常数 也不是假定长度( 也不是假定长度(*) 子程序是elemental的 子程序是elemental的
<前缀>→recursive | pure| elemental 前缀> pure| 调用: 调用: call <子例行程序名>[(<形参表>)] 子例行程序名>[( 形参表>
内部子程序 (internal procedure) procedure)
从属于主程序或外部子程序(host) 从属于主程序或外部子程序(host)
第六章 子程序
子程序 的作用
模块化编程的要求
逐层分解问题, 逐层分解问题,易于设计和维护 相互隔离, 相互隔离,减少干扰
in.for
减少重复的代码
本模块内重用 模块间重用
newfinal
Fortran 程序的结 构
Fortran90程序 Fortran90程序 program 外部子程序 subroutine contains 内部子程序 contains function contains contains 模块子程序 module block data
参考书:严蔚敏、吴伟民编著,《数据结构》,清华大学出版社 参考书:严蔚敏、吴伟民编著, 数据结构》
外部子程序 (external procedure) procedure)
外部子例行程序
exam_6_2
[<前缀 [<前缀>] subroutine <子例行程序名>[(<形参表>)] 前缀> 子例行程序名>[( 形参表> ... end [subroutine 子例行程序名] 子例行程序名
undesirable, undesirable,用假定形状的数组代替
exam_6_7, actcol.for exam_6_8 exam_6_9 exam_6_10
假定形状数组(assumed-shape) 假定形状数组(assumed-shape) 可分配数组( 可分配数组(allocatable array) array)
exam_6_14
子程序接 口 (Interface)
接口是子程序和其它模块之间的界面,包括: 接口是子程序和其它模块之间的界面,包括:
子程序名及其属性(包括函数返回值) 子程序名及其属性(包括函数返回值)
形参名及其属性
类属标识符( 类属标识符(generic identifier),用于重载 identifier)
子程序接 口 (Interface)
编译器知道子程序的接口后才能检查子程序调 用过程的合法性, 用过程的合法性,或完成特定的编译工作
显式接口( 显式接口(explicit interface) interface) 编译器自动获得子程序的接口信息, 编译器自动获得子程序的接口信息,不需要显式说明 标准子程序、内部子程序、 标准子程序、内部子程序、模块子程序 隐式接口( 隐式接口(implicit interface) interface) 编译器不能自动获得子程序的接口信息, 编译器不能自动获得子程序的接口信息,需要显式说明 外部子程序、 外部子程序、形参子程序
子程序和其它程序模 块之间的数据交换方 式
公用区
子程序
全局变量
其它程序模块
形参与实参 之间的关系
形参( 形参(formal argument) argument) 虚参、哑参( 虚参、哑参(dummy argument) argument)
变量、子程序、 变量、子程序、*
属性:intent(in, out, inout), optional inout) 属性:intent(
只需要得到一个计算结果时使用 例:f = reshape((/1:6/), (/2,3/)) reshape((/1 (/2
子例行程序(subroutine) 子例行程序(subroutine)
需要得到多个计算结果或需要执行其它操作时使用 例:call date_and_time ( date, time, zone, values )
子程序接 口 (Interface)
界面接口块可以放在主程序、 界面接口块可以放在主程序、外部子程序或模块中 界面接口块属于说明部分,在一个程序单元内, 界面接口块属于说明部分,在一个程序单元内,一般放 在变量说明之前( 在变量说明之前(implicit none 之后) 之后) 在一个程序单元内, 在一个程序单元内, 一个子程序只能有一次显式接口说 明。 因此 除非重载子程序名, 显式接口子程序( 标准子 因此除非重载子程序名 显式接口子程序( 除非重载子程序名, 程序、内部子程序、模块子程序) 程序、内部子程序、模块子程序)不能出现在接口块中
exam_6_11 exam_6_12
Fortran95:不能作为形参,Fortran2003: Fortran95:不能作为形参,Fortran2003:可以作为形参
形参与实参 之间的关系
子程序作为形参
外部子程序 部分标准子程序 模块子程序
exam_6_13
exam_6_13
* (Alternate return)作为形参 return) (Fotran90, Fortran95 中作废) Fotran90, Fortran95 中作废)
newfinal
外部子程序 (external procedure) procedure)
外部函数
exam_6_1
[<前缀 [<前缀>] function <函数名>([<形参表>]) [result(<结果名>)] 前缀> 函数名 ([<形参表> result(<结果名 结果名> ... end [function <函数名>] 函数名 function <函数名>([<形参表>]) [result(<结果名>)] 函数名 ([<形参表> result(<结果名 结果名> <前缀> <函数名> 前缀> <函数 函数名 ... end [function <函数名>] 函数名 <前缀>→<类型说明> | recursive | pure| elemental 前缀>→<类型说明 类型说明> pure| 调用:直接用函数名 调用:
外部子程序 (external procedure) procedure)
子程序的递归调用(recursive) 子程序的递归调用(recursive)
子程序直接或间接地调用自身 递归函数和递归子例行程序 递归程序结构清晰、 递归程序结构清晰、简单 递归程序需要使用“递归工作栈” 递归程序需要使用“递归工作栈”,效率很低 递归程序可以转化为非递归程序
exam_6_5
子程序接 口 (Interface)
重载(overloading) 重载(overloading)
子程序重载( 子程序重载(generic name)实现多态功能 name)
exam_6_16
一个子程序名与若干个不同的子程序相关联,ຫໍສະໝຸດ Baidu一个子程序名与若干个不同的子程序相关联,调 用时根据参数类型选择相应的子程序。 用时根据参数类型选择相应的子程序。 操作符重载(只能用函数,至少一个形参是in) 操作符重载(只能用函数,至少一个形参是in) 重载已有操作符
Fortran 的子程 序
函数 function
标准函数
语句函数 内部函数
用户自定义函数 外部函数
子程序
模块函数
标准子例行程序 子例行程序 subroutine 内部子例行程序 用户自定义 子例行程序 外部子例行程序 模块子例行程序
Fortran 的子程 序
函数(function) 函数(function)
exam_6_5 exam_6_11 exam_6_1 exam_6_6
子程序接 口 (Interface)
调用子程序时出现下面情况: 调用子程序时出现下面情况: 使用了关键字 使用了类属标识符调用子程序(多态) 使用了类属标识符调用子程序(多态) 赋值号重载 操作符重载 要求子程序是pure的时候 要求子程序是pure的时候
形参与实参 之间的关系
保留子程序中变量的值
save 和 data data不能给形参赋初值 data不能给形参赋初值 data只给变量赋一次初值 data只给变量赋一次初值 Visual Fortran 默认所有用data赋值的变量,以及 默认所有用data赋值的变量 赋值的变量, 内部变量都有save 属性 如果要去掉save 属性 内部变量都有 save属性 。 如果要去掉 save属性 , 应 属性。 属性, 该用automatic属性 该用automatic属性,但是这是非标准的 属性,
形参的个数不宜太多
形参与实参 之间的关系
实参( 实参(actual argument) argument)
表达式(常量、变量) 表达式(常量、变量)、子程序 实参和形参的数据传递关系 类型(应该匹配) 类型(应该匹配) 位置(顺次对应或按关键字对应) 位置(顺次对应或按关键字对应) 个数(相等或省略) 个数(相等或省略) 引用传递( 引用传递(call by reference) reference) 值传递( 值传递(call by value) value)
exam_6_5
形参与实参 之间的关系
变量作为形参
exam_6_6
形参为基本数据类型变量(注意字符型变量) 形参为基本数据类型变量(注意字符型变量)
形参为指针变量
形参为派生数据类型变量
形参与实参 之间的关系
形参为数组 静态显式 自动数组( 自动数组(automatic array) array) 可调数组( 可调数组(adjustable array) array) 假定大小数组(assumed-size) 假定大小数组(assumed-size)
相关文档
最新文档