好的,昨天我有一位同事来到我的办公室,问我一个关于他必须使用的 Fortran 代码的问题。
基本上,他使用的代码有一个长的多维数组,以及一个需要这个长的多维数组作为参数的子例程。
但是,调用该子例程的代码仅传递数组的第一个元素。但代码仍然有效。所以他问我怎么会这样。
我还没有看到他的特定代码,但这里有一个我如何理解这个问题的例子(并且它有效!):
subroutine print_array(a)
implicit none
integer :: a(10)
write(*, *) a
end subroutine print_array
program passing
implicit none
integer :: i(10)
i = (/ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 /)
call print_array(i(1))
end program passing
所以我告诉他,Fortran 按顺序存储数组,数组的位置与第一个元素相同,并且由于子例程需要特定的形状,因此它知道沿着这个序列读取多远,依此类推。
我还告诉他这是不好的编程习惯,他不应该自己编写这种代码。
但从那时起我一直在想:为什么写这篇文章的人首先要这样做?有理由这样做吗? (这甚至不必是一个很好的理由。)
或者我是对的,这只是愚蠢而且太容易出错?