C与C++与FORTRAN混合编程

合集下载

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为数组变量。

通过与Fortran 的混合编译在C 中实现动态数组

通过与Fortran 的混合编译在C 中实现动态数组

通过与Fortran 的混合编译在C 中实现动态数组作者:王国宾来源:《电脑知识与技术》2013年第18期摘要:动态数组在数据处理时有着独特的优势,Fortran语言数组功能强大并支持动态数组,而C语言不支持动态数组。

利用Fortran与C/C++的混合编译思想,通过调用Fortran90例程的方法,在C中实现动态数组并给出了程序代码。

关键词:动态数组;Fortran;C/C++;混合编译;调用约定中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2013)18-4192-03数组是处理大量数据时的有力助手。

在不能够事先确定数组大小的情况下,为避免数据溢出或越界,就要足够大的数组。

这种方法使用过度,会迟滞内存操作。

故此,理想的数组能够动态确定大小,即程序运行中先向系统申请一个大数组,不使用时再将其内存空间释放掉。

而动态数组很好地满足了这一要求。

但C语言不支持动态数组,不能动态定义数组元素的数量。

如何解决这一矛盾将是本文的着力点。

1 Fortran中的动态数组Fortran90数组功能强大,执行程序时能够动态分配数组存储空间和实际大小,不使用时再将其内存释放还给系统;支持直接操作数组段、数组整体;支持逐个操作数组元素;支持面向数组操作的函数和构造块[1]。

Fortran 90中运用动态数组需要三个步骤:1)声明动态数组。

明确数组的维数,不规定维的上、下界和大小(即延迟形状数组)。

如:REAL,DIMENSION(:),ALLOCATABLE::X。

2)给动态数组分配内存。

如:ALLOCATE(X(N))。

3)将分配的内存释放掉。

如:DEALLOCATE(X)。

2 Fortran与C/C++的混合编译在32位Windows系统下,同时安装Compaq Visual Fortran 6.x和Microsoft Visual C++ 6.0,则两者共享一个可视化开发环境(Microsoft Visual Studio 6.0)[1]。

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。

fortran与c语言接口参数传递混合编程

fortran与c语言接口参数传递混合编程

Sun Studio 12:Fortran 编程指南•Previous: 第10 章并行化第11 章C-Fortran 接口本章论述Fortran 与C 的互操作性方面的问题,内容仅适用于Sun Studio Fortran 95 和C 编译器的特定情况。

11.9 Fortran 2003 与C 的互操作性简要说明了Fortran 2003 标准第15 部分中提到的C 绑定功能。

(此标准可以从国际Fortran 标准Web 站点获得)。

Fortran 95 编译器实现了标准中所述的这些功能。

如不特别注明,32 位x86 处理器视为与32 位SPARC 处理器等同。

对于64 位x86 处理器和64 位SPARC 处理器也是如此,只是x86 系统未定义REAL*16 和COMPLEX*32 数据类型,这些数据类型只能用于SPARC。

11.1 兼容性问题大多数 C-Fortran 接口必须在以下这些方面全部保持一致:•函数和子例程的定义及调用•数据类型的兼容性•参数传递(按引用或按值)•参数的顺序•过程名(大写、小写或带有结尾下划线(_))•向链接程序传递正确的库引用某些C-Fortran 接口还必须符合:•数组索引及顺序•文件描述符和stdio•文件权限11.1.1 函数还是子例程?函数一词在 C 和Fortran 中有不同的含义。

根据具体情况做出选择很重要:•在C 中,所有的子程序都是函数;但void函数不会返回值。

•在Fortran 中,函数会传递一个返回值,但子例程一般不传递返回值。

当Fortran 例程调用C 函数时:•如果被调用的C 函数返回一个值,则将其作为函数从Fortran 中调用。

•如果被调用的C 函数不返回值,则将其作为子例程调用。

当C 函数调用Fortran 子程序时:•如果被调用的Fortran 子程序是一个函数,则将其作为一个返回兼容数据类型的函数从 C 中调用。

•如果被调用的Fortran 子程序是一个子例程,则将其作为一个返回int(与Fortran INTEGER*4兼容)或void值的函数从C 中调用。

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

C语言与汇编语言混合编程

