Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 有没有理由只传递第一个元素而不是整个数组?_Arrays_Fortran - Fatal编程技术网

Arrays 有没有理由只传递第一个元素而不是整个数组?

Arrays 有没有理由只传递第一个元素而不是整个数组?,arrays,fortran,Arrays,Fortran,好的,昨天我有一个同事来到我的办公室,问我一个关于他必须使用的Fortran代码的问题 基本上,他使用的代码有一个长的多维数组和一个子例程,该子例程只需要这个长的多维数组作为参数 但是,调用该子例程的代码只传递数组的第一个元素。然而,代码是有效的。所以他问我怎么会这样 我没有看到他的特定代码,但下面是一个我如何理解这个问题的示例(它是有效的!): 所以我告诉他Fortran按顺序存储数组,数组的位置与第一个元素的位置相同,因为子例程需要某种形状,它知道沿着这个序列读取的距离,依此类推 我还告诉他

好的,昨天我有一个同事来到我的办公室,问我一个关于他必须使用的Fortran代码的问题

基本上,他使用的代码有一个长的多维数组和一个子例程,该子例程只需要这个长的多维数组作为参数

但是,调用该子例程的代码只传递数组的第一个元素。然而,代码是有效的。所以他问我怎么会这样

我没有看到他的特定代码,但下面是一个我如何理解这个问题的示例(它是有效的!):

所以我告诉他Fortran按顺序存储数组,数组的位置与第一个元素的位置相同,因为子例程需要某种形状,它知道沿着这个序列读取的距离,依此类推

我还告诉他,这是一种糟糕的编程实践,他不应该自己编写这种代码

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


还是我说得对,这太傻了,太容易出错?

你对它的解释是正确的。你对这种过时做法的厌恶得到了广泛的支持


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

令人惊讶,但合法!如果你认为FORTRAN是一种低级语言(或高级汇编),这种过时的做法是有道理的。当您传递第一个元素的地址时,如果您将数组的声明从
i(10)
更改为
i(0:10)
,传递
i(1)
不会中断您的代码,但是传递
i
会中断,因为数组将移位1个元素。如果你通过
i(1:10)
,编译器可能会创建一个数组的临时副本(尽管我现在不确定它是否仍然正确),这会减慢执行速度。我不相信这种解释。但好的是,不可能使用临时数组,这有利于非阻塞MPI。但是我仍然传递整个数组,并使用MPI子数组数据类型,而不是向量。如果您确实“调用print_array(i)”,那么当时的编译器将抛出一个错误,因为它知道“i”应该是一个数组引用,所以使用“i(1)”传递第一个数组元素的地址,并让子例程将其用作整个连续数组的引用。
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