Fortran与VisualC_混合编程研究

周振红 , 颜国红 , 吴虹娟
1 2 1
( 1.武汉大学水利水电 学院 , 湖北 武汉 430072 ; 2.长江 水利委员会计划局 , 湖北 武汉 430010)
对 32 位 Fortran 与 Visual C ++ 的混合编程进行了较为系统的 探索和 研究 . 指出关 键问题 是如何 使两种 摘要 : 语言在标识符命名约定 、参数传递方式和参数数 据类型上保持一致 , 并对此给出了具体的实施方法 . 混合编程 ; 动态链接库 ; 面向对象程序 设计 关键词 : TP 311 . 5 文献标识码 : A 中图分类号 :
1 标识符命名约定
标识符指全局变量名和过程名 , 它代表了特定 的地址 . 命名约定指在源程序编译生成目标程序的 过程中 , 源程 序 中的 标 识符 将 会发 生怎 样 的改 变 . Fortran 与 Visual C/C ++ 在不同的调用约定 下生成目标程序的标识符列于表 1 . 其中 : name 是 源程序中的标识符 ; n 是过程参数在堆栈中占据的
-name @n 保留原有大小写 ? name @@ 保留原有大小写 _decoration
Fortran 中过 程分 为子 程序 和函 数 , 而 Visual C ++ 中的过程只有函数 , Fortran 中的子程序相当 于 Visual C ++ 中返回数据类型为 void 的函数 . 现 以 Visual C ++ 调用 Fortran 函数为例 , 说明如何统 一两种语言的标识符命名约定 . Fortran( DIGITAL Visual Fortran) : REAL( 4)FUNCTION Fmax( a , b) ! DEC $ ATTRIBUTES DLLEXPORT : : Fmax ! DEC $ ATTRIBUTES VALUE : : a ,b
在科 学 、工 程计算 领域 中 , 大 量的源 程序由 Fortran 语言编写 . Fortran 语言的自然表达方式 、 结 [ 1] 构化编程特点以及强大的数值计算功能 , 使其在 众多语言林立的今天 仍保持强劲的势头 . 90 年代 初出 现 的 面 向 对 象 程 序 设 计 语 言 ( 如 Visual C ++ ) , 不仅使程序设计方法发生改变 , 而且使应 用程序 的结构 和功 能产 生了重 大变 化 . 用 Visual C ++ 编程[ 2 , 3] , 可以产生友好的图形界面 , 并能与 程序进行交 互 , 可以利 用 Windows 应用编 程接口 API[ 4] ( 或 OpenGL 图形库) 绘制图形 , 借助于开放性 数据库互连 ODBC 来进行数据库存取操作等 . 上述 两种语言的结合 —混合 编程 , 可 给 Fortran 计算程 序增添强大的综合功能 . 本文研究 32 位 Fortran 与 Visual C ++ 的混合 编程问题 , 重点解决当 Visual C ++ 调用 Fortran 过 程( 子程序和函数的统称) 时 , 两种语言在不同约定 下目标文件中的标识符和参数传递方式的一致性 , 以及两种语言间参数数据类型的统一问题 .
总的字节数 , 以十进制表示 ; decoration 为 C ++ 编 译程序对标识符所做的修饰 , 其形式视具体情况而 定 , 通过使用 extern ”C” 对标识符进行说明 , 可以去 掉 Visual C ++ 对标识符所做的修饰 , 也唯有如此 , 才可能实现 Visual C ++ 对 Fortran 过程的调用 .
表 1 不同 调用约定下目标文件中的标识符 语言 Fortran Fortran Fortran C C Visual C ++ 调用约定 编译后标识符 缺省 C STDCALL -name @n -name -name @n 大小写 全部大写 全部小定 全部小写 保留原有大小写
- -cdecl( 缺省) -name - -stdcall 缺省
A( 1 , 1) A( 2 , 1) A( 1 , 2) A( 2 , 2) A( 1 , 3) A( 2 , 3)
件将动态链接库和调用程序链接在一起 . DLL 库文 件存有库函数的可执行代码 . 调用时 , 这两个库文 件都不可缺少 . 因此 , 需要将它们放于 Visual C ++ 应用程序路径或其搜索路径中 . 进行 Visual C + + 应 用 程 序 开 发 , 离 不 开 MFC , 其类的声明是在 <afx . h >头文件中进行的 , 所以该文件需直 接或间接地包 含在实现文件中 . MFC 支持的是多线程开发 , 所以要确认在 Project , Settings 对 话 框的 C/C + + 选 项卡 上 的 Category ( Code Generation) 中 , Use run _time library 项选择 的 是 Multithreaded . 另外 , 需将 LIB 文件加 到 Project , Settings 对话框的 Link 选项卡 ( Category : General) 中 的 Object/ library modules 编辑框中 . 上述准备工作执行完毕 , 就可在 Visual C ++ 中的实现文件中进行调用过程( 库函数) 的声明 , 并 确保与 Fortran 在标识符命名约定 、参数传递方式 以及参数数据类型方 面保持一致 , 然后 , 在 Visual C ++ 中的实现文件中就可直接使用动态链接库 中的库函数 .
Fortran INTEGER( 2) INTEGER( 4) REAL( 4) REAL( 8) Visual C ++ short int , long float double
2 参数传递方式
混合语言编程中 , 不同语言间相互交换和访问 数据的方法 之一是 参数传 递 . 在 Fortran 和 Visual C ++ 过程之间可以用参数传递的方法交换数据 . 参数的传递有值传递和引用传递两种方式 , 前者将 参数值压入堆栈 , 后者将参数地址压入堆栈 . 在混 合语言编程中必须保证参数传递方式的一致性 . 如果不对参数传递的方式进行特别声明 , 参数 将按照缺省方式传递 . 以一般的整型 、实型参数为 例 , Fortran 缺省参数传递方式是引用传递 , 在引用 方式下 , 所传递的是参数的地址 , 如果在被调用过 程中对参数进行了修改 , 这一修改将带回到引用过
程. Visual C ++ 缺省参数传递方式是值传递 , 在 传值方式下 , 所传递的是参数的当前值 , 被调用过 程对参数的修改不会对调用过程的参数值产生影 响. Fortran 中的 C 和 STDCALL 调用约定 , 不仅影 响目标程序的标识符 , 而且也影响过程参数的传递 方式 . 在 Fortran 过程中 , 通过声明 C 和 STDCALL 调 用约定 , 可以将参数的缺省引用传递方式改为值传 递. 对于具体的某个参数又可以用 REFERENCE 和 VALUE 属性规定其传递方式分别为引用传递和值 传递 , 且 REFERENCE 和 VALUE 属 性 覆 盖 C 和 STDCALL 调用约定对参数 传递方式的 规定 . 仍以 前面的 Fortran 函数 Fmax ( a , b) 为例 : ! DEC $ ATTRIBUTES C : : Fmax ! DEC $ ATTRIBUTES REFERENCE : : b 上面第一行规定了函数 Fmax 中的两个参数为 值传递方式 , 第二行又将其中的一个参数 b 规定为 引用传递方式 . Visual C ++ 中对应的声明为 extern ” C”{ float -cdecl fmax( float a , float & b) ; } , 其中 , & b 标示参数 b 为引用传递 . 需要注意的是 , 在进行函 数调用时 , 第二个参数须是一 float 型的变量 , Visual C ++ 对 Fortran 过程实现调用的过 程中 , 如果两种语言的过程标识符不一致 , 会产生 链接错误 ; 如果过程参数的传递方式不一致 , 会导 致非法操作 ; 如果过程参数的数据类型不一致 , 会 出现不正确的调用结果 . 所以在两种语言的混合编 程中 , 除了要注意标识符命名约定和参数传递方式 外 , 还要注 意两种语言间数据类型的一致 性 . Fortran 和 Visual C ++ 的数据类型不完全一一对应 , 但就计算常用到的整型和实型而言 , 它们有着精确 的对应关系 . 现将两种语言整型 、 实型的对应关系 列于表 2 . 表 2 数据类型的对应关系
在数值计算的编程中 , 经常要借助于数组对同
86
武汉大学学报( 工学版)
2001
类型的有序数据进行处理 . 在 Visual C ++ 调用含 有数组参数的 Fortran 过程时 , 须注意它们在数组 的声明形式 、存储 顺序和下标起始 值规定上的差 异. 比如要声明一两行三列的二维数组 , 在 Fortran 中声明为 A( 2 , 3) , 下标从 1 开始 , 在内存中的存储 顺序为 :
收稿日期 : 2000 -04 -20
[ 5]
作者简介 : 周振红( 1963 -), 男 , 山 东蓬莱人 , 博士 , 从事河流水沙数值模拟及科学计算可视化方面的研究 .
第 2 期
周振红等 : Fortran 与 Visual C ++ 混合编程研究
85
REAL( 4) : : a,b END FUNCTION Visual C ++: extern ” C ” { float - -stdcall Fmax ( float a , float b) ; } 上述 Fortran 程序中的 ! DEC $ ATTRIBUTES DLLEXPORT : : Fmax 为动 态链 接库 函数 的导 出声 明 , ! DEC $ ATTRIBUTES VALUE : : a , b 将 参数 a 和 b 的传递方式规定为值传递( 缺省情况下 , Fortran 为引用传递 , Visual C ++ 为值传递) , 其 Fortran 动态链接库中的标识符为 -FMAX @8 , 恰好与 Visual C ++ 去掉修饰后的 — stdcall 约定保持一致 . 在上述 Fortran 程序中 , 若将属性规定改为 : ! DEC $ ATTRIBUTES C : : Fmax 或 ! DEC $ ATTRIBUTES STDCALL : : Fmax 目标程序的标识符分别为 -fmax 和 -fmax @ 8 , Visual C ++ 中对应的声明形式为 : extern ” C” { float - -cdecl fmax ( float a , float b) ; }或 extern ” C” { float - -stdcall fmax( float a , float b) ; } 如果在 Fortran 源程序中 使用 ALIAS 属性 , 可 强制目标程序中的标识保持原样 , 即保留原有的大 小写 . 如 在 Fortran 程 序 中 采 用 ! DEC $ ATTRIBUTES C , ALIAS : ' -Fmax ' : : Fmax 形式进行声 明 , 目标程序标识符由 ALIAS 属性规定为 Fmax , 忽略 C 将 标 识 符 全 部 转 为 小 写 的 约 定 , Visual C ++ 中对应的声明形式为 extern ”C” { float - cdecl Fmax( float a , float b) ; } .
合集下载

