转的FORTRAN/C/C++混合编程,大家有兴趣就看看吧 - 核能革新 ChinaNet
热图推荐
    查看: 7363|回复: 0
    打印 上一主题 下一主题

    转的FORTRAN/C/C++混合编程,大家有兴趣就看看吧

    [复制链接]

    17

    主题

    22

    帖子

    63

    积分

    注册会员

    Rank: 2

    积分
    63
    跳转到指定楼层
    楼主
    发表于 2015-4-8 09:57:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 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论坛
    回复

    使用道具 举报

      关注我们
    • 微信公众号:
    • NuclearNet
    • 扫描二维码加关注

    Powered by Discuz! X3.2 © 2001-2013 Comsenz Inc.

    联系我们|网站声明|中国核网-核能领域第一垂直门户网站

    快速回复 返回顶部 返回列表