ChinaNet

标题: 转的FORTRAN/C/C++混合编程,大家有兴趣就看看吧 [打印本页]

作者: zhuer91    时间: 2015-4-8 09:57
标题: 转的FORTRAN/C/C++混合编程,大家有兴趣就看看吧
本帖最后由 zhuer91 于 2015-4-8 10:03 编辑

C/C++/FORTRAN 混合编程
混合编程在软件编程中是经常遇到的问题,尤其是C/C++/FORTRAN的混合编程,本文主要说
明以上三种语言混合编程中经常遇到的问题,同时,也说明了不同平台下混合编程应注意
的问题。
混合语言编程要注意的问题主要体现在:函数调用和数据结构的存储。
1 Windows平台
函数:由于Fortran编程语言没有大小写之分,Windows平台下的混合语言编程要注意的主
要是大小写的问题。考虑到编译器的差异,可以用下面的方式进行跨平台编程的函数声明
。( C/C++编译器使用Microsoft Visual C++ 6.0, Fortran编译器使用 Digital Visual
Fortran 6.0)。
假设一个C的函数为 void cFunction(); 那么,只需要在它的头文件里面进行如下定义即
可:
#ifdef  __cplusplus
extern “C” void {
#endif
extern void __stdcall CFunction();
#define cFunction CFUNCTION
#ifdef __cplusplus
}
#endif
这样,在Fortran或者C++的程序里面就可以直接调用了。
假设是一个Fortran函数SUBROUTINE FFUNCTION(); 那么,在C++头文件里进行如下的定义
就可以了:
#ifdef  __cplusplus
extern “C” void {
#endif
extern void __stdcall ffunction();
#define ffunction FFUNCTION
#ifdef __cplusplus
}
#endif
这样,就可以在C++的程序里面直接调用。由于C编译器里面,没有定义__cplusplus这个环
境变量,因此,C文件里面,也可以直接使用这个头文件。
如果是一个C++函数,如: void cPlusplusFunction();和c函数一样,进行下面的定义
即可:
#ifdef  __cplusplus
extern “C” void {
#endif
extern void __stdcall cPlusplusFunction ();
#define cPlusplusFunction CPLUSPLUSFUNCTION
#ifdef __cplusplus
}
#endif
经过上面的定义后,所有的函数便可以在三种语言中自由调用。
在三种语言的混合编程中,还要注意函数的参数:字符串的传递问题。
Windows平台上的Fortran和C/C++的混合语言编程里,字符串的处理需要特别注意。Fortr
an的一个字符变量是定长的字符串,没有特别的终止符号,这不像C/C++。关于怎样表示字
符、怎样存储它们的长度没有固定的约定。有些编译器把一个字符参数作为一对参数传送
给一个程序,其中之一是保存这个串的地址,另一个是保存串的长度。Fortran里面字符串
的结束就是靠字符串的长度确定的。
对含有字符串的函数,可以这样处理:
例如函数 void cCharFunction( char *msg );需要定义成:void cCharFunction( char
*msg , int len ); 经过上面的define之后,在Fortran中,只需调用CCHARFUNCTION( M
SG )即可。由于Fortran程序没有明显得字符串结束标志,这样,如果两个字符串连在一
起的话,C的程序里就会取到这个连在一起的字符串,因此,最好在C的程序里面,对这个
由Fortran程序得到的字符串进行处理,因为,从len这个变量,可以得到字符串长度,截
取msg的前len个字符作为这个字符串的应有长度。






转自52MC论坛





欢迎光临 ChinaNet (http://www.nuclear.net.cn/) Powered by Discuz! X3.1