C语言与汇编语言混合编程
1. 基本ATPCS 基本ATPCS规定了在子程序调用是的一些基本规 则,包括下面3方面的内容:
1) 各寄存器的使用规则及其相应的名称。 2) 数据栈的使用规则。 3) 参数传递的规则。
相对于其他类型的ATPCS, 满足ATPCS的程序的 执行速度更快,所占用的内存更少,但是它不能提供以 下的支持:ARM程序和Thumb程序相互调用、数据以 及代码的位置无关的支持、子程序的可重入性和数据 栈检查的支持。
途。 3.参数传递规则 根据参数个数是否固定可以将子程序分为参数
个数固定的子程序和参数个数可变的子程序。 (1)参数个数可变的子程序参数传递规则
对于参数个数可变的子程序,当参数个数不超
过4个时,可以使用寄存器R0~R3来传递参数,当参 数超过4个时,还可以使用数据栈来传递参数。 (2)参数个数固定的子程序参数传递规则
❖ 结果为一个64位整数时,可以通过寄存器R0和R1 返回,依次类推。
❖ 结果为一个浮点数时,可以通过浮点运算部件的寄 存器f0、d0或者s0来返回。
❖ 结果为复合型的浮点数时,可以通过寄存器f0~fN或 者d0~dN来返回。
❖ 对于位数更多的结果,需要通过内存来传递。
对有调用关系的所有子程序必须遵守同一种 ATPCS。
嵌入式系统设计与开发
C语言与汇编语言混合编程
1.1 C程序与汇编程序互相调用规则 1.2 内嵌汇编程序设计 1.3 C语言函数和ARM汇编语言函数间互相调用
C语言与汇编语言混合编程
1.1 C程序与汇编程序互相调用规则 为了使单独编译的C语言程序和汇编程序之间能
够相互调用,必须让子程序间的调用遵循一定的规则。 ATPCS即ARM,Thumb过程调用标准,是ARM程序和 Thumb程序中子程序调用的基本规则,它规定了一些子 程序间调用的基本规则。下面介绍几种ATPCS规则:

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 之间的混合编程研究。

汇编语言和C语言的混合编程

汇编语言和C语言的混合编程

