我曾认为Fortran中子程序和函数的主要区别在于函数返回值,而子程序则更改其作为参数传递的某些或所有值。但后来我了解到,您也可以修改作为参数传递给函数的变量。我感到困惑,找不到一个好的参考来解释它们之间的区别。
那么,这两种结构之间有什么区别,何时以及为什么应该优先选择其中一种?
我曾认为Fortran中子程序和函数的主要区别在于函数返回值,而子程序则更改其作为参数传递的某些或所有值。但后来我了解到,您也可以修改作为参数传递给函数的变量。我感到困惑,找不到一个好的参考来解释它们之间的区别。
那么,这两种结构之间有什么区别,何时以及为什么应该优先选择其中一种?
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)
的虚拟参数中,可以将任何函数转换为子例程。相反的过程可能更有问题。
CALL
语句调用的,因此不能成为表达式的一部分。 - Hristo Iliev