我的印象是Fortran中子程序和函数之间的主要区别在于函数返回值,而子程序更改了作为参数传递的部分或全部值。但后来我了解到你可以修改传入函数的变量作为参数。我很困惑,无法找到它们之间差异的良好参考。
那么,这两种结构之间有什么区别,何时以及为什么一种优先于另一种?
答案 0 :(得分:10)
是否使用其中一个或多或少是编程风格的问题。您可以将函数和子例程的参数写为intent(in)
,intent(inout)
或intent(out)
。
然而,我的个人风格仅使用函数的intent(in)
参数,这也是pure
函数的要求。当需要错误代码intent(out)
参数时,可以对此规则进行例外处理。
在函数中隐藏了一个微妙的陷阱,它为同一个输入参数值返回不同的结果。考虑一个返回随机数的假设函数
real function rnd()
end function
调用一次
x = rnd()
完全没问题。在单个表达式中多次调用
x = (rnd() + rnd()) / 2
只会导致函数被调用一次。 Fortran语言规则允许这样的行为。因此,获取随机数random_number()
的标准Fortran过程是一个子例程(因为所有内部函数都是pure
)。
如果您无法使用某个功能,请使用子程序。
通过将结果变量移动到具有intent(out)
的伪参数,可以将任何函数转换为子例程。相反的过程可能更成问题。