2. 在汇编中使用C定义的全局变量
#include <stdio.h> int gVar_1 = 12; extern asmDouble(void);
int main() { printf("original value of gVar_1 is: %d", gVar_1); asmDouble(); printf(" modified value of gVar_1 is: %d", gVar_1); return 0; }
内嵌汇编使用的标记是 __asm,用法如下: __asm { instruction [; instruction] … [instruction] }
void enable_IRQ(void) { void disable_IRQ(void) {
int tmp;
__asm
int tmp;
__asm
PRESERVE8 AREA Scopy ,CODE,READONLY EXPORT strcopy strcopy LDRB R2,[R1],#1 STRB R2,[R0],#1 CMP R2,0 BNE strcopy MOV pc,lr END
在汇编中调用C的函数
• 在汇编中调用C的函数,需要在汇编中IMPORT 对应 的C函数名,使用BL指令调用
return a + b + c;
}
int g( int a, int b, int c, int d, int e, int f ) { printf(“e=%d\n”, e); printf(“f=%d\n”, f); return (a+b+c+d+e+f); }

用C#调用Fortran

用C#调用Fortran

C#与Fortran混合编程之本地调用Fortran动态链接库前言C#发展到现在,已是一门相当完善的语言,他基于C语言风格,演化于C++。

并依靠强大的.NET底层框架。

C#可以用来快速构建桌面及Web应用。

然而在我们的实际工作中,尽管C#已经非常完善,但还是不能完成我们所有的工作。

在很多工程计算中,C#语言的计算速度,精度,以及执行效率相对来说都达不到项目的要求。

因此我们便考虑是否有一种方式将我们的工程计算部分和我们的项目分开,将计算部分用另一种执行更快,精度更高的语言来编写,然后在 C#中调用,最后完成我们的工作。

答案是肯定的。

Fortran是一门古老的语言,它是世界上最早出现的计算机高级程序设计语言,广泛应用于科学和工程计算领域。

FORTRAN语言以其特有的功能在数值、科学和工程计算领域发挥着重要作用。

然而Fortran程序本身不适合开发独立的应用程序,例如我们传统的桌面应用或者Web应用。

因此这里我们便想将C#与Fortran结合,C#借助Fortran可以实现精度更高,计算更快的程序,而Fortran 通过C#,便也能够达到可视化设计。

一、基本思路运用Fortran,编写动态链接库(DLL),在DLL中提供计算的函数接口,然后在C#中调用该DLL中计算部分的函数,实现计算过程。

这里需要注意的是,由于我们使用的是Fortran编译器,生成的DLL属于第三方非托管DLL,因此无法直接在程序中添加DLL的引用。

具体的做法将在后续部分说明。

二、编写Fortran程序,生成动态链接库文件知道思路之后便开始正式的Coding。

首先新建一个空的Fortran Dynamic-link Library项目。

在Intel(R) Visual Fortran点击Library,选中右图的Dynamic-link Library.然后点击OK.这时的项目如下所示:点击Sources File文件夹,选择新建项。

C语言直接操作FORTRAN数据文件的方法

C语言直接操作FORTRAN数据文件的方法

摘要:FORTRAN数据文件的结构及用C语言直接对FORTRAN数据文件进行数据读取和处理的方法,并结合实例,给出了完成操作的C语言源程序。

关键词:C语言FORTRAN数据文件数据直接读写FORTRAN语言适用于数值计算,在科学和工程计算方面发挥了重要作用。

C语言具有很强的通用程序设计功能,而且很适于处理图形图像、系统程序方面的问题,但它的数值计算能力不如FORTRAN语言。

如果能在C语言程序中直接调用FORTRAN程序的计算结果,则可充分利用这2种语言的优势。

为此,有必要建立用C语言对FORTRAN数据文件进行直接读取和处理的方法。

1 FORTRAN数据文件的结构在C语言程序中调用FORTRAN程序的计算结果,可通过FORTRAN数据文件来实现,而要用C语言直接存取FORTRAN数据文件,必须首先清楚FORTRAN数据文件的结构。

FORTRAN数据文件按存取方式的不同可分为顺序文件和直接文件。

而不论是顺序文件还是直接文件,按数据在文件中的存放方式的不同,都有2种存放形式,一种是字符形式(即ASCII码形式),另一种是二进制代码形式。

前者称为有格式存放,后者称为无格式存放。

由于对直接文件存取的基本操作步骤与对顺序文件存取的基本操作步骤相同,二者的不同主要体现在操作时是否应顺序进行。

下面以顺序文件为例进行具体分析。

1.1 有格式文件的结构有格式文件全部由有格式的记录组成,有格式的记录是字符的序列,以ASCII码形式存放。

各记录以回车符(0DH)和换行符(0AH)作为结束标志,各记录之间无分隔符,各记录的长度(字节数)可以不等。

1.2 无格式文件的结构无格式文件全部由无格式记录组成,无格式记录是值的序列,即二进制代码序列。

这种格式的文件,其第1个字节是4BH(即十进制的75),最后1个字节为82H(即十进制的130),各无格式记录的数据信息位于这2个字节之间。

每一个无格式记录都由下面3部分组成:(1)记录的首字节,是该记录所有数据所占的字节数;(2)组成该记录的各数据内容。

VC与Fortran混合语言编程

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 系统平台上最强大的应用程序开发系统之一。

基于Linux的Fortran与C/C++混合编程

基于Linux的Fortran与C/C++混合编程

基于Linux的Fortran与C/C++混合编程李霞;亓雪冬【期刊名称】《现代计算机(普及版)》【年(卷),期】2012(000)002【摘要】Fortran、C/C++是用户数量最多,使用最为广泛的编程语言.存在大量优秀的软件包及源代码,通过混合编程可以合并不同语言的优势,充分利用目前存在的这些软件资源。

分析在Linux系统中Fortran与C/C++混合编程基本原理和内部调用约定.并通过实例阐述了使用C/C++调用Fortran77编写的线性代数软件包LAPACK的方法。

实践表明,这种方法有效且可靠。

%Fortran and C/C++ are some programming languages used widely and have largest number of users. And a lot of software and source program are coded in them. Mixed programming of For- tran and C/C++ can combine the advantages of different languages. Analyses the basic principle and interlanguage conventions of mixed Fortran and C/C++ language programming in Linux sys- tem, and expounds the method of using Fortran77 LAPACK subroutines in C program. Experi- mental result shows that this method is available and reliable.【总页数】4页(P57-60)【作者】李霞;亓雪冬【作者单位】中国石油大学信息与控制工程学院,青岛266555;中国石油大学计算机与通信工程学院,青岛266555【正文语种】中文【中图分类】TP311.52【相关文献】1.C/C++与FORTRAN混合编程技术及其应用研究 [J], 周谧2.C++与Fortran混合编程在多点地质统计建模中的应用 [J], 冯文杰;尹艳树;毛锐;石书缘3.C、C++、Fortran混合编程技术研究与问题处理 [J], 邹倩倩;孙沛;杨冰;孙梦婕4.C、C++、Fortran混合编程研究 [J], 魏威;魏冲5.一种Fortran和C++混合编程规范化方法 [J], 陈磊;徐烂因版权原因,仅展示原文概要,查看原文内容请购买。

fortran unclassifiable statement at (1)

fortran unclassifiable statement at (1)

fortran unclassifiable statement at (1)
在Fortran编程语言中,错误消息"fortran unclassifiable statement at (1)" 通常表示编译器遇到了它无法识别的语句。

这可能是由于多种原因造成的,以下是一些常见的原因:
1.语法错误:代码中可能存在拼写错误、错误的符号使用,或者缺少某些必需的关键字。

2.代码结构问题:在某些情况下,可能是由于程序的结构问题,例如,子程序或函数调用
中的错误。

3.不支持的特性:如果尝试使用Fortran标准中不支持的特性或功能,也可能会触发此错
误。

4.混合编程:在某些情况下,如果Fortran代码与其他编程语言(如C或C++)混合编写,
可能会因为不兼容的语法或结构而出现此错误。

5.版本不匹配:编译器的版本可能不兼容你的代码。

尝试更新或更改编译器可能会解决这
个问题。

6.使用了过时或不推荐使用的语法或函数:尽管这些功能在旧版本的Fortran中是有效的,
但现代版本的Fortran可能不再支持这些功能。

为了解决这个问题,你可以:
•检查代码中的语法错误,确保所有的语句都是正确的。

•确保所有的子程序和函数调用都是正确的。

•查阅Fortran文档,确保你正在使用的所有特性都是当前标准所支持的。

•如果与其他语言混合编程,请确保你遵循了正确的混合编程规范。

•更新或更改编译器,确保它与你的代码兼容。

•考虑使用现代的Fortran编程实践和标准。

基于VS2008和IVF11的C C++和Fortran混合编程

基于VS2008和IVF11的C C++和Fortran混合编程

基于VS2008和IVF11的C/C++和Fortran混合编程By X.C. Li(lxc1975@)调用时,先将有Fortran写出来的函数建立成动态库,然后在C++程序中连接这个动态库,连接的方式有显示和隐式两种。

本文提及的仅限于隐式连接。

C/C++编译器:MSVS2008(VC9),对VS2005也适用。

Fortran编译器:Intel Visual Fortran Compiler 11.0,IVF的其它版本也适用。

操作系统:Win7。

1. 建立Fortran动态库1.1 用IVF建立一个dynamic-link library项目,比如项目名为FortranDLL。

在项目中新建f90代码文件,比如文件名为FortranSrc.f90。

在FortranSrc.f90中写下如下代码:double precision function addF(x, y)!DEC$ ATTRIBUTES DLLEXPORT, STDCALL:: addF!DEC$ ATTRIBUTES VALUE::x, yimplicit nonedouble precision x, yaddF = x + yreturnend function addF1.2 说明:1)Fortran不区分大小写,代码的大小写纯粹是为了可读性。

