在Fortran中如何引用数量?
很久以前有人告诉我,在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。第二个版本的引擎盖下发生了什么?编译器是否正在解包子例程调用,声明一个临时变量只是为了通过引用传递它?在很大程度上,尝试用通过引
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