




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 第22卷第4期洛阳大学学报Vol . 22No . 42007年12月JOURNAL OF LUOY ANG UN I V ERSI TY Dec . 2007C 、C +、Fortran 混合编程研究魏威, 魏冲(郑州铁路职业技术学院, 河南郑州450052摘要:不同计算机编程语言都有其特有的优势和局限性, 将多种语言混合起来进行编程, 不但可以充分发挥各自的优势, 而且可以弥补各自功能的不足, 这样既能充分利用现有程序资源, 又能加快应用程序的开发. 主要阐述了C 、C +、Fortran 等3种语言在不同平台下混合编程应注意的问题, 以及在混合编程中经常遇到的2个问题.关键词:混合编程
2、; C; C +; Fortran中图分类号:TP311文献标识码:A 文章编号:1007-113X (2007 04-0094-05Fortran 算, 但是Fortran , RAD 特性的Fortran 编译集成开发环境. 当用Fortran , 据输入简易、结果显示方便的W C 、C +进行编程却比较容易实现这些功能. 因此, , +、Fortran 等进行混合编程. 在混合语言编程中, 主.1W indows Fortran 语言没有大小写之分, 而W indows 平台下的混合语言编程过程中大小写问题十分突出. 考虑到编译器的差异, 可以用以下方式进行跨平台编程的函数声明. C 、
3、C +编译器使用M icr os oft V isual C +6. 0编译集成开发环境, Fortran 编译器使用D igital V isual Fortran 6. 0编译集成开发环境.假设一个C 语言函数为void cFuncti on ( , 那么只需要在它的头文件里面进行如下定义即可.#ifdef_cplus p lusextern “C ”v oid #endifextern v oid _stdcallCFuncti on ( ;#definecFuncti on CF UNCTI O N#ifdef_cplus p lus#endif这样就可实现上述函数在Fortran 或
4、C +程序中的直接调用.假设一个Fortran 函数为S UBROUTI N E FF UNCTI O N ( , 那么在C +头文件里可进行如下定义. #ifdef_cplus p lusextern “C ”v oid #endifextern v oid _stdcallffuncti on ( ;#defineffuncti on FF UNCTI O N#ifdef_cplus p lus3收稿日期:2007-11-01作者简介:魏威(1960- , 女, 汉族, 河南省郑州市人, 工程师, 研究方向:计算机技术. 第4期魏威等:C 、C +、Fortran 混合编程研究95#end
5、if这样, 就可以在C +的程序里面直接调用上述函数. 由于C 编译器里面没有定义cp lus p lus 这个环境变量, 因此在C 文件里面也可以直接使用这个头文件.如果是一个C +函数void cPlus p lusFuncti on ( , 和C 函数一样可定义如下.#ifdef_cplus p lusextern “C ”v oid #endifextern v oid _stdcallcPlus p lusFuncti on ( ;#definecPlus p lusFuncti on CP LUSP LUSF UNCTI O N#ifdef_cplus p lus#endif经过上
6、面的定义后, 所有的函数便可实现在3种语言间自由调用.在用3三种语言进行混合编程过程中要注意函数的参数、字符串的传递问题. 数, 如函数v oid cCharFuncti on (char 3m sg , 需要定义如下.void cCharFuncti on (char 3m sg, int len 经过上面的定义之后, 在Fortran (m Fortran 程序没有明显的字符串结束标志, 如果是2C 1个字符串. 所以, 最好在C 的程序里对这个由, len 变量可以得到字符串长度, 截取m sg 的前len . 而在Fortran 程序里面, 如函数S UBROUTI N E FCHAR
7、F UNCTI O N (fchar , , 进行下面的定义即可.#definef CharFuncti on (fchar , FCHARF UNCTI O N (fchar, strlen (fchar 这样, 在C 、C +程序里即可直接调用.在3种语言的混合编程里还有一个需要注意的问题就是指针问题. Fortran 里面所有的变量都相当于C 、C +里面的指针, 所以, 在C 、C +程序里函数的参数应一律声明为指针形式(除字符串参数后面的长度外 .在混合编程过程中, 数据方面存在的差异也必须引起足够的重视, 这体现在数组和结构2个方面. 在Fortran 语言里, 数组和C 、C +
8、里的数组有些不同, 这表现在行列顺序和数组起始值. Fortran 语言不同于C 、C +的行优先, 而使用列优先的方式. 假设有一个数组a, m 行n 列, 采用行优先时的数据存放格式如下.a 11, a 12, , a 1n , a 21, a 22, , a 2n , , a m 1, a m 2, , a m n而采用列优先的数据存放格式如下.a 11, a 21, , a m 1, a 12, a 22, , a m 2, , a 1n , a 2n , , a m n行优先顺序推广到多维数组, 规定为先排最右的下标; 列优先顺序推广到多维数组, 规定为先排最左的下标. 这样, 在混
9、合语言编程里调用数据时必须注意行列优先的差别, 进行准确地调用.数组的另一个差别是起始下标的不同. Fortran 默认的数组下标是以1开始的, 而C 、C +默认的数组下标却是从0开始的, 所以在调用时要注意加1或者减1, 以保证调用到正确的数据.Fortran 语言里的结构经过声明后就被分配了空间, 在C 、C +里面也要声明它, 采用下面的方式. Fortran 结构声明格式如下.COMMON /COLOR7/C_RED , C_GREEN,C_BLUECOMMON /NDDAT/N I D (NASI ZE , XN (3, NASI ZE C 、C +结构声明格式如下.#ifdef_
10、cplus p lusextern " C" 96#endif洛阳大学学报2007#definecol or7COLOR7#definenddat NDDATextern struct fl oat c_red;fl oat c_green;fl oat c_blue;col or7;extern struct int nidNASIZE ;fl oat xnNASIZE 3;nddat;#ifdef_cplus p lus#endif2L inux 平台的混合编程L inux 平台的混合语言编程和W indows 平台的混合语言编程基本没有什么区别, 主要是在define
11、 上的不同. 考虑到编译器的差异, 在函数声明上可以用下面的方式进行跨平台编程的函数声明. C 、C +编译器使用G NU gcc, Fortran 编译器使用pgi Fortran .假设一个C 函数为void cFuncti on ( , 那么只需要在它的头文件里面进行如下定义即可.#ifdef_cplus p lusextern “C ”v oid #endifextern v oid CFuncti on ( ;#definecFuncti on cfuncti on_#ifdef_cplus p lus这样, 在C +的程序里面就可以直接进行调用了. 需要注意的是, 函数名应该不多于
12、31个字符.同样, 对于C +和Fortran 里的函数, 函数名在声明的时候也应改成小写加下划线即可.对于数组来说, 具体变化和W indows 平台的处理方式是一致的, 都是行列优先顺序不同的. 而对于字符串来说, 则不需要额外的注意, gcc 编译器会处理好这个问题, 也就是说并不需要额外的改变.对于数据结构的定义, 也要改成小写加下划线的方式. 其中, Fortran 的数据结构定义方式如下. COMMON /COLOR7/C_RED , C_GREEN,C_BLUECOMMON /NDDAT/N I D (NASI ZE , XN (3, NASI ZE C 、C +的数据结构定义方
13、式如下.#ifdef_cplus p lusextern " C" #endif#definecol or7col or7_#definenddat nddat_extern struct fl oat c_red;fl oat c_green;fl oat c_blue;col or7;extern struct int nidNASIZE ;fl oat xnNASIZE 3;nddat;#ifdef_cplus p lus#endif3其他平台的混合编程对于Solaris 平台, 基本上和L inux 平台完全一致, 但是考虑到Solaris 大多运行在Sparc C
14、P U 上, 它是采用big endian 的, 而W indows 和L inux 运行在I ntel 或AMD 的X86平台上, 采用的是little endian, 这一点需要特别注意, 在读写数据文件时应该给予足够的重视. 其他的Unix 平台, 如HP Unix 、ULTR I X 、I R I S 等, 一般都只有define 上的微小差别, 在字符串处理、结构及数组方面基本与L inux 相同. 对它们 第4期魏威等:C 、C +、Fortran 混合编程研究97来说, 考虑更多的应该是中央处理器不同带来的差别.4混合编程中的字符串处理混合编程中经常会出现需要传递字符串的情况,
15、而字符串的传递是一个较为麻烦的问题. 在Fortran 里, 字符串是没有结束符的, 但是有长度的概念, 也就是说, 编译器会给每一个字符串一个长度以控制字符串的长度, 但是这个长度参数在不同的平台下其位置也是不同的(有的直接跟在字符串后面, 有的则跟在函数参数的最后面 , 对于常见的平台, 如W indows 、L inux 、Solaris 、HP Unix 、I R I S, 可以用如下方法定义. 以C 函数为例, 定义如下.void messag (char 3m sg1, int 3where1, char 3m sg2, int 3where2p rintf (“%s should
16、 be %d, while %s should be %d n ”, m sg1, 3where1, m sg2, where2 ; 如果要在Fortran 里调用的话, 需要以下定义.#ifdefined ULT R I X |SP ARC |I R I S |L I N UX |W I N 32#ifdefined ULT R I X |SP ARC |I R I S |L I N UXextern v oid _stdcallmessag (char 3, int 3, char 3, int 3, int, int #definemessag (s1, i1, s2, i2 messa
17、g_(s1, i1, s2, strlen ( , #else/3W I N 32Platf or m 3/extern v oid _stdcallmessag (char 3, int, int, #definemessag (s1, ( , i1, s2, strlen (s2 , i2#endif/3extern _stdcallmessag (char 3, int 3, char 3, int 3, int, int #definemessag (s1, i1, s2, i2 messag (s1, i1, s2, i2, strlen (s1 , strlen (s2 #endi
18、f如果要用在C +中, 需要如下定义.#ifdef_cplus p lusextern “C ”#endif/3your extern code 3/#ifdef_cplus p lus#endifFortran 里便可以直接调用如下.CALL MESS AG (char1, i1, char2, i2同样, 在Fortran 里写的字符串处理函数使用以上的define 和extern 后, 也可以在C 里直接调用. 5混合编程中的文件读写处理文件读写也是混合编程中一个非常重要的问题, 通常的问题发生于不同平台下的混合编程或者不同Fortran 编译器间的编译.在Fortran 中, 文件的写
19、入是由write 语句完成的, 而每一个write 语句可一次性写入多个数据构成一个数据块, 而每一个无格式数据块都由下面3部分组成:(1 数据块的开始标志, 记录所有数据所占的字节数; (2 组成该数据块的各数据内容. 整型数和浮点数均占4个字节, 低字节在前, 高字节在后. 各数据间不空格; (3 每个数据块的结束标志, 也为该数据块的字节数, 而不是以回车换行符作为结束标志. 各记录之间也没有分隔符.另外, 由于编程语言的差异, 不同的编译器的存储格式也存在差异, 如V isual Fortran 与D igital Fortran 在存储数据块中还存在着差别. 在一个write 语句中
20、, V isual Fortran 存储数据块的开始标志与结束标志是 98洛阳大学学报2007用一个字节表示, 而在D igital Fortran 是用一个整形数, 即4个字节来表示. 也就是说, V isual Fortran 一个数据块最多可以存储128个字节, 如果一个write 语句要求写入的数据量大于128字节时, 则按循环形式存入. 所以, D igital Fortran 在读取时就应该把它转化为相应的D igital Fortran 存储形式.6结束语混合编程的优势在于它允许调用用另一种语言编写的现有程序代码、使用在特定语言环境下难以实现的算法和获得处理速度方面的优势. 在混合编程中的关键问题是协调2种或多种语言间所的调用约定、命名约定及参数传递方式, 并使它们在数据结构、数据类型上保持一致.参考文献:1孙鑫, 余安萍. V isual C +深入详解M.北京:电子工业出版社, 2006.2埃克尔. C +编程思想M.北京:机械工业出版社, 2002.3任哲. MFC W indows 应用程序设计M.北京:清华大学出版社, 2004.4周振红. Fortran
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 尾矿库废水治理EPC项目可行性分析报告
- 推动产教融合新模式的实践路径与策略
- 湿地生态保护修复方案初步设计
- 个人游戏交易合同样本
- 公司外包人员合同样本
- 信息公司合同样本
- 儿女女养老合同样本
- 义齿注册检验合同样本
- 全案定制采购合同样本
- 精准把握2024年银行春招试题及答案
- 外贸业务员面试试卷
- 老年病老年综合征及老年综合评估培训课件
- DB14T 1925-2019 流通领域供应链标准体系
- GB∕T 23293-2021 氮化物结合耐火制品及其配套耐火泥浆
- 东北财经大学《服务礼仪X》综合作业答卷
- 四川大学-刘龙飞-毕业答辩PPT模板
- 现浇箱梁支架施工方案(共87页结构图多附现场照片)
- 自学考试——军人心理咨询与治疗
- 5关于进一步规范建设工程质量检测服务收费的通知湘价服2009186号
- 致橡树朗诵ppt(1) 2
- 交通安全设施摆放图
评论
0/150
提交评论