&引用;“真实世界”;Fortran中参数传递的使用

&引用;“真实世界”;Fortran中参数传递的使用,fortran,fortran90,Fortran,Fortran90,我总是假设fortran“通过引用”将实体传递给伪参数。然后我得到了这个答案(答案的实际论点是相关的,但不是关于这个) 该标准从未规定, 事实上,它确实走了很多弯路 避免此类规范。虽然 你的误解很普遍,不是吗 即使在大多数情况下也不是严格准确的 较旧的编译器,尤其是 优化已打开。严格的 通过引用传递会杀死很多人 常见的优化 按照最近的标准, 通过引用传递几乎是不可能的 在某些情况下是不允许的。标准 在它的语言中不使用这些词 规范性文本,但有些东西 这是不切实际的 与通过参考 当你开始做事情的时候

我总是假设fortran“通过引用”将实体传递给伪参数。然后我得到了这个答案(答案的实际论点是相关的,但不是关于这个)

该标准从未规定, 事实上,它确实走了很多弯路 避免此类规范。虽然 你的误解很普遍,不是吗 即使在大多数情况下也不是严格准确的 较旧的编译器,尤其是 优化已打开。严格的 通过引用传递会杀死很多人 常见的优化

按照最近的标准, 通过引用传递几乎是不可能的 在某些情况下是不允许的。标准 在它的语言中不使用这些词 规范性文本,但有些东西 这是不切实际的 与通过参考

当你开始做事情的时候 像指针一样,假设的错误 一切都是通过参考来传递的 将开始变得更加明显 比以前多了。你得把它放下 误解或许多事情会 把你弄糊涂了

我想其他人已经回答了这个问题 该职位的其余部分。还有一些 我谈到了上述问题,但我 我想强调一下

那么,根据这个答案,标准中没有规定如何将数据从调用者发送到被调用者。在实际应用中,尤其是在涉及到intent()规范时,应该如何从实际使用它的角度来解释这一点(不管编译器如何实现该标准所产生的实际效果如何)


编辑:我想澄清我的问题。我想了解的是,当您执行呼叫时,标准期望您如何工作。由于标准未定义用于传递实体的实际编译器策略,因此原则上(根据标准),您不能期望将参数传递给函数实际上会表现为“按引用传递”,以及所有相关的副作用,因为这种行为依赖于编译器和优化。因此,我假设该标准规定了一种编程风格,无论实际的实现策略如何,您都必须遵循这种风格。

是的,这是事实。Fortran标准没有为不同的意图属性指定确切的属性。例如,对于带有INTENT(OUT)的伪参数,某些Fortran编译器可以使用“按引用调用”或“按副本调用”还原计算

但我不明白为什么你真的需要知道使用哪种评估策略?原因是什么?我认为Fortran做得对。人类关注的是(高级)论证意图,而计算机关注的是(低级)评估策略。“把人类的东西呈现给人类,把计算机的东西呈现给计算机。”维纳


我认为该标准包含了关于不同意图属性用法的足够信息。(PDF,5MB)的“5.1.2.7意图属性”部分是一个很好的起点。

是的,这是事实。Fortran标准没有为不同的意图属性指定确切的属性。例如,对于带有INTENT(OUT)的伪参数,某些Fortran编译器可以使用“按引用调用”或“按副本调用”还原计算

但我不明白为什么你真的需要知道使用哪种评估策略?原因是什么?我认为Fortran做得对。人类关注的是(高级)论证意图,而计算机关注的是(低级)评估策略。“把人类的东西呈现给人类,把计算机的东西呈现给计算机。”维纳


我认为该标准包含了关于不同意图属性用法的足够信息。(PDF,5MB)的“5.1.2.7 INTENT attribute”部分是一个很好的起点。

我不确定我是否理解您的问题,但从一个角度来看,只要编写符合标准的代码,就不需要关心参数传递是如何实现的。编译器确保(当然,排除编译器错误)以符合标准的方式传递参数


现在,如果您玩一些小把戏,例如使用C interop之类的,比如通过比较参数地址,您可能能够确定编译器在某些特定情况下是使用按引用传递、复制入/复制出还是其他方式。但一般来说,在这一点上,您超出了标准的范围,所有的赌注都没有了。

我不确定我是否理解您的问题,但一种看法是,只要编写符合标准的代码,就不需要关心参数传递是如何实现的。编译器确保(当然,排除编译器错误)以符合标准的方式传递参数


现在,如果您玩一些小把戏,例如使用C interop之类的,比如通过比较参数地址,您可能能够确定编译器在某些特定情况下是使用按引用传递、复制入/复制出还是其他方式。但一般来说,此时您就超出了标准的范围,所有赌注都没有了。

正如其他人所说,只要编译器工作正常,您就不必知道它是如何工作的。Fortran>=90允许您指定参数的用途:输入、输出或两者,然后编译器负责传递参数。只要编译器被正确实现,使得双方(调用方和被调用方)使用相同的机制,程序员为什么要在意呢?因此Fortran标准试图不限制编译器编写者实现编译器的方式,允许他们按照自己的意愿进行设计和优化

就编程风格而言,确定过程参数的用途,并以适当的意图声明它们。然后,例如,如果您不小心试图修改过程中的intent(in)参数,编译器将发出错误消息,阻止您进行修改