Fortran moudle/subroutine/function 的用法示例
吐槽:作為一個(gè)Fortran 語(yǔ)言的初學(xué)者,本人深刻體會(huì)到 fortran 對(duì)于像我這樣母語(yǔ)是C 的編程小白的強(qiáng)烈不友好!幾天不碰,想要實(shí)現(xiàn)一個(gè)小小的功能就舉步維艱。所以我覺(jué)得還是要多總結(jié),今天閑來(lái)無(wú)事,就對(duì) moudle/subroutine/function 這些用法做一個(gè)簡(jiǎn)單的小結(jié)8!
正文
知識(shí)點(diǎn)什么的,書(shū)上,網(wǎng)上一大堆,所以就不在這里多費(fèi)筆墨了,這里主要講一個(gè)簡(jiǎn)單的例子。
1、題目
題目是一個(gè)簡(jiǎn)單的雙線性內(nèi)插的計(jì)算,為了涵蓋moudle/subroutine/function 所以本人采用了如下的方法
2、看到題目,我就想創(chuàng)建一個(gè)結(jié)構(gòu)體——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可以看到,創(chuàng)建了一個(gè)point 結(jié)構(gòu)體,就相當(dāng)于C++ 里面的類,里面有x,y,z 三個(gè) real 型的量,其中 z=f(x,y)
然后 contains 了倆子例程
值得注意的是,
1)在moudle 里面的子例程結(jié)束的時(shí)候必須用
end subroutine subroutine 是不可以省去的
2)在使用自定義的結(jié)構(gòu)體時(shí),用
type(point) p 有別與C/C#中的 point p
3、函數(shù)——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 是函數(shù)名字,后邊()中的是傳入形參,result()里面是傳出形參
用moudle 的時(shí)候,要加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 的時(shí)候,要對(duì)fun 下定義!!!
這里請(qǐng)注意如何調(diào)用fun的!
無(wú)論是function 還是 subroutine 都要對(duì)()里面的參數(shù)下定義,參數(shù)的類型說(shuō)明不是放在括號(hào)里面,而是現(xiàn)于內(nèi)部。
老師說(shuō)subroutine 和 function 并沒(méi)有本質(zhì)的區(qū)別,但是個(gè)人更喜歡subroutine ,因?yàn)樯蠙C(jī)的時(shí)候想用function 把我搞炸了(小聲bb)
5、完整程序及輸出結(jié)果
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這里請(qǐng)注意如何調(diào)用sub的!
輸出結(jié)果
總結(jié)
以上是生活随笔為你收集整理的Fortran moudle/subroutine/function 的用法示例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: C# WinForm窗体程序、如何实现像
- 下一篇: [集训队作业2018]喂鸽子