1、数组参数
在传递数组参数时,实质传递的是某个内存地址,因此可以利用这一点使用很多技巧
program ex0816
implicit none
integer::a(5)=(/1,2,3,4,5/)
call ShowOne(a) !输出结果为1,即数组的第一个元素内存地址的内容,
call ShoeArray3(a) !输出结果为1,2,3 ,即输出3个元素的数组,第一个位置从数组a的第一元素位置开始
call ShowAraay2X2(a) !输出结果为2 4 ,即将数组参数a的首地址开始的四个元素看作二维数组,num(1,1)=a(1)...num(2,2)=a(4)
stop
end
subroutine ShowOne(num)
implicit none
integer::num
write(*,*) num
return
end
subroutine ShowArray3(num)
implicit none
integer::num(3)
write(*,*) num
return
end
subroutine ShowArray2X2(num)
implicit none
integer::num(2,2)
write(*,*) num(2,1),num(2,2)
return
end
2、函数中变量的生存周期
在子例程调用结束以后,子例程中的变量的生存周期也就结束,FORTRAN为保证这些变量在程序执行的时候永远记住上一次子例程调用时的数值,用SAVE加载声明中,写法:
subroutine sub()
implicit none
integer:: count !FORTRAN90 可以写成 integer,save::count
save count
write(*,*)count
count=count+1
return
end
3、函数名为参数
注意当参数为函数名,一定要在声明时注明 类型external 或者 intrinsic,来表明该函数是内部函数还是外部函数。
4、参数的属性
当程序中传递参数,这些参数很可能在子例程被调用后发生改变,若用户不希望输入的参数发生变化可以使用INTENT来实现:
program ex0823
implicit none
integer::a=4
integer b
call div(a,b)
stop
end program
subroutine div(a,b)
implicit none
integer,intent(in)::a !指定A是只读的
integer,intent(out)::b !指定B在子例程中应该重新设置
b=a/2
end subroutine
5、函数的使用接口INTERFACE
INTERFACE是一段程序模块,来说清楚调用函数的参数类型,及返回值类型等。在下面几种情况中应该使用INTERFACE是必要的:
(1)函数的返回值是数组(2)指定参数位置来传递参数(3)所调用的函数参数的参数数目不固定时(4)输入指标参数时(5)函数返回值为指针时
INTERFACE一次可以放入好几个函数子例程的使用接口说明。
6、不定个数的参数传递
FORTRAN90可以通过optional来实现,要传递的某个参数可以忽略。只要在子例程和主程序的INTERFACE生命中,声明某个变量是可以忽略的即可。例如 integer,optional::b !声明B变量可以忽略。
当然要在子例程中用PRESENT检查某个参数是否传递过来,函数present返回逻辑值.true. 表示有参数传递。
另外FORTRAN90可以实现,调用子例程是,直接带入子例程中变量名称,来实现变换参数位置,例如:
program ex0000
......
call sub(b=2,c=1,a=3) !根据变量名称来传递参数
subroutine sub(a,b,c)
.......
end subroutine sub
end ex0000
注意使用该方法一定要声明INTERFACE。