2)!DEC$ ATTRIBUTES DLLEXPORT, STDCALL::addF。

首先,这一行中的“!”并非注释的意思。

行中的STDCALL(它被叫做调用约定)不能少,否则C++程序(这里说的是C++调用时)编译时,会报错为:无法连接addf函数。

之所以提醒这一点,是因为在早期的版本中缺省就是STDCALL,所有可有可无。

如果你按照早前的资料去做的话就不行了。

不同的编译器以及在不同的操作系统上其缺省的值不一样,为了稳妥或程序的可读性,将调用约定显式写出来比较好。

3)对!DEC$ ATTRIBUTES VALUE::x, y的解释。

关于Fortran调用C++函数的小结

关于Fortran调用C++函数的小结

关于Fortran调用C++函数的小结2017-3-12背景工作中遇到了需要在Fortran代码中调用C++提供的函数的情况。

通过在网上查阅资料,总结了实现方法,制作了一个实例。

工具集成开发环境是VS2010。

由于默认安装模式下的VS2010是无法编译调试Fortran的,所以又补充安装了Intel(R) Virual Fortran 2011(英特尔可视化Fortran编译器)。

参考资料分析本文需要用到Fortran与C/C++的混合编程,Fortran和C/C++分别编译各自的功能模块源代码,得到各自的目标文件(.obj),然后集成链接这些obj 文件生成一个统一的可执行文件,实现对对方函数的调用,数据交换通过约定接口来实现[1]。

