3 回答

TA貢獻1841條經驗 獲得超3個贊
模塊永遠是正確的選擇;-)
如果您有一個非常簡單的F90程序,則可以在“包含”塊中包含函數和子例程:
program simple
implicit none
integer :: x, y
x = ...
y = myfunc(x)
contains
function myfunc(x) result(y)
implicit none
integer, intent(in) :: x
integer :: y
...
end function myfunc
end program
然后,函數/子例程的接口將在程序中已知,并且不需要在接口塊中定義。
對于更復雜的程序,應將所有函數/子例程保留在模塊中,并在需要時加載它們。因此,您也不需要定義接口:
module mymod
implicit none
private
public :: myfunc
contains
function myfunc(x) result(y)
implicit none
integer, intent(in) :: x
integer :: y
...
end function myfunc
end module mymod
program advanced
use mymod, only: myfunc
implicit none
integer :: x, y
x = ...
y = myfunc(x)
end program advanced
該模塊和程序可以(實際上應該)在單獨的文件中,但是必須在實際程序之前編譯該模塊。

TA貢獻1829條經驗 獲得超6個贊
第二,擴大已經說過的話。最好將您的過程(子例程和函數)放入模塊中并“使用”它們,因為您可以輕松地對它們進行接口的自動一致性檢查。其他方式也有缺點。如果使用接口塊定義接口,則需要維護三件事,而不是兩件事:接口,過程本身和調用。如果進行更改,則必須修改所有三個以保持一致。如果使用模塊,則只需更改兩個。使用接口塊的原因是,如果您無權訪問源代碼(例如,預編譯的庫)或源代碼是另一種語言(例如,您正在通過ISO C綁定使用C代碼)。
“包含”方法的缺點在于,所包含的過程繼承了父程序的所有局部變量……這不是非常模塊化的,如果您忘記了這種“功能”,可能會造成很大的混亂。

TA貢獻1887條經驗 獲得超5個贊
alexurba和MSB的答案是正確的,并且像往常一樣有用;讓我在一點上充實一些細節-如果要使用模塊(的確是這樣),那么接口到底有什么用呢?
對于模塊中的函數和子例程,該模塊中的所有內容都use
可以自動看到那些接口;接口是在編譯模塊時生成的(除其他外,這些信息將進入編譯模塊時生成的.mod文件中)。因此,您無需自己編寫。同樣,當您使用CONTAIN
ed子程序時(與MSB一致,我發現它更加令人困惑,然后有所幫助- 與外部子程序相比,它們被更好地認為是閉包或嵌套子程序),主程序已經可以顯式“查看”接口不需要您為此寫出來。
接口塊適用于您無法執行的操作-編譯器無法為您生成顯式接口時,或者您想要的內容與給定的內容不同時。一個示例是在Fortran 2003中使用C-Fortran互操作性。在這種情況下,Fortran代碼正在鏈接到某些C庫(例如),并且無法為您生成與C例程的正確的fortran接口-您必須通過編寫自己的接口塊,自己完成操作。
另一個例子是,當您已經知道子例程的接口,但是當您想創建一個新的接口來“隱藏”后面的子例程時,例如,當您有一個對整數進行操作的例程(例如,對整數進行操作) ,并且您希望能夠在任何一個上調用相同的例程名稱,并讓編譯器根據參數對其進行排序。這種構造稱為通用例程,自Fortran 90開始就存在。在這種情況下,您將顯式創建此新通用例程的接口,并在該接口塊內列出與“真實”例程的接口。
- 3 回答
- 0 關注
- 921 瀏覽
添加回答
舉報