Fortran 90/95 中的函数接口(interface)

标签 function fortran subroutine fortran90 fortran95

我有一个程序调用一个子程序,然后调用一个函数。 Fortran 对函数类型声明的要求让我有些困惑。我已经在函数中声明了类型(即真正的函数 foo(...)),无论我是否在子例程声明部分声明该函数,程序都可以运行。

我的具体问题是,不在子例程中声明函数是否会导致将来出现意外行为?我也看到了接口(interface) block ,想知道这是否也有必要。

更一般地说,我也对 Fortran 在“幕后”所做的事情以及为什么声明函数或使用接口(interface) block 或多或少很重要感兴趣。

编辑:一些示例代码:

program foo
  real :: a,b,c

  call bar(a,b,c)
end program foo

subroutine bar(a,b,c)
  real :: a,b,c

  c = baz(a,b)
end subroutine bar

real function baz(a,b)
  real :: a,b

  baz = a*b
end function baz

最佳答案

最好的方法是在函数中声明函数,然后将函数放在模块中。然后从调用该函数的任何主程序或过程(子例程或函数)中“使用”该函数。这样调用程序或过程将知道函数的接口(interface)并生成正确的代码。在 Fortran 术语中,接口(interface)是显式的。如果该函数是从同一模块中的过程调用的,则您不必“使用”它,因为模块中的过程相互了解。参见 Computing the cross product of two vectors in Fortran 90举个例子。通常不需要使用接口(interface),除非您正在调用缺少源代码的过程,或者使用另一种语言(例如,通过 ISO C 绑定(bind)访问的 C)的过程。

关于Fortran 90/95 中的函数接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6656169/

相关文章:

fortran - 语法错误,发现 .and。和.或。

perl - Perl 中未定义的子例程和主要错误

perl - perl中的函数原型(prototype)

function - 为什么 GCC 源代码中特定于目标的函数声明使用 K&R 样式而不是原型(prototype)?

c++ - 如何以及何时执行静态链接 (MinGW)?

c++ - 没有创建基类的对象时如何访问虚函数内容

visual-studio-2010 - Visual Studio和FORTRAN一起工作吗?

arrays - Perl中的子程序递归

Javascript:递归函数为现有值返回未定义

postgresql - 为什么计划者会针对具有不同波动率的函数得出不同的结果?