Fortran 90/95中的函数接口

3
我有一个程序,调用一个子程序,然后再调用一个函数。我对Fortran在函数类型声明方面的要求感到有些困惑。我已经在函数中声明了类型(即实数函数foo(...)),无论是否在子程序声明部分中声明函数,程序都可以正常工作。
我的具体问题是,不在子程序中声明函数是否可能导致未来出现意外行为?我也看到了接口块,想知道这是否也是必需的。
更一般地说,我也对Fortran在“幕后”的操作以及为什么声明函数或使用接口块会更或更少重要感兴趣。
编辑:以下是一些示例代码:
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

你能在这里给一些示例代码吗?我不确定你的意思。是将函数传递给子程序,还是子程序有一个CONTAINS行,在其中调用该函数,或者...? - Jonathan Dursi
@Jonathan,这是给你的。 - astay13
1个回答

5
最好的方法是在函数中声明函数,然后将其放置在一个模块中。然后从调用该函数的任何主程序或过程(子例程或函数)中“使用”该函数。这样,调用程序或过程将了解函数的接口并生成正确的代码。在Fortran术语中,接口是显式的。如果从同一模块的过程中调用该函数,则不必“使用”它,因为模块中的过程彼此之间是相互了解的。请参见Fortran 90计算两个向量的叉积以获取示例。通常情况下,除非您正在调用源代码不足或以其他语言(例如通过ISO C绑定访问的C语言)编写的过程,否则不需要使用接口。

我目前将函数和子程序定义在与主程序相同的文件中,但尚未定义模块。是否技术上需要一个模块使程序“看到”子程序或函数?如果是这样,为什么程序仍然可以正常工作?谢谢您的帮助! - astay13
是的,你应该这样做,并且分别为“历史原因”。在文件开头有一个包含子程序和函数的模块,在主程序中使用模块名称调用子程序。 - Jonathan Dursi
@astay,你的程序可能是通过隐式类型转换工作的,其中以“b”开头的“baz”被假定为实数。这是一种冒险和过时的方法。请检查并查看如果您将名称更改为ibaz会发生什么情况,此时调用者可能会将其隐式类型转换为整数函数,与实际不符。 - M. S. B.
@M.S.B.,你说得对,程序因为名称更改而无法工作了。我想我会把所有东西都放在一个模块中。感谢你的帮助! - astay13

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