Fortran中函数和子例程之间有什么区别?

nau*_*101 9 fortran function subroutine

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

那么,这两种结构之间有什么区别,何时以及为什么一种优先于另一种?

Vla*_*r F 11

是否使用一个或另一个或多或少是编程风格的问题.您可以将函数和子例程的参数写为intent(in),intent(inout)intent(out).

然而,我的个人风格只是使用intent(in)函数的参数,这也是pure函数的要求.当intent(out)需要错误代码参数时,可以对此规则进行例外处理.

函数中隐藏了一个微妙的陷阱,它为相同的输入参数值返回不同的结果.考虑一个返回随机数的假设函数

real function rnd()
end function
Run Code Online (Sandbox Code Playgroud)

叫它一次

x = rnd()
Run Code Online (Sandbox Code Playgroud)

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

x = (rnd() + rnd()) / 2
Run Code Online (Sandbox Code Playgroud)

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

如果您无法使用某个功能,请使用子程序.

通过将结果变量移动到伪参数,可以将任何函数转换为子例程intent(out).相反的过程可能更成问题.