亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

將多個變量的外部函數作為Fortran中一個變量的函數進行傳遞

將多個變量的外部函數作為Fortran中一個變量的函數進行傳遞

互換的青春 2019-11-20 14:30:30
我正在嘗試使用例程QUADPACK來執行數值積分。例程希望函數以形式傳遞REAL,EXTERNAL,所以我沒有使用指針或其他任何東西的自由。是否可以將函數別名f(x,a,b,...)為f(x)僅期望x 函數的例程的函數?就像什么人會在完成MATLAB用@(x)f(x,a,b,...)。
查看完整描述

2 回答

?
紫衣仙女

TA貢獻1839條經驗 獲得超15個贊

您不能直接使用Fortran中的函數來做類似的技巧。您也無法在Fortran中返回閉包。只是寫一個包裝。


function wrap_f(x) result(res)

  ...

  res = f(a,b,...)

end function

它可以是內部函數或模塊函數,并可以通過主機關聯獲取a和b,也可以使用包含a和的模塊b。


如果要將函數作為實際參數傳遞,則在Fortran 2003之前的版本中,它不能是內部過程,而只能在Fortran 2008中。它只能在gfortran和ifort的最新版本中使用。為了更好的可移植性,請使用模塊。


查看完整回答
反對 回復 2019-11-20
?
慕運維8079593

TA貢獻1876條經驗 獲得超5個贊

我可以為這個問題顯示一個很好的解決方案。我也是MATLAB的前用戶,切換到FORTRAN時會錯過函數句柄哈哈。我以這種方式解決了您的問題:


module


     private

     public    :: f , g


     real(kind=RP)   :: a0,b0,c0,...


     contains

         function f(x,a,b,c,d,...) 

               implicit none

               real(kind=RP)  :: x,a,b,c,d,...

               real(kind=RP)  :: f

!              Here you define your function

               f = ...


         end function f


         function g(x)

               implicit none

               real(kind=RP)  :: x , g


!              Here you call "f" function with the frozen variables *0

               g = f(x,a0,b0,c0,...)

         end function g


!        We said that parameters were private 

!     (to avoid to be modified from the outside, which can be dangerous, 

!     so we define functions to set their values


         subroutine setValues(a,b,c,...)

               implicit none

               real(kind=RP)   :: a,b,c,...


               a0 = a

               b0 = b

               c0 = c


          end subroutine setValues




end module 


查看完整回答
反對 回復 2019-11-20
  • 2 回答
  • 0 關注
  • 808 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號