資源描述:
《C與FORTRAN混合編程2(寫得挺好的)》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。
1、發(fā)信人:jxbking(arcane),信區(qū):Fortran標(biāo)?題:偶總結(jié)的FORTRAN/C/C++混合編程,大家有興趣就看看吧發(fā)信站:南京大學(xué)小百合站(FriJun?413:21:502004)C/C++/FORTRAN混合編程混合編程在軟件編程中是經(jīng)常遇到的問題,尤其是C/C++/FORTRAN的混合編程,本文主要說明以上三種語言混合編程中經(jīng)常遇到的問題,同時(shí),也說明了不同平臺(tái)下混合編程應(yīng)注意的問題?;旌险Z言編程要注意的問題主要體現(xiàn)在:函數(shù)調(diào)用和數(shù)據(jù)結(jié)構(gòu)的存儲(chǔ)。1Windows平臺(tái)函數(shù):由于Fortran編程語言沒有大小寫之分,Wi
2、ndows平臺(tái)下的混合語言編程要注意的主要是大小寫的問題。考慮到編譯器的差異,可以用下面的方式進(jìn)行跨平臺(tái)編程的函數(shù)聲明。(C/C++編譯器使用MicrosoftVisualC++6.0,Fortran編譯器使用DigitalVisualFortran6.0)。假設(shè)一個(gè)C的函數(shù)為voidcFunction();那么,只需要在它的頭文件里面進(jìn)行如下定義即可:#ifdef?__cplusplusextern“C”void{#endifexternvoid__stdcallCFunction();#definecFunctionCFUNCTION
3、#ifdef__cplusplus}#endif這樣,在Fortran或者C++的程序里面就可以直接調(diào)用了。假設(shè)是一個(gè)Fortran函數(shù)SUBROUTINEFFUNCTION();那么,在C++頭文件里進(jìn)行如下的定義就可以了:#ifdef?__cplusplusextern“C”void{#endifexternvoid__stdcallffunction();#defineffunctionFFUNCTION#ifdef__cplusplus}#endif這樣,就可以在C++的程序里面直接調(diào)用。由于C編譯器里面,沒有定義__cplusp
4、lus這個(gè)環(huán)境變量,因此,C文件里面,也可以直接使用這個(gè)頭文件。如果是一個(gè)C++函數(shù),如:voidcPlusplusFunction();和c函數(shù)一樣,進(jìn)行下面的定義即可:#ifdef?__cplusplusextern“C”void{#endifexternvoid__stdcallcPlusplusFunction();#definecPlusplusFunctionCPLUSPLUSFUNCTION#ifdef__cplusplus}#endif經(jīng)過上面的定義后,所有的函數(shù)便可以在三種語言中自由調(diào)用。在三種語言的混合編程中,還要注意
5、函數(shù)的參數(shù):字符串的傳遞問題。Windows平臺(tái)上的Fortran和C/C++的混合語言編程里,字符串的處理需要特別注意。Fortran的一個(gè)字符變量是定長的字符串,沒有特別的終止符號(hào),這不像C/C++。關(guān)于怎樣表示字符、怎樣存儲(chǔ)它們的長度沒有固定的約定。有些編譯器把一個(gè)字符參數(shù)作為一對(duì)參數(shù)傳送給一個(gè)程序,其中之一是保存這個(gè)串的地址,另一個(gè)是保存串的長度。Fortran里面字符串的結(jié)束就是靠字符串的長度確定的。對(duì)含有字符串的函數(shù),可以這樣處理:例如函數(shù)voidcCharFunction(char*msg);需要定義成:voidcCharF
6、unction(char*msg,intlen);經(jīng)過上面的define之后,在Fortran中,只需調(diào)用CCHARFUNCTION(MSG)即可。由于Fortran程序沒有明顯得字符串結(jié)束標(biāo)志,這樣,如果兩個(gè)字符串連在一起的話,C的程序里就會(huì)取到這個(gè)連在一起的字符串,因此,最好在C的程序里面,對(duì)這個(gè)由Fortran程序得到的字符串進(jìn)行處理,因?yàn)?,從len這個(gè)變量,可以得到字符串長度,截取msg的前l(fā)en個(gè)字符作為這個(gè)字符串的應(yīng)有長度。而如果是在Fortran程序里面,如函數(shù):SUBROUTINEFCHARFUNCTION(FCHAR);
7、經(jīng)過相應(yīng)的聲明,進(jìn)行下面的定義即可:#definefCharFunction(fchar),FCHARFUNCTION(fchar,strlen(fchar))這樣,在C/C++程序里即可直接調(diào)用。在這三種語言的混合編程里,還有一個(gè)小問題就是指針的問題。Fortran里面所有的變量都相當(dāng)于C/C++里面的指針,所以,在C/C++里面的程序里,函數(shù)的參數(shù)應(yīng)一律聲明成指針的形式(除了字符串參數(shù)后面的長度)。數(shù)據(jù):混合編程里,數(shù)據(jù)上存在的差異也必須引起足夠的重視。這體現(xiàn)在兩個(gè)方面,數(shù)組和結(jié)構(gòu)。數(shù)組:Fortran語言里面,數(shù)組和C/C++里面的
8、數(shù)組有些不同,這表現(xiàn)在兩個(gè)方面,一是行列順序,二是數(shù)組起始值。Fortran語言不同于C/C++的行優(yōu)先,而使用列優(yōu)先的方式。假設(shè)一個(gè)A數(shù)組,m行n列,那么采用行優(yōu)先時(shí)的數(shù)據(jù)存放格式為:a11