function - Fortran 中的函数和子例程有什么区别?

标签 function fortran subroutine

我的印象是 Fortran 中子例程和函数之间的主要区别在于函数返回值,而子例程更改作为参数传递的部分或全部值。但后来我了解到您也可以修改作为参数传递给函数的变量。我很困惑,找不到很好的引用来了解它们之间的差异。

那么,这两种结构之间有什么区别,何时以及为何应优先选择其中一种结构?

最佳答案

是否使用其中一种或多或少取决于编程风格。您可以将函数和子例程的参数编写为 intent(in)intent(inout)intent(out)

但是,我个人的风格是仅使用函数的 intent(in) 参数,这也是对 pure 函数的要求。当需要错误代码 intent(out) 参数时,可以对此规则进行异常(exception)处理。

函数中隐藏着一个微妙的陷阱,对于相同的输入参数值返回不同的结果。考虑一个返回随机数的假设函数

real function rnd()
end function

调用一次

x = rnd()

完全没问题。在单个表达式中多次调用它

x = (rnd() + rnd()) / 2

可能导致该函数仅被调用一次。 Fortran 语言规则允许这种行为。因此,获取随机数的标准 Fortran 过程 random_number() 是一个子例程(并且因为所有内部函数都是)。

在无法使用函数的地方,请使用子例程。

任何函数都可以通过使用 intent(out) 将结果变量移动到虚拟参数来转换为子例程。相反的过程可能会出现更多问题。

关于function - Fortran 中的函数和子例程有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27521521/

相关文章:

Fortran 查询返回内部文件

performance - 不要指针抑制编译器优化?

r - 从 R 中调试 Fortran 代码

perl - Perl 中未定义的子例程和主要错误

perl - perl 如何从模块中导入子程序

Python:如何创建一个函数?例如f(x) = ax^2

Swift 函数不更新绘图

javascript - 如何在所有元素上仅触发一次toggle()?

javascript - 如何将 setInterval() 的 ID 传递给匿名函数

python - F2PY 返回值错误 : invalid version number '4.'