第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

正確使用Fortran中的模塊,子例程和函數(shù)

正確使用Fortran中的模塊,子例程和函數(shù)

慕雪6442864 2019-12-27 15:40:52
我最近了解了在向Fortran程序中添加函數(shù)時的接口塊。一切都工作得井井有條,但是現(xiàn)在我想在接口塊中添加第二個函數(shù)。這是我的界面塊:interface    function correctNeighLabel (A,i,j,k)    integer :: correctNeighLabel    integer, intent(in) :: i,j,k    integer,dimension(:,:,:),intent(inout) :: A    end function    function correctNeighArray (B,d,e,f)        character :: correctNeighArray    integer, intent(in) :: d,e,f    character, dimension(:,:,:),intent(inout) :: B    end functionend interface在我看來,這可能不是最佳選擇。我已經(jīng)研究了子例程,但是我不太確定這是正確的解決方案。我正在做的事情是相對簡單的,我需要將參數(shù)傳遞給子例程,但是我所看到的所有子例程都是a)復(fù)雜的(即,對于函數(shù)而言過于復(fù)雜),并且b)不接受參數(shù)。它們的行為就像是在不將變量傳遞給變量的情況下操縱變量一樣。我還沒有真正地研究模塊,但是從我看來,這不是正確的選擇。什么時候應(yīng)該使用哪個,如何最好地使用它?
查看完整描述

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)該)在單獨的文件中,但是必須在實際程序之前編譯該模塊。


查看完整回答
反對 回復(fù) 2019-12-27
?
肥皂起泡泡

TA貢獻1829條經(jīng)驗 獲得超6個贊

第二,擴大已經(jīng)說過的話。最好將您的過程(子例程和函數(shù))放入模塊中并“使用”它們,因為您可以輕松地對它們進行接口的自動一致性檢查。其他方式也有缺點。如果使用接口塊定義接口,則需要維護三件事,而不是兩件事:接口,過程本身和調(diào)用。如果進行更改,則必須修改所有三個以保持一致。如果使用模塊,則只需更改兩個。使用接口塊的原因是,如果您無權(quán)訪問源代碼(例如,預(yù)編譯的庫)或源代碼是另一種語言(例如,您正在通過ISO C綁定使用C代碼)。

“包含”方法的缺點在于,所包含的過程繼承了父程序的所有局部變量……這不是非常模塊化的,如果您忘記了這種“功能”,可能會造成很大的混亂。


查看完整回答
反對 回復(fù) 2019-12-27
?
慕工程0101907

TA貢獻1887條經(jīng)驗 獲得超5個贊

alexurba和MSB的答案是正確的,并且像往常一樣有用;讓我在一點上充實一些細(xì)節(jié)-如果要使用模塊(的確是這樣),那么接口到底有什么用呢?

對于模塊中的函數(shù)和子例程,該模塊中的所有內(nèi)容都use可以自動看到那些接口;接口是在編譯模塊時生成的(除其他外,這些信息將進入編譯模塊時生成的.mod文件中)。因此,您無需自己編寫。同樣,當(dāng)您使用CONTAINed子程序時(與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)列出與“真實”例程的接口。


查看完整回答
反對 回復(fù) 2019-12-27
  • 3 回答
  • 0 關(guān)注
  • 918 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號