资源描述:
《fortran 第8章_2.ppt》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、第八章函数§8-5特殊参数的使用方法Fortran90中:可设置某些参数的属性:为只读或可写等参数个数可以不定传递参数的顺序可变§8-5-1参数的属性FORTRAN90用INTENT设置虚参的属性:类型,INTENT(IN)::参数变量名!参数为只读,不能改变数值,否则编译会出现错误信息类型,INTENT(OUT)::参数变量名!参数在程序中重新设置数值,否则编译会出现警告类型,INTENT(INOUT)::参数变量名!参数可读可写,和没指定一样Fortran中,变量作为实参传递出去之后,在调用函数后有可能被改变,以此来限制或提醒。§8-5-2函数的使用接口(INTERF
2、ACE)INTERFACE是一段程序模块,说明所要调用的函数的参数类型及返回值的类型等。例:结构:Interface!interface定义开始Functionfunc_name(n1,n2…nm)!开始定义函数func_nameImplicitnoneInteger…!声明n1…nm及返回值func_nameReal…!的数值类型End[function[func_name]]!定义函数func_name结束Subroutinesun_name!定义子程序sub_nameImplicitnoneInteger….Real….End[subroutine[sub_name
3、]]….Endinterface!interface结束§8-5-2函数的使用接口(INTERFACE)必须要使用的情况:函数返回值为数组指定参数位置来传递参数时所调用的函数的参数数目不固定输入指针参数时函数返回值为指针时§8-5-3不定个数的参数的传递Fortran90中采用optional命令来声明可省略参数,要用interface作函数的参数定义,或用Module来定义§8-5-4改变参数的传递位置Fortran90中,可以改变参数传递位置,要用interface声明subroutinesub(a,b,c)…Callsub(b=2,c=3,a=1)直接代入函数变量名
4、来传递子程序接受到的是a=1,b=2,c=3对于有多个可省略参数的函数,调用时可使用这个办法只传递其中的部分参数例:Subroutinesub(a,b,c,d,e,f)implicitnoneinteger,optional::a,b,c,d,e,f…endsubroutinesubCallsub(b=3,f=5)!只输入b和f的值,其他省略例:要计算A*X**2+B*X+C,对于A,B,C没有的情况默认为0来计算§8-6特殊的函数类型Fortran90中的函数可以特别指定成RECURSIVE递归PUREELEMENTAL这三种特殊类型并行及数组设置时使用§8-6-1递归
5、(RECURSIVE)递归――函数除了被其他程序块调用外,可以自己调用自己来执行程序必要条件:每次被调用时,递归函数中的局部变量(那些不是传递的参数和SAVE的变量)独立存在,每次被调用会使用不同的内存地址。用result来设置另一个储存返回值的变量程序中要设置调用终点,以免无限循环调用格式:Recursive类型functionfunc_name(parameters)result(ans)Result可以用来在程序代码中使用另外一个名字来设置函数的返回值,根据fortran90标准最开始加上recursive才能递归调用Recursivesubroutine(para
6、meters)例题,计算N!执行:【ans=n*fact(n-1)】n=4第一次调用:ans=4*fact(3),调用fact(n-1)第二次调用:n=3,ans=3*fact(2),调用fact(n-1)第三次调用:n=2,ans=2*fact(1),调用fact(n-1)第四次调用:n=1,ans=1,返回返回值Fact(1)=Ans=1Fact(2)=ans=2*fact(1)=2!Fact(3)=ans=3*fact(2)=3!Fact(4)=ans=4*fact(3)=4!每次被调用时,递归函数中的局部变量独立存在,每次被调用会使用不同的内存地址。执行:n=4第
7、一次调用:ans=4*fact(3),count=1,localcount=1,count=2第二次调用:n=3,ans=3*fact(2),localcount=2,count=3第三次调用:n=2,ans=2*fact(1),localcount=3,count=4第四次调用:n=1,ans=1,localcount=4,count=5返回返回后N=2,Fact(1)=Ans=1,count=5,localcount=3;N=3,Fact(2)=ans=2*fact(1)=2!Count=5,localcount=2;N=