Fortran moudle/subroutine/function 的用法示例
吐槽:作為一個Fortran 語言的初學者,本人深刻體會到 fortran 對于像我這樣母語是C 的編程小白的強烈不友好!幾天不碰,想要實現一個小小的功能就舉步維艱。所以我覺得還是要多總結,今天閑來無事,就對 moudle/subroutine/function 這些用法做一個簡單的小結8!
正文
知識點什么的,書上,網上一大堆,所以就不在這里多費筆墨了,這里主要講一個簡單的例子。
1、題目
題目是一個簡單的雙線性內插的計算,為了涵蓋moudle/subroutine/function 所以本人采用了如下的方法
2、看到題目,我就想創建一個結構體——moudle 的用法
module typedeftype pointreal x,y,zend type containssubroutine set_p(p,x,y,z)type(point) preal x,y,zp.x=x;p.y=y;p.z=zend subroutine !Attention heresubroutine show_p(P)type(point) Pprint 100," x=",P.x," y=",P.y," f(x,y)=",P.z 100 format(a4,f9.3,a4,f9.3,a9,f9.3) end subroutine end module可以看到,創建了一個point 結構體,就相當于C++ 里面的類,里面有x,y,z 三個 real 型的量,其中 z=f(x,y)
然后 contains 了倆子例程
值得注意的是,
1)在moudle 里面的子例程結束的時候必須用
end subroutine subroutine 是不可以省去的
2)在使用自定義的結構體時,用
type(point) p 有別與C/C#中的 point p
3、函數——function 的用法
function fun(Q1,Q2,x) result(P)use typedefimplicit nonetype(point) Q1,Q2,Preal x !x is PQ1/PQ2P.z=x*Q2.z+(1-x)*Q1.zP.x=x*Q2.x+(1-x)*Q1.xP.y=x*Q2.y+(1-x)*Q1.yendfun 是函數名字,后邊()中的是傳入形參,result()里面是傳出形參
用moudle 的時候,要加use typedef 類似于C 里面的include <...> 你得告訴人家你用的模塊的叫什么,不然別人怎么清楚你用的是什么
4、子例程——subroutine 的用法
subroutine sub(Q11,Q12,Q21,Q22,P) use typedefimplicit nonetype(point) Q11,Q12,Q21,Q22,P,R1,R2,fun !Attention hereR1=fun(Q11,Q21,(P.x-Q11.x)/(Q21.x-Q11.x))R2=fun(Q12,Q22,(P.x-Q12.x)/(Q22.x-Q12.x))P=fun(R1,R2,(P.y-R1.y)/(R2.y-R1.y))end subroutine在這里,可以看到,在使用function 的時候,要對fun 下定義!!!
這里請注意如何調用fun的!
無論是function 還是 subroutine 都要對()里面的參數下定義,參數的類型說明不是放在括號里面,而是現于內部。
老師說subroutine 和 function 并沒有本質的區別,但是個人更喜歡subroutine ,因為上機的時候想用function 把我搞炸了(小聲bb)
5、完整程序及輸出結果
module typedeftype pointreal x,y,zend type containssubroutine set_p(p,x,y,z)type(point) preal x,y,zp.x=x;p.y=y;p.z=zend subroutine !Attention heresubroutine show_p(P)type(point) Pprint 100," x=",P.x," y=",P.y," f(x,y)=",P.z 100 format(a4,f9.3,a4,f9.3,a9,f9.3) end subroutine end moduleprogram Hellouse typedefimplicit nonetype(point) Q11,Q12,Q21,Q22,P !Attention herereal x,ycall set_p(Q11,0.0,0.0,0.0)call set_p(Q21,1.0,0.0,1.0)call set_p(Q12,0.0,1.0,2.0)call set_p(Q22,1.0,1.0,3.0)p.x=0.3;p.y=0.7call sub(Q11,Q12,Q21,Q22,P)print *,"Q11:"call show_p(Q11)print *,"Q12:"call show_p(Q12)print *,"Q21:"call show_p(Q21)print *,"Q22:"call show_p(Q22)print *,"P:"call show_p(P)pauseendsubroutine sub(Q11,Q12,Q21,Q22,P) use typedefimplicit nonetype(point) Q11,Q12,Q21,Q22,P,R1,R2,fun !Attention hereR1=fun(Q11,Q21,(P.x-Q11.x)/(Q21.x-Q11.x))R2=fun(Q12,Q22,(P.x-Q12.x)/(Q22.x-Q12.x))P=fun(R1,R2,(P.y-R1.y)/(R2.y-R1.y))end subroutinefunction fun(Q1,Q2,x) result(P)use typedefimplicit nonetype(point) Q1,Q2,Preal x !x is PQ1/PQ2P.z=x*Q2.z+(1-x)*Q1.zP.x=x*Q2.x+(1-x)*Q1.xP.y=x*Q2.y+(1-x)*Q1.yend這里請注意如何調用sub的!
輸出結果
總結
以上是生活随笔為你收集整理的Fortran moudle/subroutine/function 的用法示例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C# WinForm窗体程序、如何实现像
- 下一篇: [集训队作业2018]喂鸽子