日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Fortran moudle/subroutine/function 的用法示例

發布時間:2023/12/20 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 了倆子例程

set_p //為結構體賦值 show_p//打印結構體

值得注意的是,
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.yend

fun 是函數名字,后邊()中的是傳入形參,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的!
輸出結果

Q11:x= 0.000 y= 0.000 f(x,y)= 0.000Q12:x= 0.000 y= 1.000 f(x,y)= 2.000Q21:x= 1.000 y= 0.000 f(x,y)= 1.000Q22:x= 1.000 y= 1.000 f(x,y)= 3.000P:x= 0.300 y= 0.700 f(x,y)= 1.700

總結

以上是生活随笔為你收集整理的Fortran moudle/subroutine/function 的用法示例的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。