fortran的传参是我见过的各种编程语言中最麻烦的一个。它完全不认识传进来的参数是什么,必须在函数体内把形参再定义一遍。如果函数参数是数组,尤其是高维数组,那就必须要同时定义数组的数据类型和元素个数。之前都是得过且过的用全局变量common块蒙混过关,都是祖师们从fortran77年代遗留下来的老程序了,全局变量到处都是,程序可读性很差。现在程序越来越大,不同领域内的程序也要融合在一起,全局变量的劣势越来越明显。好在fortran95部分引入了面向对象的概念,一定程度上做到了良好封装,全局变量也不再必须了。
数组作函数参数,必须在函数体内制定数组大小。之前的老fortran可以用*号代替下标,但是只能应用在数组最后一维。如果有一个矩阵行数列数事先都不知道,这种方法就不行了。fortran95引入module之后,要实现动态数组做函数参数就简单多了。样例代码如下:
module mytest
contains
subroutine test(ps)
integer,dimension(:,:)::Ps;
integer ::p;
p=size(ps);
write(*,*)p;
write(*,*) ps(1,1),ps(1,2),ps(2,1),ps(2,2)
end subroutine
end module
program farray
!real(kind(le0)):: s;
use mytest
!integer,allocatable,dimension(:)::s;
!allocate(s(10));
integer ,dimension(2,2)::arr;
arr(1,1) = 1.5
arr(1,2) = 2.5
arr(2,1) = 3.5
arr(2,2) = 4.5
write(*,*) arr(1,1),arr(1,2),arr(2,1),arr(2,2)
call test(arr);
end program farray
这个样例是在programfan上抄来的,CVF,IVF,gfortran等主流编译器都支持。注意必须要把sub写在module里面,只有module内的sub和function才支持这种写法。