2011-07-11 123 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會發生什麼情況,在這種情況下,調用者可能會隱式地將其輸入爲整數函數,而不會與實際情況相反。 –