資源描述:
《C與Fortran混合編程-本地調(diào)用Fortran動(dòng)態(tài)鏈接庫(kù).docx》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫(kù)。
1、C#與Fortran混合編程-本地調(diào)用Fortran動(dòng)態(tài)鏈接庫(kù)Fortran是一門古老的語(yǔ)言,它是世界上最早出現(xiàn)的計(jì)算機(jī)高級(jí)程序設(shè)計(jì)語(yǔ)言,廣泛應(yīng)用于科學(xué)和工程計(jì)算領(lǐng)域。FORTRAN語(yǔ)言以其特有的功能在數(shù)值、科學(xué)和工程計(jì)算領(lǐng)域發(fā)揮著重要作用。然而Fortran程序本身不適合開(kāi)發(fā)獨(dú)立的應(yīng)用程序,例如我們傳統(tǒng)的桌面應(yīng)用或者Web應(yīng)用。因此這里我們便想將C#與Fortran結(jié)合,C#借助Fortran可以實(shí)現(xiàn)精度更高,計(jì)算更快的程序,而Fortran通過(guò)C#,便也能夠達(dá)到可視化設(shè)計(jì)。?一、基本思路運(yùn)用Fortran,編寫動(dòng)態(tài)鏈接庫(kù)(DLL),在DLL中提供計(jì)算的函數(shù)接口,然后在C#中調(diào)用該DLL中
2、計(jì)算部分的函數(shù),實(shí)現(xiàn)計(jì)算過(guò)程。這里需要注意的是,由于我們使用的是Fortran編譯器,生成的DLL屬于第三方非托管DLL,因此無(wú)法直接在程序中添加DLL的引用。具體的做法將在后續(xù)部分說(shuō)明。?二、編寫Fortran程序,生成動(dòng)態(tài)鏈接庫(kù)文件知道思路之后便開(kāi)始正式的Coding。首先新建一個(gè)空的FortranDynamic-linkLibrary項(xiàng)目。在Intel(R)VisualFortran點(diǎn)擊Library,選中右圖的Dynamic-linkLibrary.然后點(diǎn)擊OK.這時(shí)的項(xiàng)目如下所示:點(diǎn)擊SourcesFile文件夾,選擇新建項(xiàng)。添加一個(gè)新的Fortran文件然后便開(kāi)始Fortran代
3、碼的編寫工作。這里我們主要實(shí)現(xiàn)兩個(gè)方法:一個(gè)方法是求兩個(gè)數(shù)相加之和,并返回結(jié)果。另一個(gè)是輸入一個(gè)數(shù)組,對(duì)這個(gè)數(shù)組進(jìn)行排序,并找出最大值,最后返回排序后的結(jié)果,并返回最大值。這里我們分別演示的是Fortran傳出一個(gè)數(shù)和一個(gè)數(shù)組有何不同。關(guān)于Fortran的基本語(yǔ)法不是本文的討論范疇,請(qǐng)讀者自行查閱資料。下面給出的上述我們要實(shí)現(xiàn)的功能的具體Fortran代碼:DOUBLEPRECISIONFUNCTIONADD(A,B)!DEC$ATTRIBUTESDLLEXPORT::ADD!DEC$ATTRIBUTESSTDCALL,ALIAS:'Add'::ADDDOUBLEPRECISION::A,B
4、ADD=A+BENDFUNCTIONSORTANDFINDMAX(ARRAY,LENGTH)!DEC$ATTRIBUTESDLLEXPORT::SORTANDFINDMAX!DEC$ATTRIBUTESSTDCALL,ALIAS:'Sortandfindmax'::SORTANDFINDMAXDOUBLEPRECISION::ARRAY(LENGTH)INTEGER::I,JDOUBLEPRECISION::SORTANDFINDMAX,TEMPSORTANDFINDMAX=ARRAY(1)DOI=1,LENGTH-1DOJ=I+1,LENGTHIF(ARRAY(I).GT.ARRAY(J)
5、)THENTEMP=ARRAY(I)ARRAY(I)=ARRAY(J)ARRAY(J)=TEMPSORTANDFINDMAX=ARRAY(J)ENDIFENDDOENDDOEND上面我們聲明了兩個(gè)Fortran函數(shù),一個(gè)是計(jì)算兩個(gè)數(shù)相加,一個(gè)是選擇排序并找出最大值。之后我們點(diǎn)擊VisualStudio的BuildSolution.開(kāi)始編譯成DLL。關(guān)于代碼段解釋:!DEC$ATTRIBUTESDLLEXPORT::ADD!DEC$ATTRIBUTESSTDCALL,ALIAS:'Add'::ADD這兩句代碼很關(guān)鍵。下面通過(guò)三個(gè)一致來(lái)簡(jiǎn)單的說(shuō)一下以上代碼段的意思和C#調(diào)用需要注意的問(wèn)題。1.函
6、數(shù)名一致:在Fortran編譯器中默認(rèn)的導(dǎo)出函數(shù)名全部是大寫形式。而在C#中調(diào)用FortranDll時(shí)必須指定函數(shù)名一致。在Fortran方面解決的辦法是:使用ALIAS(別名)屬性指定導(dǎo)出函數(shù)名。例如對(duì)于下面的Fortran函數(shù):DOUBLEPRECISIONFUNCTIONADD(A,B)!DEC$ATTRIBUTESDLLEXPORT::ADDDOUBLEPRECISIONA,BADD=A+BEND對(duì)應(yīng)的C#聲明為:[DllImport("MathDll")]privatestaticexterndoubleADD(doubleA,doubleB);使用ALIAS修改后的定義如下:Do
7、ublePrecisionFunctionADD(A,B)!DEC$ATTRIBUTESDLLEXPORT::ADD!DEC$ATTRIBUTESALIAS:'Add'::AddDoublePrecisionA,BAdd=A+BEnd對(duì)應(yīng)的C#聲明為:[DllImport("MathDll")]privatestaticexterndoubleAdd(doubleA,doubleB);而在C#中提供的解決方案