VC++与Fortran的混合编程

VC++与Fortran的混合编程

VC++调用Fortran子程序VC++友好的界面制作和Visual Fortran强大的计算和数据处理功能,两者结合可开发行程界面友好、操作直观方便、功能强大的应用程序。

如何进行VC++调用VisualFortran子程序模块,就成了需要解决的问题。

1、VC++调用FORTRAN子程序的方式(1)同一工程包含VC++和Fortran语言文件对同一版本集成后的编译器可以根据不同的扩展名选择编译方式,生成目标代码文件.OBJ,然后按照指定的调用方式进行链接,生成可执行文件.EXE。

(2)VC++工程文件引用Fortran语言生成的.OBJ或.LIB文件对不同版本的编译器安装集成后,VS不会自动根据文件扩展名选择编译方式,这时需用不同的工程文件。

首先对Visual Fortran 建一工程文件,生成.OBJ文件或.LIB文件,然后在VC++工程中按照指定的调用方式进行调用,编译链接,生成可执行文件.EXE。

(3)VC++工程文件调用Fortran语言生成的.DLL将已有的Fortran程序生成dll模块,有利于移植和修改,可提高效率,这样即使原dll模块中的算法做过修改,只要保证函数或子例行程序名字和入口参数不变,主调用过程无须进行重新修改或者编译。

