好的,昨天我有一位同事来到我的办公室,问我一个关于他必须使用的 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
Run Code Online (Sandbox Code Playgroud)
所以我告诉他,Fortran 按顺序存储数组,数组的位置与第一个元素相同,并且由于子例程需要特定的形状,因此它知道沿着这个序列读取多远,依此类推。
我还告诉他这是不好的编程习惯,他不应该自己编写这种代码。
但从那时起我一直在想:为什么写这篇文章的人首先要这样做?有理由这样做吗?(这甚至不必是一个很好的理由。)
或者我是对的,这只是愚蠢而且太容易出错?
您对其工作原理的解释是正确的。您对这种过时做法的厌恶得到了广泛的支持。
至于原因,我已经忘记了(虽然很久以前我曾经这样做过——比如从酒吧开车回家抽烟,每个人都这样做了,但没有想到)但也许该语言的最早版本不支持将整个数组作为参数传递。也许其他人的大脑没有被酒精、烟草和 FORTRAN(没错,大声喊出来)的强力混合所迷惑,记得更清楚。