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