2、VC++中的声明在C++语言中调用Fortran的函数或模块,必须在C++语言的函数名前面冠以_s td call或_cdecl关键字申明调用方式,以便编译器按照约定方式进行正确的参数传递,包括参数传递顺序、参数传递方式、堆栈处理和命名修饰等问题。

C++语言调用Fortran模块的声明:extern “C” {void _stdcall SUBROUTINE(形式参数1,float TC[],float PC,……);float _stdcall FUNCTION(形式参数1,float TC[],float PC,……); } 或extern “C” {void _cdecl SUBROUTINE(形式参数1,float TC[],float *PC,……);float _cdecl FUNCTION(形式参数1,float TC[],float *PC,……); } 其中TC为数组变量。

C与C++与FORTRAN混合编程

C与C++与FORTRAN混合编程

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 __cplusplusextern “C” void {#endifextern void __stdcall CFunction();#define cFunction CFUNCTION#ifdef __cplusplus}#endif这样,在Fortran或者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 cPlusplusFunction();和c函数一样,进行下面的定义即可:#ifdef __cplusplusextern “C” void {#endifextern void __stdcall cPlusplusFunction ();#define cPlusplusFunction CPLUSPLUSFUNCTION#ifdef __cplusplus}经过上面的定义后,所有的函数便可以在三种语言中自由调用。

VC++与Fortran混合编程实现方法

VC++与Fortran混合编程实现方法
!&& % 年 % 月
电
脑
学
习
第 ! 期
)*++ 与 08?.?-> 混合编程实现方法
/01!
5 6
234!
针对 )*++具有面向对象特征和开发图形界面方面的强大功能以及 08?.?-> 语言在数值计算方面的优势, 介绍了 )*
++和 08?.?-> 混合编程的实现方法。 789 )*++ 08?.?->
qrstQu!"56,d.vfgNOC ;wxN OA-W <=J443? oy:lzn > HNT:!"B-{"| 56:QuCXY3qLr:}~CM]^_‘:!" qstQu56< :AC w 4 )*++e4|h7C,dMQXY ~2 3eDNO!"56 (-.-/(-. : *++fgI
万方数据
0D9A9RS :st!"56<AC d M4|heCL ¡.¢c£w¤¥¦ ! " # $ # §¨© / !&&&/ ! ²³´ / fgµ¶h 0D9A9RSUU/ ­®I@·¬¸¥ °±C#TVW/ $ ¹º» / ¼½¾¥ X0*/ ¿­IÀÁÂÃÄÅÆÇÈÉ 8ÊËÌC#TTU/ 48?.?->T& ª«¬f / ­®I ­®¯ª¥°±C
A"BC%4&
)*++
08?.?->
X1’3([2->HJ-H3 \?8H?-771>H ðñÐ-:ò56íî^@°ëCÓ 08?.?-> :ò56óâ zôC¤õö÷øùúûCüvC4 )*++Y/& wý.vÒ ÍÓ 08?.?-> :ÔÖ #/! רþÿáßò BGG :ÔÖ þÿáßò BGG Ütר C1>(8ZM :fg !" C¢ w#dM$% däYÚÏC ý8!"C & tÆÙ ¡. BGG :þÿáß ’wSòÚÏ () C £4fg7*+ *!:½+,ùß + C4fgäYR- SÚÏ . ½E/ C

C_C_Fortran混合编程研究

C_C_Fortran混合编程研究

C 、C ++、Fortran 混合编程研究魏 威,魏 冲(郑州铁路职业技术学院,河南郑州450052)摘 要:不同计算机编程语言都有其特有的优势和局限性,将多种语言混合起来进行编程,不但可以充分发挥各自的优势,而且可以弥补各自功能的不足,这样既能充分利用现有程序资源,又能加快应用程序的开发.主要阐述了C 、C ++、Fortran 等3种语言在不同平台下混合编程应注意的问题,以及在混合编程中经常遇到的2个问题.关键词:混合编程;C;C ++;Fortran中图分类号:TP311 文献标识码:A 文章编号:1007-113X (2007)04-0094-05Fortran 语言是所有编程语言中惟一能将复数定义为一种标准数据类型的语言,其优势在于数值计算,但是Fortran 语言在可视化程序设计方面却是非常欠缺的,目前还没有一家厂商推出具有RAD 特性的Fortran 编译集成开发环境.当用Fortran 实现了某一大型科学计算以后,却难以将这种计算转变为数据输入简易、结果显示方便的W indows 可视化应用程序,而采用C 、C ++进行编程却比较容易实现这些功能.因此,在许多情况下,我们应该使用C 、C ++、Fortran 等进行混合编程.在混合语言编程中,主要的问题是函数调用和数据结构的存储.1 W indows 平台的混合编程Fortran 语言没有大小写之分,而W indows 平台下的混合语言编程过程中大小写问题十分突出.考虑到编译器的差异,可以用以下方式进行跨平台编程的函数声明.C 、C ++编译器使用M icr os oft V isual C ++6.0编译集成开发环境,Fortran 编译器使用D igital V isual Fortran 6.0编译集成开发环境.假设一个C 语言函数为void cFuncti on (),那么只需要在它的头文件里面进行如下定义即可. #ifdef _cp lus p lus extern “C ”v oid { #endif extern v oid _stdcall CFuncti on (); #define cFuncti on CF UNCTI O N #ifdef _cp lus p lus } #endif这样就可实现上述函数在Fortran 或C ++程序中的直接调用.假设一个Fortran 函数为S UBROUTI N E FF UNCTI O N (),那么在C ++头文件里可进行如下定义. #ifdef _cp lus p lus extern “C ”v oid { #endif extern v oid _stdcall ffuncti on (); #define ffuncti on FF UNCTI O N #ifdef _cp lus p lus第22卷第4期2007年12月 洛阳大学学报JOURNAL OF LUOY ANG UN I V ERSI TY Vol .22No .4Dec .20073收稿日期:2007-11-01作者简介:魏 威(1960-),女,汉族,河南省郑州市人,工程师,研究方向:计算机技术. } #endif这样,就可以在C ++的程序里面直接调用上述函数.由于C 编译器里面没有定义cp lus p lus 这个环境变量,因此在C 文件里面也可以直接使用这个头文件.如果是一个C ++函数void cPlus p lusFuncti on (),和C 函数一样可定义如下. #ifdef _cp lus p lus extern “C ”v oid { #endif extern v oid _stdcall cPlus p lusFuncti on (); #define cPlus p lusFuncti on CP LUSP LUSF UNCTI O N #ifdef _cp lus p lus } #endif经过上面的定义后,所有的函数便可实现在3种语言间自由调用.在用3三种语言进行混合编程过程中要注意函数的参数、字符串的传递问题.对含有字符串的函数,如函数v oid cCharFuncti on (char 3m sg ),需要定义如下. void cCharFuncti on (char 3m sg,int len )经过上面的定义之后,在Fortran 中只需调用cCharFuncti on (m sg )即可.由于Fortran 程序没有明显的字符串结束标志,如果是2个字符串连在一起,C 程序里就只能得到1个字符串.所以,最好在C 的程序里对这个由Fortran 程序得到的字符串进行处理,因为从len 变量可以得到字符串长度,截取m sg 的前len 个字符作为这个字符串的应有长度.而在Fortran 程序里面,如函数S UBROUTI N E FCHARF UNCTI O N (fchar ),经过相应声明,进行下面的定义即可. #define f CharFuncti on (fchar ),FCHARF UNCTI O N (fchar,strlen (fchar ))这样,在C 、C ++程序里即可直接调用.在3种语言的混合编程里还有一个需要注意的问题就是指针问题.Fortran 里面所有的变量都相当于C 、C ++里面的指针,所以,在C 、C ++程序里函数的参数应一律声明为指针形式(除字符串参数后面的长度外).在混合编程过程中,数据方面存在的差异也必须引起足够的重视,这体现在数组和结构2个方面.在Fortran 语言里,数组和C 、C ++里的数组有些不同,这表现在行列顺序和数组起始值.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行优先顺序推广到多维数组,规定为先排最右的下标;列优先顺序推广到多维数组,规定为先排最左的下标.这样,在混合语言编程里调用数据时必须注意行列优先的差别,进行准确地调用.数组的另一个差别是起始下标的不同.Fortran 默认的数组下标是以1开始的,而C 、C ++默认的数组下标却是从0开始的,所以在调用时要注意加1或者减1,以保证调用到正确的数据.Fortran 语言里的结构经过声明后就被分配了空间,在C 、C ++里面也要声明它,采用下面的方式.Fortran 结构声明格式如下. COMMON /COLOR7/C_RE D ,C_GREEN,C_BLUE COMMON /NDDAT/N I D (NASI ZE ),XN (3,NASI ZE )C 、C ++结构声明格式如下. #ifdef _cp lus p lus extern "C"{・59・第4期 魏 威等:C 、C ++、Fortran 混合编程研究 #endif #define col or7COLOR7 #define nddat NDDAT extern struct {fl oat c_red;fl oat c_green;fl oat c_blue;}col or7; extern struct {int nid[NASI ZE ];fl oat xn[NASI ZE ][3];}nddat; #ifdef _cp lus p lus } #endif2 L inux 平台的混合编程L inux 平台的混合语言编程和W indows 平台的混合语言编程基本没有什么区别,主要是在define 上的不同.考虑到编译器的差异,在函数声明上可以用下面的方式进行跨平台编程的函数声明.C 、C ++编译器使用G NU gcc,Fortran 编译器使用pgi Fortran .假设一个C 函数为void cFuncti on (),那么只需要在它的头文件里面进行如下定义即可. #ifdef _cp lus p lus extern “C ”v oid { #endif extern v oid CFuncti on (); #define cFuncti on cfuncti on_ #ifdef _cp lus p lus } #endif这样,在Fortran 或者C ++的程序里面就可以直接进行调用了.需要注意的是,函数名应该不多于31个字符.同样,对于C ++和Fortran 里的函数,函数名在声明的时候也应改成小写加下划线即可.对于数组来说,具体变化和W indows 平台的处理方式是一致的,都是行列优先顺序不同的.而对于字符串来说,则不需要额外的注意,gcc 编译器会处理好这个问题,也就是说并不需要额外的改变.对于数据结构的定义,也要改成小写加下划线的方式.其中,Fortran 的数据结构定义方式如下. COMMON /COLOR7/C_RE D ,C_GREEN,C_BLUE COMMON /NDDAT/N I D (NASI ZE ),XN (3,NASI ZE )C 、C ++的数据结构定义方式如下. #ifdef _cp lus p lus extern "C"{ #endif #define col or7col or7_ #define nddat nddat_ extern struct {fl oat c_red;fl oat c_green;fl oat c_blue;}col or7; extern struct {int nid[NASI ZE ];fl oat xn[NASI ZE ][3];}nddat; #ifdef _cp lus p lus } #endif3 其他平台的混合编程对于Solaris 平台,基本上和L inux 平台完全一致,但是考虑到Solaris 大多运行在Sparc CP 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 相同.对它们・69・洛阳大学学报 2007来说,考虑更多的应该是中央处理器不同带来的差别.4 混合编程中的字符串处理混合编程中经常会出现需要传递字符串的情况,而字符串的传递是一个较为麻烦的问题.在Fortran 里,字符串是没有结束符的,但是有长度的概念,也就是说,编译器会给每一个字符串一个长度以控制字符串的长度,但是这个长度参数在不同的平台下其位置也是不同的(有的直接跟在字符串后面,有的则跟在函数参数的最后面),对于常见的平台,如W indows 、L inux 、Solaris 、HP Unix 、I R I S,可以用如下方法定义.以C 函数为例,定义如下. void messag (char 3m sg1,int 3where1,char 3m sg2,int 3where2) { p rintf (“……%s should be %d,while %s should be %d \n ”,m sg1,3where1,m sg2,where2); }如果要在Fortran 里调用的话,需要以下定义. #if defined ULT R I X ||SP ARC ||I R I S ||L I N UX ||W I N 32 #if defined ULT R I X ||SP ARC ||I R I S ||L I N UX extern v oid _stdcall messag (char 3,int 3,char 3,int 3,int,int ) #define messag (s1,i1,s2,i2)messag_(s1,i1,s2,i2,strlen (s1),strlen (s2)) #else /3W I N 32Platf or m 3/ extern v oid _stdcall messag (char 3,int,int 3,char 3,int,int 3) #define messag (s1,i1,s2,i2)MESS AGE (s1,strlen (s1),i1,s2,strlen (s2),i2) #endif #else /3O ther Platf or m 3/ extern v oid _stdcall messag (char 3,int 3,char 3,int 3,int,int ) #define messag (s1,i1,s2,i2)messag (s1,i1,s2,i2,strlen (s1),strlen (s2)) #endif如果要用在C ++中,需要如下定义. #ifdef _cp lus p lus extern “C ”{ #endif /3your extern code 3/ #ifdef _cp lus p lus } #endifFortran 里便可以直接调用如下. CALL MESS AG (char1,i1,char2,i2)同样,在Fortran 里写的字符串处理函数使用以上的define 和extern 后,也可以在C 里直接调用.5 混合编程中的文件读写处理文件读写也是混合编程中一个非常重要的问题,通常的问题发生于不同平台下的混合编程或者不同Fortran 编译器间的编译.在Fortran 中,文件的写入是由write 语句完成的,而每一个write 语句可一次性写入多个数据构成一个数据块,而每一个无格式数据块都由下面3部分组成:(1)数据块的开始标志,记录所有数据所占的字节数;(2)组成该数据块的各数据内容.整型数和浮点数均占4个字节,低字节在前,高字节在后.各数据间不空格;(3)每个数据块的结束标志,也为该数据块的字节数,而不是以回车换行符作为结束标志.各记录之间也没有分隔符.另外,由于编程语言的差异,不同的编译器的存储格式也存在差异,如V isual Fortran 与D igital Fortran 在存储数据块中还存在着差别.在一个write 语句中,V isual Fortran 存储数据块的开始标志与结束标志是・79・第4期 魏 威等:C 、C ++、Fortran 混合编程研究 用一个字节表示,而在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 90/95高级程序设计[M ].郑州:黄河水利出版社,2006.[5]周振红.I ntel V isual Fortran 应用程序开发[M ].郑州:黄河水利出版社,2006.[6]浩强工作组.Fortran 经典程序设计[M ].大连:大连理工大学出版社,2004.[7]霍 顿.V isual C ++2005入门经典[M ].北京:清华大学出版社,2007.[8]Stanley B,L i ppman .Essential C ++[M ].武汉:华中科技大学出版社,2001.Study on M i xed 2l anguage Co m p ili n g Usi n g C,C ++and FortranW E IW ei,W E I Chong(Zhengzhou Rail w ay Vocati onal and Technical College,Zhengzhou 450052,China )ABSTRACT:There are different peculiar advantage and li m itati on in each kind of p r ogra mm ing language .The m ixing p r ogra mm ing can make the best of merits of different languages and avoid the deficiencies of the m.This paper mainly discuss the questi on of m ixing p r ogra mm ing using the C,C ++and Fortran .KEY WORDS:m ixing p r ogra mm ing;C;C ++;Fortran(责任编辑:王 晓)・89・洛阳大学学报 2007。

C、C++、Fortran混合编程研究

C、C++、Fortran混合编程研究

功能.因此, 在许多情况下, 我们应该使用 c c++、 o r 等进行 混合编程.在混合语言编程中, 、 Fra tn 主 要 的问题是 函数调用 和数 据结构 的存储 .
1 Wi o s 台的混 合编 程 n w 平 d
Fra 语言没有大小写之分, Wi o s 台下的混合语 言编程过程中大小写问题十分突出.考 otn r 而 n w平 d 虑到 编译 器 的差异 , 以用 以下方 式进行 跨平 台编程 的 函数声 明.c、c++编 译器 使用 Mi sfVsa 可 c ot i l o r u
言在 不 同平 台下混舍 编程应 注 意的 问题 ,以及 在 混合 编程 中经 常遇 到 的 2个 问题 .
关键 词 :混舍 编程 ;C; C++; ot n Fra r
中图分类 号 : P 1 文献标识码 : T31 A 文章编号 :10 0 7—13 2 0 ) 4— 0 4— 5 1X( 0 7 0 0 9 0
维普资讯
第2 2卷第 4期
2 007年 1 2月
洛 阳大学学报
J UR O NAL 0F L YANG U V U0 NI ERSTY l
Vo. 2 No 4 12 . Dc e. 2 07 0r
C 、C+ +、F ra ot n混合 编程研 究 r
数 , 函数 vi c h ru c o ( h r, s ) 需要定 义如 下 . 如 o C aF n t n c a l g , d i : m
_
}
# n f ed
这 样就 可实现 上述 函数 在 Fra otn或 c+ +程序 中的直接 调用 . r 假设 一个 Fra otn函数 为 S B O TN F N TO ) 那 么在 c++头文件 里可进 行如 下定义 . r U R U IEF U C N( , I

Linux环境中Fortran与C混合编程方法研究

Linux环境中Fortran与C混合编程方法研究

第 29 卷 第 9 期 计算机工程与设计Computer Engi neering and Design2008 年 5 月 May 2008Vol . 2 9No . 9Linux 环境中 Fortran 与 C 混合编程方法研究亓雪冬 1, 仝兆岐 1, 何潮观 2(1. 中国石油大学 地球资源与信息学院,山东 东营 257062;2. 胜利油田物探研究院,山东 东营 257022)摘 要:在 Linux 系统中存在大量优秀的 Fortran 和 C 的源代码和程序库,为有效的利用这些软件资源,发挥不同语言各自的优势,探讨了 4 种混合编程方法— — 基于外部数据混编、基于 CORBA 混编、基于 f2c 混编、基于 cfortran 混编,并论述了各方法 的基本原理、实现步骤,比较了各方法的优缺点和适用范围。

关键词:混合编程; 编程语言; 源码转换工具; 组件; 通用对象请求代理 中图法分类号:TP311.52文献标识码:A文章编号:1000-7024 (2008) 09-2378-03Study on mixed Fortran and C programming in LinuxQI Xue-dong 1, TONG Zhao-qi 1, HE Chao-guan 2(1. College of Geo-resources and Information, China University of Petroleum, Dongying 257062, China;2. Geophysical Prospecting Research Institute of Shengli Oilfield, Dongying 257022, China ) Abstract :There are many good Fortran, C source code and libraries in Linux. In order to reuse these software resources an d make use of the two languages together effectively, four methods of mixed Fortran and C language programming in Linux system are discussedwhich are external data, CORBA, f2c and cfortran. Then the principle, the processes, the merit and flaw of these methods are analy sed and contrasted.Key words :mixed-pro grammin g; programming lan guage; source code converter; component; CORBA的 Fortran PowerStation 和 VB, VC, Delphi, C++ Builder 之间的混合编程研究。

VC和FORTRAN混合编程及其在微机电系统中的应用

(1)选择右视面作为绘制草图的平面;(2)根据蜗壳圆弧面截面几何尺寸,绘制可容纳其截面圆形;(3)利用拉伸凸台/基体命令,根据蜗壳的厚度把草图拉伸;(4)选择前视面作为绘制草图的平面;(5)根据蜗壳出料截面的几何尺寸,绘制草图;(6)利用旋转凸台/基体命令,把草图旋转360°生成出料口。

3.2.2外壳造型设计外壳造型由外端面扫描切除生成,主要步骤如下:(1)选择前视面作为绘制草图的平面。

(2)根据蜗壳木模轮廓的几何尺寸,绘制扫描引导线。

(3)选择右视面作为绘制草图的平面。

(4)根据蜗壳截面的几何尺寸,绘制外端面。

(5)利用切除-扫描命令,生成外壳。

3.2.3内腔造型设计(1)Ⅰ-Ⅶ端面内腔造型由内端面扫描切除生成,主要步骤:①选择前视面作为绘制草图的平面;②根据蜗壳木模轮廓的几何尺寸,绘制扫描引导线;③选择右视面作为绘制草图的平面;④根据蜗壳木模截面的几何尺寸,绘制内端面;⑤利用切除-扫描命令,生成Ⅰ-Ⅶ端面内腔。

(2)Ⅶ-Ⅹ端面内腔造型由内端面放样切除生成主要步骤:①选择前视面作为绘制草图的平面;②根据蜗壳木模轮廓的几何尺寸,绘制扫描引导线;③选择Ⅶ端面作为绘制草图的平面;④根据蜗壳木模Ⅶ端面截面的几何尺寸,绘制内端面;⑤选择上视面作为绘制草图的平面;⑥根据蜗壳木模Ⅷ端面截面的几何尺寸,绘制内端面;⑦利用切除-放样命令,生成Ⅶ-Ⅷ端面内腔;⑧同理,利用切除-放样命令可生成Ⅷ-Ⅹ端面内腔。

其模型,如图4所示。

图4内腔模型4结语Solidworks软件为渣浆泵的三维建模带来了极大的方便,同时,可以把所建立的实体转化为iges等格式,可直接用于有限元强度分析,为进一步展开对渣浆泵的研究工作提供了可靠保证。

参考文献1关醒凡.现代泵技术手册[M].北京:宇航出版社,19952刘长征译.精通Solidworks2003[M].北京:清华大学出版社,2004VC和FORTRAN混合编程及其在微机电系统中的应用蔡占军翁海珊俞必强(北京科技大学机械工程学院,北京100083)VCandFORTRANmixedlanguageprogrammingandItsapplicationtoMEMSCAIZhan-jun,WENGHai-shan,YUBi-qiang(MechanicalEngineeringSchool,UniversityofScienceandTechnologyBeijing,Beijing100083,China)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! "!!!!!!!!!!!!!!!"! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! "! ! ! ! ! ! ! ! ! ! ! ! ! ! ! "【摘要】对VC和FORTRAN混合编程中的函数传递问题,进行了深入的研究,研究出了一种从VC程序到FORTRAN程序的函数传递技术。

Fortran与Visual Basic的混合编程

Fortran与Visual Basic的混合编程
王永杰;苗丽
【期刊名称】《河南科学》
【年(卷),期】2004(22)1
【摘要】利用Fortran强大的数值计算能力和Visual Basic极好的界面开发功能,通过动态链接库及两种语言之间调用约定的协调,包括标识符命名、参数传递方式等,成功地实现了Fortran与Visual Basic的混合编程.
【总页数】4页(P124-127)
【作者】王永杰;苗丽
【作者单位】郑州大学环境与水利学院,河南,郑州,450002;郑州大学环境与水利学院,河南,郑州,450002
【正文语种】中文
【中图分类】TP311.11
【相关文献】
1.Fortran与Visual Basic的混合编程 [J], 谢敏;陈伟;陈守伦
2.Fortran与Visual C++混合编程 [J], 陈伟;谢敏
3.Visual Fortran与Visual Basic混合编程 [J], 封基良;林炳星
4.Visual C++与Compaq Visual Fortran混合编程研究 [J], 马清华;王明海
paq Visual Fortran与Matlab混合编程实现小波域地震信号多尺度分析[J], 徐天吉;程冰洁
因版权原因,仅展示原文概要,查看原文内容请购买。

VC与Fortran混合语言编程

VC 与Fortran 混合语言编程 肖晓玲,卢正鼎 (华中理工大学计算机科学与技术学院,湖北武汉430074) 张 翔 (江汉石油学院地球物理勘探系,湖北荆州434102)[摘要]V C 与Fortran 混合语言编程时,按调用方式与实现的不同,调用约定主要采用C 与STDCALL 属性的调用约定。

命名约定一般使符号名表现为纯大写的名称、纯小写的名称或混合书写形式名称。

不同语言之间参数数据的传递主要通过:①调用变量参数列表;②数据、过程模块结构;③将变量声明为公用、外部和全局类型这3种方式来实现。

采用V C 与Fortran 混合语言编程设计了大地电磁测深一维交互式解释系统。

[关键词]程序设计方法;Fortran ;V C 混合语言[中图分类号]T P 311111[文献标识码]A [文章编号]10009752(2000)02007104混合语言编程是采用2种或2种以上的编程语言组合编程,彼此相互调用,进行参数传递,共享数据结构及数据信息,从而形成一种程序实体的过程,也称为程序接口。

在软件编制和开发工作中,如果开发的软件规模较小,具有较简单的科学计算或数据处理,那么,只选择一种高级语言或者数据库语言来编程是可行的;然而,对于要开发功能很强、规模很大的大型应用软件,并且软件中既具有大量数据处理,又具有大量科学计算,甚至具有较强的实时功能的系统来说,采用单一的高级语言很难完成预期的计划和功能,而且在编程中也遇到很大的麻烦。

因为各种语言都有其长处,也有其局限性,一种语言鞭长莫及之处,正是另一种语言的驾轻就熟之区。

集各语言之精华,扬长避短,就可以大大提高系统的效率、功能和灵活性。

Fortran 语言是流行较广的适用于科学计算的高级语言,其标准化程度高,便于程序交换,较易优化,拥有高精度的数据结构与运算结构。

而V isual C ++与硬件底层打交道具有强大优势,便于图形系统的开发,已成为W indow s 系统平台上最强大的应用程序开发系统之一。

FORTRAN和VISUAL C++的混合编程

FORTRAN和VISUAL C++的混合编程
陈中
【期刊名称】《程序员》
【年(卷),期】2001(000)004
【摘要】简述了FORTRAN语言和VV语言混合编程的重要性。

对混合编程中涉及到的调用约定,命名约定,数据交换和访问,数据共享,数组处理、用户自定义类型处理等方面。

结合编程应用,分别加以阐述和讨论。

最后给出了一个简单的混合编程的例子。

【总页数】3页(P76-78)
【作者】陈中
【作者单位】无
【正文语种】中文
【中图分类】TP311
【相关文献】
1.Visual C++与Fortran混合编程及Matcom绘图在空调负荷计算软件中的应用[J], 顾小松;王汉青
2.Visual Prolog与Visual C++混合编程技术研究 [J], 徐彤;张莉;李松
3.Fortran与Visual C++混合编程 [J], 陈伟;谢敏
4.Visual Fortran与Visual Basic混合编程 [J], 封基良;林炳星
5.Visual C++与Compaq Visual Fortran混合编程研究 [J], 马清华;王明海
因版权原因,仅展示原文概要,查看原文内容请购买。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档