在Fortran中如何引用数量?

在Fortran中如何引用数量?,fortran,pass-by-reference,pass-by-value,Fortran,Pass By Reference,Pass By Value,很久以前有人告诉我,在FORTRAN中,一切都是按值传递的。因此,我需要这样做(前提是mySubroutine在其他地方有适当的定义): 然而,我也发现,如果我这样做,程序编译和运行与预期一样 CALL mySubroutine((/ 2.3d0, 1.5d0 /)) 无需定义中间数组myArray。我以为我是通过引用将myArray传递到mySubroutine。第二个版本的引擎盖下发生了什么?编译器是否正在解包子例程调用,声明一个临时变量只是为了通过引用传递它?在很大程度上,尝试用通过引

很久以前有人告诉我,在FORTRAN中,一切都是按值传递的。因此,我需要这样做(前提是
mySubroutine
在其他地方有适当的定义):

然而,我也发现,如果我这样做,程序编译和运行与预期一样

CALL mySubroutine((/ 2.3d0,  1.5d0 /))

无需定义中间数组
myArray
。我以为我是通过引用将
myArray
传递到
mySubroutine
。第二个版本的引擎盖下发生了什么?编译器是否正在解包子例程调用,声明一个临时变量只是为了通过引用传递它?

在很大程度上,尝试用通过引用传递和通过值传递对Fortran过程调用进行分类没有太大帮助。在回答诸如和之类的问题时,您可以找到更多关于这方面的详细信息

简言之,通常过程引用是指过程中变量的更改反映在引用过程的变量中。在某些情况下,编译器可能选择执行“复制入/复制出”,而在另一些情况下,它必须有效地执行。同样,伪参数的
value
属性指定进行匿名复制

这个问题增加了一些不同的地方,比如在

call mySubroutine([2.3d0, 1.5d0])  ! Using F2003 array constructor syntax
编译器正在创建临时变量吗

诚然,这可能只是术语上的松散,但值得一提的是,其中肯定没有涉及变量<代码>[2.3d0,1.5d0]是一个表达式,而不是变量。至关重要的是,这意味着它不能在过程中被修改(出现在变量定义上下文中)。在使用表达式而非(临时)变量的情况下适用的限制包括:

  • 与表达式关联的伪参数可能没有
    intent(inout)
    intent(out)
    属性
  • 如果伪参数没有intent属性,那么如果关联的实际参数是表达式,则不能修改该参数
现在,如果伪参数具有
属性,则无论以何种方式引用,过程的效果都是相同的


总之,该程序可能同样适用于表达式而不是中间变量。如果没有,那是因为违反了Fortran的某些方面。它的工作方式是编译器的问题,而不是程序员的问题。

在fortran中,默认情况下,所有内容都是(或表现为)通过引用传递的。在第二种情况下,您是正确的,编译器有效地生成一个临时数组并传递引用。注意如果
mysubroutine
修改了它的参数,那么在第一种情况下它会修改
myarray
,在第二种情况下它会做一些不可预知的事情。谢谢你的回答!我问这个问题的动机是,这段代码是一个函数的一部分,它将被循环多次,我想知道通过将表达式直接插入
mySubroutine
(具有
intent(in)
)是否节省了一些时间。这样,
myArray
就不会一次又一次地重新初始化。
call mySubroutine([2.3d0, 1.5d0])  ! Using F2003 array constructor syntax