C++代码中函数说明前需要用到extern关键字,说明函数可以在本模块或其它模块中使用[2]。

extern与"C"一起连用时,如: extern "C" void fun(int a, int b);则告诉编译器在编译fun这个函数名时按着C的规则去翻译相应的函数名而不是C++的,C++的规则在翻译这个函数名时会把fun这个名字变得面目全非[3]。

要在Fortran中调用C++的函数,意味着Fortran项目对C++项目产生了依赖关系,如果项目依赖项未设置会导致类似“无法解析的外部符号_XXX,该符号在函数_XX 中被引用”的错误。

另外还要保证Fortran与C++项目的运行库设置都是“多线程调试”[4]。

实现过程创建Fortran项目1)启动VS2010,新建一个Fortran控制台应用程序,名称为Console1。

2)在该项目下的Source Files下添加一个新文件Source1.f90。

3)在Source1.f90中写入如下代码:program mainimplicit noneinterfacesubroutine SUB(a,b)!DEC$ ATTRIBUTES C,ALIAS:'_sub'::SUB!DEC$ ATTRIBUTES reference::a,binteger a , bend subroutine SUBend interfaceinteger(4) a,b,ca=100b=1write(*,*) "开始调用C++里的函数SUB"call SUB(a,b)read(*,*)end program main注:接口中为_sub这个来自于C++的函数起了个别名SUB,所以在后面调用SUB时其实就是调用_sub。

C语言和汇编语言混合编程

C语言和汇编语言混合编程

C/C++ 语言和汇编语言混合编程开发为了充分利用DSP芯片的硬件资源,更好发挥C/C++ 语言和汇编语言进行软件开发的各自优点,可以将两者有机的结合起来,兼顾两者优点,避免其弊端。

因此,在很多情况下,采用混合编程方法能更好地达到设计要求,完成设计任务。

C/C++语言和汇编语言混合编程的具体方法有以下几种:(1)独立编写C/C++程序和汇编程序,分开编译或汇编形成各自的目标模块,再用链接器将C/C++模块和汇编模块链接起来,这是一种灵活性较大的方法。

但用户必须自己维护各汇编模块的入口和出口代码,自己计算传递参数在堆栈中的偏移量,工作量稍大,但能做到对程序的绝对控制,也能满足软件设计结构化的要求。

这是主要讲述的方法。

(2)在C/C++程序中使用汇编程序中定义的变量和常量。

(3)在C/C++程序中直接内嵌汇编语句。

这种方法可以在C/C++程序中实现C/C++语言无法实现的硬件控制功能,如修改中断控制寄存器、中断标志寄存器等。

(4)在C/C++源程序中使用内部函数直接调用汇编语言语句。

后3种方法由于在C/C++语言中直接嵌入了汇编语言的成分,容易造成程序混乱,C/C++环境被破坏,甚至导致程序崩溃,而编程者又很难对不良结果进行预期和有效控制。

而如果采用第一种方法,只要遵循有关C/C++语言函数调用规则和寄存器规则,就能预见到程序运行的结果,保证程序正确。

下面分别讲述函数调用规则和寄存器规则。

