fortran 以动态数组为函数参数

    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才支持这种写法。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章