




已阅读5页,还剩21页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Fortran95/2003程序设计,第七章过程,本章学习目标:学习Fortran语言中的过程如何帮助实现好的程序设计了解子程序与函数的不同掌握创建和调用子程序理解并学会使用INTENT属性理解使用地址传递方案实现变量传递理解显式结构的形参数组、不定结构的形参数组和不定大小的形参数组之间的区别理解为什么不再使用不定大小的数组掌握在过程之间使用模块实现共享数据理解显式接口,以及为什么在模块内部定义过程更好能创建并且调用用户自定义函数掌握如何把Fortran过程调用参数传递给其他过程。,Fortran提供了一个特定机制,使得可以在构建最终的程序前容易地独立开发和调试子任务。可以把每个子任务作为独立的程序单元来编码,该独立程序单元被称为外部过程(externalprocedure),每个外部过程都可以独立于程序中的其它子任务(过程)来进行编译、调试。,Fortran中有两种外部过程:子程序(subroutine)和函数子程序(functionsubprogram)(或者就叫函数,function),子程序通过在一个单独的CALL语句中引入子程序名来进行调用,并且可以通过调用参数来返回多个结果。函数通过在表达式中引入函数名来进行调用,它的结果是单个数值,该值用来为表达式赋值。,在实际编程时,把一个大程序任务分解为若干个子过程,可以获得很多好处:独立测试组件、复用子过程,隔离无意的副作用。,7.1子程序,SUBROUTINE语句标志着子程序的开始,定义了子程序名和相关参数表。子程序名必须遵循标准的Fortran命名规则由字母和数字组成,最大长度可以到31个字符,但第一个字符必须是字母。参数表含有一系列变量和/或数组,这些变量、数组的值将从调用程序传递给子程序。这些变量被称为形参(dummyagument,形式参数),子程序实际上没有为它们真正分配任何内存空间。对从调用程序单元传递来的实际参数(实参)来说它们仅仅是占位符。,当程序调用子程序时,调用程序的执行暂时被挂起,子程序执行部分开始运行。当运行到子程序的RETURN语句或ENDSUBROUTINE语句时,调用程序又开始运行调用子程序语句下面的程序代码。,每个子程序是一个独立的程序单元,它开始于SUBROUTINE语句,结束于ENDSUBROUTINE语句。,任何可执行程序单元都可以调用子程序,包括另一个子程序。(但是,子程序不能调用它自身,除非它被定义为递归类型(recursive)。,例7-1用直角三角形两直角边计算斜边。,子程序中的RETURN语句是可选的。当运行到ENDSUBROUTINE语句时,程序会自动返回到调用程序。只有需要在子程序结束之前返回到调用程序时,才需要用到RETURN语句。,例7-2数据排序,7.1.2INTENT属性,子程序的形参可以与一个INTENT属性联合使用。INTENT属性与类型声明语句联合使用,来声明每个形参的类型,告诉编译器如何使用形参。,7.1.3Fortran中的变量传递:地址传递方案,主程序和子程序之间用地址传递(pass-by-reference)方案来进行通信。主程序传递一个指针来指向实参表中各个参数的存储位置,子程序查找调用程序所指向的内存位置,获得形参值。,参数列表中的值与子程序的调用参数在个数、类型、次序方面都必须完全匹配。如果存在不匹配,Fortran程序不能识别这种现象,会在没有任何提示的情况下错用这些参数,产生错误结果。,例7-3调用子程序形参不匹配示例,7.1.4传递数组给子程序,通过内存位置指针将参数传递给子程序,如果参数是个数组,那么指针指向的就是数组中的第一个值。为此,子程序既需要知道数组的地址,也需要知道数组的大小。,有3种可能的方式来指明形参数组的大小:(1)把数组的大小作为形参传递。,(2)把子程序中的所有形参数组声明为不定结构的形参数组(assumed-shapedummyarray),以创建一个子程序的显式接口。(7.3节介绍),(3)用星号(*)来声明形参数组的长度,定义不定大小的形参数组(assumed-sizedummyarray)。不会进行越界检测。,如果数组datal和data2的长度大于或等于比nvals,则正常,否则出错。是早期版本的一个过渡行为,不再使用。,7.1.5传递字符变量给子程序,例7-4子程序数组越界,7.1.6子程序中错误处理,字符变量作为子程序的形参时,用*来声明字符变量的长度。因为没有给形参分配内存,所以在编译时无需知道字符参数的长度。,不是最佳处理方式,因为一旦停止,将丢失调用该子程序之前的数据信息。,永远不要在子程序中使用STOP语句。如果在一个子程序中可能存在错误条件,那么应该对错误进行检测,并设置错误标志,返回给调用程序。,7.2用模块共享数据,模块(module)是一个独立编译的程序单元,它包含了程序单元间共享的数据的定义和初始值。如果程序单元中使用了包含模块名的USE语句,那么在那个程序单元中可以使用模块中定义的数据。,SAVE语句使得模块中的数据能够被所有的引用修改保存。,USE语句必须出现在程序单元中的其他语句之前。,例7-5使用模块示例。,使用use后模块对于该子程序是可见的,但是对于调用该子程序的程序是不可见的,除非该程序也use了该模块。,例7-6生成随机数,一个简单的随机数生成算法:,ni是一个非负整数,上式生成一系列数据,它们取值在0,134455之间。现设计一个随机数发生器,它将输出一个范围为0.0,1.0的实数。,7.3模块过程(moduleprocedures),除了数据之外,模块还可以含有完整的子程序和函数,它们被称为模块过程(moduleprocedure),7.3.1使用模块创建显式接口,既然任何子程序和函数可以独立编译和调用,那么为什么还要费周折放到模块中呢?,在模块内编译并通过use关联的子程序称为有显式接口(explicitinterface),该子程序在任何时候使用时,Fortran编译器清楚地知道过程的每个参数的所有细节,并通过检测接口来确保正确使用该子程序。,反之,不在模块内的子程序称为隐式接口(implicitinterface),编译器在编译调用该子程序时,不知道其任何信息,不对该子程序的参数个数、类型、intent等信息进行检查。,例7-7模块中的子程序,7.4Fortran函数子程序,Fortran函数(function)是这样一个过程,它的结果是单个数值、逻辑值、字符串或、数组。,函数名必须至少出现在赋值语句的左侧一次。当返回调用程序单元时,赋给函数名的值是函数的返回值。,必须为函数指定一个类型。如果使用IMPLICITNONE语句,那么在函数和调用程序中都应该声明函数类型。如果没有使用IMPLICITNONE语句,除非它们用类型声明语句说明,否则函数的缺省类型将会遵循Fortran语言的标准规则来确定。,确保在函数子程序自身和调用它的程序中声明函数类型。,7.4.1函数的副作用,函数使用参数传递模式,函数获取的是指向参数位置的指针,它可能会有意或无意地修改了其中的内容。修改了它的参数表值的函数会产生副作用(sideeffect)。,函数应该永远不修改自身的输入值,如果需要一个过程生成多个输出值,那么应该把过程写成为子程序而不是函数。为了确保函数的参数不被无意识地修改,应该总是用INTENT(IN)属性声明输入参数。,例7-8计算f(x)=ax2+bx+c,7.5过程作为参数传递给其他过程,函数和子程序都可以被当作调用参数来传递。,7.5.1用户自定义函数作为参数传递,Fun1,fun2是两个用户函数,只有被声明为外部量(extemal)时,用户自定义函数才可以当作调用参数传递。当参数表中的某个名字被声明为外部变量,相当于告诉编
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 情节有波澜的课件
- 2026届浙江省杭师大附中化学高一上期中学业质量监测试题含解析
- 患者约束的安全管理
- 恶劣天气应急处置课件
- 少儿教育感恩节的策划方案
- 学校读书日活动策划方案
- 无废医院知识试题及答案
- 方剂试题及答案
- 驾照考试题及答案
- 证券基础知识试题及答案
- 浙江省建设工程检测技术人员(建筑材料及构配件)认证考试题库(含答案)
- 2025农村土地墓地买卖合同
- 建筑施工现场消防安全培训课件
- 中小企业数字化转型路径分析
- 新入职医生培训
- 劳务派遣员工离职协议书 (2024年版)
- 升学宴会模板
- 2024至2030年中国聚脲涂料行业市场发展调研及投资前景分析报告
- DB11∕T 420-2019 电梯安装、改造、重大修理和维护保养自检规则
- 十年(2015-2024)高考真题英语分项汇编(全国)专题 22 完形填空(新高考15空)(学生卷)
- JTJ073.1-2001 公路水泥混凝土路面 养护技术规范
评论
0/150
提交评论