这里介绍3种常见的数组传递方式。看下面的代码:
Program www_fcode_cn
Implicit None
Real a(2, 3)
Interface
Subroutine fun3(a)
Real a(:, :)
End Subroutine fun3
End Interface
Call fun1(a)
Write (*, '(6f3.0)') a
Call fun2(a, 2, 3)
Write (*, '(6f3.0)') a
Call fun3(a)
Write (*, '(6f3.0)') a
End Program www_fcode_cn
! 方法1
Subroutine fun1(a)
Real a(*)
a(1:6) = 1
End Subroutine fun1
! 方法2
Subroutine fun2(a, m, n)
Integer m, n
Real a(m, n)
a = 2
End Subroutine fun2
! 方法3
Subroutine fun3(a)
Real a(:, :)
a = 3
End Subroutine fun3
执行结果:
三种方法的形参数组,第一种称假定大小数组(assumed-size arrays),第二种称自动数组(auto arrays),第三种称假定形状数组(assumed-shape arrays)。
第一种:可对数组元素或数组片段进行操作(如 a(3)=2, a(2:4)=3 ),但不能直接对数组名进行操作(如a=1)。如果对整个数组进行操作,需指明数组边界(如代码所示);
第二种:最常见,也最常用,不解释;
第三种:可用 size 函数获取数组每一维的元素个数:m = size(a,1),n = size(a,2),操作与第二种一致。注意:这种方式需要显式接口,可用 interface 指定接口,或将子程序写入 module 中使用。
在某些老代码中,可能会见到第四种写法,其与第一种类似。
! 方法4 Subroutine fun4(a) Real a(1) a(1:6)=4 !全部6个元素赋值为4 a = 0 !第一个元素赋值0,其余不变 End Subroutine fun4
总结:
第一种将高维数组变形为1维数组,丢失了数组的维度信息,实参和形参元素的位置对应关系不确定。因此不建议使用。
第二种最常用,但需要传递额外的参数来指定数组大小。
第三种很灵活,能实现第二种的所有功能,而且减少了参数个数,但需要显式接口。推荐用这种方法,并封装与 module 中避免书写接口。
第四种则坚决反对使用。



