【发布时间】:2017-07-18 03:34:10
【问题描述】:
很久以前有人告诉我,在 FORTRAN 中,一切都是按值传递的。因此我需要这样做(前提是 mySubroutine 在别处适当定义):
double precision :: myArray(2)
myArray(1:2) = (/ 2.3d0, 1.5d0 /)
CALL mySubroutine(myArray)
但是,我也发现如果我这样做,程序可以按预期编译和运行
CALL mySubroutine((/ 2.3d0, 1.5d0 /))
无需定义中间数组myArray。我以为我通过引用将myArray 传递给mySubroutine。第二个版本的引擎盖下发生了什么?编译器是否解包子程序调用,声明一个临时变量只是为了通过引用传递它?
【问题讨论】:
-
默认情况下,在 fortran 中,所有内容都(或表现得好像)通过引用传递。在第二种情况下,您是正确的,编译器有效地创建了一个临时数组并传递了引用。请注意,如果
mysubroutine修改了它的参数,它将在第一种情况下修改myarray,并在第二种情况下做一些不可预测的事情。
标签: fortran pass-by-reference pass-by-value