arrays - 有什么理由只传递第一个元素而不是整个数组?

标签 arrays fortran

这个问题在这里已经有了答案:





How can a scalar be passed to a vector (1D array) to a Fortran subroutine?

(2 个回答)


5年前关闭。




好的,所以昨天我有一个同事来到我的办公室,问我一个关于他必须使用的 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 是按顺序存储数组的,数组的位置和第一个元素是一样的,而且由于子程序需要一个特定的形状,它知道沿着这个序列读取多远,依此类推。

我还告诉他这是不好的编程习惯,他不应该自己编写这种代码。

但从那以后我一直在想:为什么写这篇文章的人首先要这样做?有什么理由这样做吗? (这甚至不必是一个很好的理由。)

或者我是对的,这只是愚蠢且容易出错?

最佳答案

您对其工作原理的解释是正确的。你对遵循这种过时做法的厌恶得到了广泛的支持。

至于原因,我已经忘记了(虽然很久以前我曾经这样做过——比如从酒吧开车回家和抽烟,每个人都这样做了,但什么也没想到)但也许该语言的最早版本不支持将整个数组作为参数传递。也许其他人的大脑不会被烈酒、烟草和 FORTRAN 的强效混合所迷惑(没错,大声喊出来)记得更清楚。

关于arrays - 有什么理由只传递第一个元素而不是整个数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35643669/

相关文章:

javascript - 如何在 'N/search'模块过滤器中添加带括号的过滤条件

format - 从fortran中的数据文件中读取列

fortran - gfortran错误: unexpected element '\' in format string at (1)

arrays - Fortran 中字符串数组的动态分配不会调整大小

fortran - gfortran 的续行不起作用

c# - 从 C# 调用 Fortran 代码

javascript - 当复选框未选中任何选项时,如何使值变为无?

arrays - 该程序将每行的第三个元素的值设置为 20。为什么它不起作用?

javascript - 编辑 JavaScript 数组,然后将它们 .map() 到另一个数组

python - 如何展平在第二个轴上具有不同长度的 2d numpy 数组?