我的印象是 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/