1.函数调用规则C/C++编译器对函数调用强加了一组严格的原则。

除了特殊的运行时间支持库函数外,任何调用函数和被C/C++函数调用的函数都必须遵守这些原则。

不遵守这些原则可能破坏C/C++环境并导致程序失败。

图1说明了典型的函数调用。

在这个例子中,参数被传递到堆栈中调用者的参数块,函数再使用这些参数调用被调用函数。

注意,第一个参数是在A累加器中传递的。

这个例子还说明了汇编器对被调用函数的局部帧的分配。

局部帧包括局部变量块和局部参数块两部分,其中局部参数块是局部帧中用来传递参数到其他函数的部分。

科学计算编程中的Fortran

科学计算编程中的Fortran

科学计算编程中的 Fortran科学计算编程中的 Fortran 与 C++之争自从有了程序设计语言,“哪种编程语言好”就成为了亘古不变的话题。

这个问题一经提出,必然会招来一场巨大的口水仗。

作者曾经在某些论坛上提出了类似“Fortran 和C++那个用的多”之类的问题,回帖全部达几十个以上,各种意见针锋相对,犹如 Fortran 和 C++信徒之间的“圣战”一般好看。

有很多人曾经请 C++语言之父 Bjarne Stroustrup 做一个 C++与其它编程语言的比较,而 Stroustrup 明确的拒绝了。

他指出,从技术上讲,一个所谓的“公平”的比较将会涉及到大量的技术,这是一个工作量巨大的任务,绝对不是简单的用 C++和其它语言写同一段代码然后比较其运行时间就能完成的。

这种比较涉及到具体的应用领域和用户需求,所处理的信息类型,编译器的质量(不同语言的编译器开发的投入是有相当大差别的),程序员的水平与“偏好”,编程语言的标准(如究竟是 C++97 与 Fortran90 比较,还是应该C++0x 与 Fortran2019 比较?)等等。

他甚至认为,这种比较是“rarely meaningful”的[1]。

因此,今天作者也不打算为某种编程语言摇旗呐喊,而是仅就科学计算编程领域,特别是,限于作者专业即量子化学和分子模拟,来谈一谈两大“主流”编程语言: Fortran 和 C++的在理论化学界的应用历史,以及某些人(包括作者)对它们的看法。

1 Fortran 的美好时代毋庸置疑, 1957 年出现的 Fortran 是世界上第一个高级编程语言。

它的出现,大大降低了普通科研人员学习编程的门槛,而且增强了代码的可移植性。

在此之前,人们都是用机器语言直接书写程序,这种语言对于一般人而言难度太大了,而且是与运行机器相关,因此很难写出高效且具有可移植性的程序。

例如, Roothaan 在研究原子自洽场的计算时专门为 IBM 7030 数字计算机写了一些程序,这些程序用来优化 Slater 基组已经 10 多年了。

fortran与c语言接口参数传递混合编程

fortran与c语言接口参数传递混合编程

Sun Studio 12:Fortran 编程指南∙Previous: 第10 章并行化第11 章C-Fortran 接口本章论述Fortran 与C 的互操作性方面的问题,内容仅适用于Sun Studio Fortran 95 和C 编译器的特定情况。

11.9 Fortran 2003 与C 的互操作性简要说明了Fortran 2003 标准第15 部分中提到的C 绑定功能。

(此标准可以从国际Fortran 标准Web 站点获得)。

Fortran 95 编译器实现了标准中所述的这些功能。

如不特别注明,32 位x86 处理器视为与32 位SPARC 处理器等同。

对于64 位x86 处理器和64 位SPARC 处理器也是如此,只是x86 系统未定义REAL*16 和COMPLEX*32 数据类型,这些数据类型只能用于SPARC。

11.1 兼容性问题大多数 C-Fortran 接口必须在以下这些方面全部保持一致:∙函数和子例程的定义及调用∙数据类型的兼容性∙参数传递(按引用或按值)∙参数的顺序∙过程名(大写、小写或带有结尾下划线(_))∙向链接程序传递正确的库引用某些C-Fortran 接口还必须符合:∙数组索引及顺序∙文件描述符和stdio∙文件权限11.1.1 函数还是子例程?函数一词在 C 和Fortran 中有不同的含义。

