2011-07-11 92 views
3

我有一个程序调用一个子程序,然后调用一个函数。我对Fortran对函数类型声明的要求有些困惑。我已经在函数中声明了这个类型(即真实函数foo(...)),并且无论我在子例程声明部分中声明函数,该程序都能正常工作。Fortran中的函数接口90/95

我的具体问题是,不会在子程序中声明函数可能会导致未来的意外行为?我也看到了接口块,并且想知道这是否也是必需的。更为普遍的是,我也对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 
+0

你可以在这里给一些示例代码吗?我不确定你是什么意思。该函数是否被传递给子例程,或者该子例程是否具有调用该函数的CONTAINS行,或者...? –

+0

@乔纳森,你去了。 – astay13

回答

5

最好的方法是,以声明该函数中的函数,然后放置的功能的模块中。然后从调用该函数的任何主程序或过程(子例程或函数)中“使用”函数。这样调用程序或过程就会意识到函数的接口并且会生成正确的代码。在Fortran术语中,界面是明确的。如果从同一个模块中的过程调用该函数,则不必“使用”它,因为模块中的过程是相互了解的。示例见Computing the cross product of two vectors in Fortran 90。通常情况下,除非您正在调用缺少源代码的过程,或者使用其他语言(例如,通过ISO C绑定访问C)的过程,否则不需要使用接口。

+0

我目前在主程序的同一个文件中定义了函数和子程序,但是没有定义一个模块。我在技术上需要一个模块让程序“看”子程序或功能吗?如果是这样,为什么程序甚至工作?谢谢你的帮助! – astay13

+0

是的,你应该和“出于历史原因”分别。在包含子程序和函数的文件开始处有一个模块,并在主程序中使用modulename来调用子程序。 –

+0

@astay,你的程序可能是通过隐式键入来工作的,因此以“b”开头的“baz”被假定为真实的。这是一种风险和过时的方法。检查并查看如果将名称更改为ibaz会发生什么情况,在这种情况下,调用者可能会隐式地将其输入为整数函数,而不会与实际情况相反。 –