Fortran元素函数 vs 元素子程序

9

Fortran允许元素子程序具有intent(inout)和intent(out)参数,但仅允许元素函数具有intent(in)。

为什么会这样呢?这只是一种风格惯例,还是在调用函数和调用子程序方面有一些普遍不同的东西呢?

换句话说,

Elemental Integer Function FOO(i)
  Integer, intent(in) :: i
    ...
  FOO=something
End Function

并且

Elemental Subroutine FOO(i, v)
  Integer, intent(in)  :: i
  Integer, intent(out) :: v
    ...
  v=something
End Subroutine

- 这些 FOO 实现效率是否相同?

我无法理解,如果一个过程具有副作用,将其称为纯过程并不太合适。我猜基本函数在并行化的情况下可能更有效率,因为编译器可以清楚地了解该过程的行为。 - bdforbes
我认为,如果一个子程序仅修改自己的参数而不触及全局变量,那么编译这样的子程序并不困难。拥有这样的功能是有意义的。例如,随机数生成器应该修改随机数序列的状态(由整数数组描述)并返回一个随机数。因此,它应该有一个intent(inout)和一个intent(out)参数。当然,用户可能会通过将共享变量传递给这样的子程序来搞砸事情。但是,再次强调,没有编程范式是绝对安全的。 - drlemon
1个回答

7

如果没有至少一个标记为intent(out)intent(inout)的参数,那么拥有一个基本子程序是毫无意义的,因为你必须以某种方式传递结果。函数有其返回值,而子程序必须使用其参数。在Fortran 2008中,据我所知,元素过程不一定是纯净的,但很难想象一个仅通过其副作用就能有用的元素子程序。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接