根据具体情况做出选择很重要:∙在C 中,所有的子程序都是函数;但void函数不会返回值。

∙在Fortran 中,函数会传递一个返回值,但子例程一般不传递返回值。

当Fortran 例程调用C 函数时:∙如果被调用的C 函数返回一个值,则将其作为函数从Fortran 中调用。

∙如果被调用的C 函数不返回值,则将其作为子例程调用。

当C 函数调用Fortran 子程序时:∙如果被调用的Fortran 子程序是一个函数,则将其作为一个返回兼容数据类型的函数从 C 中调用。

∙如果被调用的Fortran 子程序是一个子例程,则将其作为一个返回int(与Fortran INTEGER*4兼容)或void值的函数从C 中调用。

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

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}经过上面的定义后,所有的函数便可以在三种语言中自由调用。

在三种语言的混合编程中,还要注意函数的参数:字符串的传递问题。

Windows平台上的Fortran和C/C++的混合语言编程里,字符串的处理需要特别注意。

Fortran的一个字符变量是定长的字符串,没有特别的终止符号,这不像C/C++。

关于怎样表示字符、怎样存储它们的长度没有固定的约定。

有些编译器把一个字符参数作为一对参数传送给一个程序,其中之一是保存这个串的地址,另一个是保存串的长度。

Fortran里面字符串的结束就是靠字符串的长度确定的。

对含有字符串的函数,可以这样处理:例如函数 void cCharFunction( char *msg );需要定义成:void cCharFunction( char *msg , int len ); 经过上面的define之后,在Fortran中,只需调用CCHARFUNCTION( MSG )即可。

由于Fortran程序没有明显得字符串结束标志,这样,如果两个字符串连在一起的话,C的程序里就会取到这个连在一起的字符串,因此,最好在C的程序里面,对这个由Fortran程序得到的字符串进行处理,因为,从len这个变量,可以得到字符串长度,截取msg的前len个字符作为这个字符串的应有长度。

而如果是在Fortran程序里面,如函数:SUBROUTINE FCHARFUNCTION (FCHAR);经过相应的声明,进行下面的定义即可:#define fCharFunction( fchar ), FCHARFUNCTION( fchar, strlen(fchar) )这样,在C/C++程序里即可直接调用。

在这三种语言的混合编程里,还有一个小问题就是指针的问题。

Fortran里面所有的变量都相当于C/C++里面的指针,所以,在C/C++里面的程序里,函数的参数应一律声明成指针的形式(除了字符串参数后面的长度)。

数据:混合编程里,数据上存在的差异也必须引起足够的重视。

这体现在两个方面,数组和结构。

数组:Fortran语言里面,数组和C/C++里面的数组有些不同,这表现在两个方面,一是行列顺序,二是数组起始值。

Fortran语言不同于C/C++的行优先,而使用列优先的方式。

假设一个A数组,m行n列,那么采用行优先时的数据存放格式为:a11,a12,…,a1n,a21,a22,…,a2n,……,am1,am2,…,amn而采用列优先的数据存放格式为:a11,a21,…,am1,a12,a22,…,am2,……,a1n,a2n,…,amn行优先顺序推广到多维数组,规定为先排最右的下标;列优先顺序推广到多维数组,规定为先排最左的下标。

这样,在混合语言编程里调用数据时,必须注意行列优先的差别,进行准确的调用。

数组的另一个差别是起始下标的不同。

Fortran里面,默认的数组下标是以1开始的,而C/C++里面是从0开始的,所以,在调用里面要注意加一或者减一,以保证调用到正确的数据。

结构:在Fortran语言里的结构经过声明后,就被分配了空间,在C/C++里面也要声明它,采用下面的方式:Fortran:COMMON /COLOR7/ C_RED, C_GREEN, C_BLUECOMMON /NDDAT/ NID(NASIZE),XN(3,NASIZE)#ifdef __cplusplusextern "C" {#endif#define color7 COLOR7#define nddat NDDATextern struct {float c_red; float c_green; float c_blue;} color7;extern struct {int nid[NASIZE]; float xn[NASIZE][3];} nddat;#ifdef __cplusplus}#endif2 Linux平台Linux平台的混合语言编程和Windows平台上的基本没有什么区别,主要是在define上的不同。

