C与FORTRAN混合编程2(写得挺好的).doc
《C与FORTRAN混合编程2(写得挺好的).doc》由会员分享,可在线阅读,更多相关《C与FORTRAN混合编程2(写得挺好的).doc(7页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、发信人: jxbking (arcane), 信区: Fortran标 题: 偶总结的FORTRAN/C/C+混合编程,大家有兴趣就看看吧发信站: 南京大学小百合站 (Fri Jun 4 13:21:50 2004)C/C+/FORTRAN 混合编程混合编程在软件编程中是经常遇到的问题,尤其是C/C+/FORTRAN的混合编程,本文主要说明以上三种语言混合编程中经常遇到的问题,同时,也说明了不同平台下混合编程应注意的问题。混合语言编程要注意的问题主要体现在:函数调用和数据结构的存储。1 Windows平台函数:由于Fortran编程语言没有大小写之分,Windows平台下的混合语言编程要注意的
2、主要是大小写的问题。考虑到编译器的差异,可以用下面的方式进行跨平台编程的函数声明。( C/C+编译器使用Microsoft Visual C+ 6.0, Fortran编译器使用 Digital Visual Fortran 6.0)。假设一个C的函数为 void cFunction(); 那么,只需要在它的头文件里面进行如下定义即可: #ifdef _cplusplusextern “C” void #endifextern void _stdcall CFunction();define cFunction CFUNCTION #ifdef _cplusplus#endif这样,在Fort
3、ran或者C+的程序里面就可以直接调用了。假设是一个Fortran函数SUBROUTINE FFUNCTION(); 那么,在C+头文件里进行如下的定义就可以了:#ifdef _cplusplusextern “C” void #endifextern void _stdcall ffunction();define ffunction FFUNCTION #ifdef _cplusplus#endif这样,就可以在C+的程序里面直接调用。由于C编译器里面,没有定义_cplusplus这个环境变量,因此,C文件里面,也可以直接使用这个头文件。如果是一个C+函数,如: void cPlusplu
4、sFunction();和c函数一样,进行下面的定义即可:#ifdef _cplusplusextern “C” void #endifextern void _stdcall cPlusplusFunction ();define cPlusplusFunction CPLUSPLUSFUNCTION #ifdef _cplusplus#endif经过上面的定义后,所有的函数便可以在三种语言中自由调用。在三种语言的混合编程中,还要注意函数的参数:字符串的传递问题。Windows平台上的Fortran和C/C+的混合语言编程里,字符串的处理需要特别注意。Fortran的一个字符变量是定长的字符
5、串,没有特别的终止符号,这不像C/C+。关于怎样表示字符、怎样存储它们的长度没有固定的约定。有些编译器把一个字符参数作为一对参数传送给一个程序,其中之一是保存这个串的地址,另一个是保存串的长度。Fortran里面字符串的结束就是靠字符串的长度确定的。对含有字符串的函数,可以这样处理:例如函数 void cCharFunction( char *msg );需要定义成:void cCharFunction( char *msg , int len ); 经过上面的define之后,在Fortran中,只需调用CCHARFUNCTION( MSG )即可。由于Fortran程序没有明显得字符串结束
6、标志,这样,如果两个字符串连在一起的话,C的程序里就会取到这个连在一起的字符串,因此,最好在C的程序里面,对这个由Fortran程序得到的字符串进行处理,因为,从len这个变量,可以得到字符串长度,截取msg的前len个字符作为这个字符串的应有长度。而如果是在Fortran程序里面,如函数:SUBROUTINE FCHARFUNCTION(FCHAR);经过相应的声明,进行下面的定义即可: define fCharFunction( fchar ), FCHARFUNCTION( fchar, strlen(fchar) )这样,在C/C+程序里即可直接调用。在这三种语言的混合编程里,还有一个
7、小问题就是指针的问题。Fortran里面所有的变量都相当于C/C+里面的指针,所以,在C/C+里面的程序里,函数的参数应一律声明成指针的形式(除了字符串参数后面的长度)。数据:混合编程里,数据上存在的差异也必须引起足够的重视。这体现在两个方面,数组和结构。数组:Fortran语言里面,数组和C/C+里面的数组有些不同,这表现在两个方面,一是行列顺序,二是数组起始值。Fortran语言不同于C/C+的行优先,而使用列优先的方式。假设一个A数组,m行n列,那么采用行优先时的数据存放格式为:a11,a12,a1n,a21,a22,a2n,,am1,am2,,amn而采用列优先的数据存放格式为:a11
8、,a21,am1,a12,a22,am2,,a1n,a2n,,amn行优先顺序推广到多维数组,规定为先排最右的下标;列优先顺序推广到多维数组,规定为先排最左的下标。这样,在混合语言编程里调用数据时,必须注意行列优先的差别,进行准确的调用。数组的另一个差别是起始下标的不同。Fortran里面,默认的数组下标是以1开始的,而C/C+里面是从0开始的,所以,在调用里面要注意加一或者减一,以保证调用到正确的数据。结构:在Fortran语言里的结构经过声明后,就被分配了空间,在C/C+里面也要声明它,采用下面的方式:Fortran:COMMON /COLOR7/ C_RED, C_GREEN, C_BL
9、UECOMMON /NDDAT/ NID(NASIZE),XN(3,NASIZE)C/C+:#ifdef _cplusplusextern C #endif#define color7 COLOR7#define nddat NDDATextern struct float c_red; float c_green; float c_blue; color7;extern struct int nidNASIZE; float xnNASIZE3; nddat; #ifdef _cplusplus#endif2 Linux平台Linux平台的混合语言编程和Windows平台上的基本没有什么区别
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- FORTRAN 混合 编程 挺好
限制150内