3 回答

TA貢獻1841條經(jīng)驗 獲得超3個贊
模塊永遠(yuǎn)是正確的選擇;-)
如果您有一個非常簡單的F90程序,則可以在“包含”塊中包含函數(shù)和子例程:
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
然后,函數(shù)/子例程的接口將在程序中已知,并且不需要在接口塊中定義。
對于更復(fù)雜的程序,應(yīng)將所有函數(shù)/子例程保留在模塊中,并在需要時加載它們。因此,您也不需要定義接口:
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
該模塊和程序可以(實際上應(yīng)該)在單獨的文件中,但是必須在實際程序之前編譯該模塊。

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

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