考虑到编译器的差异,在函数声明上,可以用下面的方式进行跨平台编程的函数声明。

( C/C++编译器使用GNU gcc,Fortran编译器使用 pgi Fortran )。

假设一个C的函数为 void cFunction(); 那么,只需要在它的头文件里面进行定义即可:#ifdef __cplusplusextern “C” void {#endifextern void CFunction();#define cFunction cfunction_#ifdef __cplusplus}#endif这样,在Fortran或者C++的程序里面就可以直接调用了。

注意:函数名应不大于31个字符。

(即cfuntion_字符长度不大于32字符。

PGI&Linux) 同样,对于C++和Fortran里面的函数,声明的时候,也只要改成小写,加下划线即可。

对于数组来说,变化和Windows是一致的。

都是行列优先顺序不同的。

而对于字符串来说,则不需要额外的注意,gcc编译器会处理好这个问题,也就是并不需要作出额外的改变。

数据结构的定义,也要改成小写加下划线的方式,如:Fortran:COMMON /COLOR7/ C_RED, C_GREEN, C_BLUECOMMON /NDDAT/ NID(NASIZE),XN(3,NASIZE)C/C++:#ifdef __cplusplusextern "C" {#define color7 color7_#define nddat nddat_extern struct {float c_red; float c_green; float c_blue;} color7;extern struct {int nid[NASIZE]; float xn[NASIZE][3];} nddat;#ifdef __cplusplus}#endif3 其它平台对于Solaris平台,基本上和Linux平台完全一致,但是,考虑到Solaris大多运行在Sparc CPU上,它是采用big endian的,而基本的Windows和Linux运行在Intel或者AMD的X86平台,都是采用little endian的,这一点需要特别注意,这在读写数据文件时,应该给予足够的重视。

其它的UNIX平台如HP UNIX,ULTRIX,IRIS等,一般都只有define上的微小差别,在字符串处理、结构及数组方面基本与Linux相同,对它们来说,考虑更多的应该是中央处理器的不同带来的差别。

(如对齐、大端和小端)。

WIN32 平台define a AULTRIX || SPARC || IRIS || LINUX 平台 define a a_ HPUX || AIX 平台勿须define 4 C/C++/FORTRAN 混合编程中的字符串处理混编中经常会出现需要传递字符串的情况,而字符串的传递是一个较为麻烦的事情,在Fortran里面,字符串是没有结束符的,但是有长度的概念,也就是,编译器里面会给每一个字符串一个长度,以控制字符串的长度。

但是这个长度参数在不同的平台下,其位置也是不同的(有的直接跟在字符串后面,有的则跟在函数参数的最后面),对于常见的平台如Windows,Linux, Solaris, HP UNIX, IRIS, 可以用如下方法定义:例如 c函数void messag( char *msg1, int *where1, char *msg2, int *where2 ){printf(“……%s should be %d, while %s should be %d\n”, msg1, *where1, msg2,where2);}如果要在Fortran里面调用的话,需要以下define:#if defined ULTRIX || SPARC || IRIS || LINUX || WIN32#if defined ULTRIX || SPARC || IRIS || LINUXextern void __stdcall messag(char*, int*, char*, int*, int, int)#define messag( s1, i1, s2, i2 ) messag_( s1, i1, s2, i2, strlen(s1), strlen(s2) )#else /* WIN32 Platform */extern void __stdcall messag(char*, int, int*, char*, int, int*)#define messag( s1, i1, s2, i2 ) MESSAGE( s1, strlen(s1), i1, s2, strlen(s2),i2 )#endif#else /* Other Platform */extern void __stdcall messag(char*, int*, char*, int*, int, int)#define messag( s1, i1, s2, i2 ) messag( s1, i1, s2, i2, strlen(s1), strlen(s2) )#endif如果用在C++中,加上相应的#ifdef __cplusplusextern “C” {#endif/* your extern code */#ifdef __cplusplus}#endifFortran里面便可以直接调用,如:CALL MESSAG(char1, i1, char2,i2)同样,在Fortran里面写的字符串处理函数,使用以上的Define和extern后,也可以在c里面直接调用。

相关文档
最新文档