Fortran 数组变量的顺序对应
如果将
a(1)
修改为 a(3)
并保持数组 a 的长度为 10,即数组 a 和数组 x 不从第一个元素开始对应,那么源代码将无法被编译,如示例 5 的变种一所示。要想在这种情况下还能正常编译,我们就必须扩充数组 a 的长度至少为 12。这样一来,子程序中要赋值的数都能正确存入数组 x 并返回给主程序的数组变量 a,如示例 5 的变种二所示。!!! 示例 5 的变种一
program stest5
implicit none
real a(10)
call sub(a(3))
print *, a(3)
end program stest5
subroutine sub(x)
implicit none
real x(10)
integer i
do i = 1, 10
x(i) = i
enddo
end subroutine sub
!!! 执行结果
>>> Error: Actual argument contains too few elements for dummy argument 'x' (8/10) at (1)
!!! 示例 5 的变种二
program stest5
implicit none
real a(12)
call sub(a(3))
print *, a(3)
end program stest5
subroutine sub(x)
implicit none
real x(10)
integer i
do i = 1, 10
x(i) = i
enddo
end subroutine sub
!!! 执行结果
>>> 1.00000000
其实,在子程序中也可以不定义数组的长度,将长度设置为 *
。
如下示例 6 所示,子程序的功能是将数组 a 中的前 n 个元素复制给数组 b。
!!! 示例 6
subroutine copy(a, b, n)
implicit none
real a(*), b(*)
integer n, i
do i = i, n
b(i) = a(i)
enddo
end subroutine copy