Fortran中函数和子程序的区别是什么?

21

我曾认为Fortran中子程序和函数的主要区别在于函数返回值,而子程序则更改其作为参数传递的某些或所有值。但后来我了解到,您也可以修改作为参数传递给函数的变量。我感到困惑,找不到一个好的参考来解释它们之间的区别。

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


6
最大的差异在于子例程是通过CALL语句调用的,因此不能成为表达式的一部分。 - Hristo Iliev
1个回答

21
无论使用哪个,更多或更少是编程风格的问题。您可以将函数和子例程的参数编写为intent(in)intent(inout)intent(out)
然而,我的个人风格是仅在函数中使用intent(in)参数,这也是对于pure函数的要求。唯一的例外是需要错误代码intent(out)参数时才能打破这个规则。
在返回相同输入参数值的不同结果的函数中隐藏着一个微妙的陷阱。考虑一个返回随机数的假设函数。
real function rnd()
end function

调用它一次

x = rnd()

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

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

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

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

通过将结果变量移到具有 intent(out) 的虚拟参数中,可以将任何函数转换为子例程。相反的过程可能更有问题。


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