C语言转换为fortran语言
- 格式:doc
- 大小:21.00 KB
- 文档页数:2
常用C语言标准库函数C语言编译系统提供了众多的预定义库函数和宏。
用户在编写程序时,可以直接调用这些库函数和宏。
这里选择了初学者常用的一些库函数,简单介绍了各函数的用法和所在的头文件。
1.测试函数Isalnum原型:int isalnum(int c)功能:测试参数c是否为字母或数字:是则返回非零;否则返回零头文件:ctype.hIsapha原型:int isapha(int c)功能:测试参数c是否为字母:是则返回非零;否则返回零头文件:ctype.hIsascii原型:int isascii(int c)功能:测试参数c是否为ASCII码(0x00~0x7F):是则返回非零;否则返回零头文件:ctype.hIscntrl原型:int iscntrl(int c)功能:测试参数c是否为控制字符(0x00~0x1F、0x7F):是则返回非零;否则返回零头文件:ctype.hIsdigit原型:int isdigit(int c)功能:测试参数c是否为数字:是则返回非零;否则返回零。
头文件:ctype.hIsgraph原型:int isgraph(int c)功能:测试参数c是否为可打印字符(0x21~0x7E):是则返回非零;否则返回零头文件:ctype.hIslower原型:int islower(int c)功能:测试参数c是否为小写字母:是则返回非零;否则返回零 头文件:ctype.hIsprint原型:int isprint(int c)功能:测试参数c是否为可打印字符(含空格符0x20~0x7E):是则返回非零;否则返回零头文件:ctype.hIspunct原型:int ispunct(int c)功能:测试参数c是否为标点符号:是则返回非零;否则返回零 头文件:ctype.hIsupper原型:int isupper(inr c)功能:测试参数c是否为大写字母:是则返回非零;否则返回零Isxdigit原型:int isxdigit(int c)功能:测试参数c是否为十六进制数:是则返回非零;否则返回零2.数学函数abs原型:int abs(int i)功能:返回整数型参数i的绝对值头文件:stdlib.h,math.hacos原型:double acos(double x)功能:返回双精度参数x的反余弦三角函数值头文件:math.hasin原型:double asin(double x)功能:返回双精度参数x的反正弦三角函数值头文件:math.hatan原型:double atan(double x)功能:返回双精度参数的反正切三角函数值头文件:math.hatan2原型:double atan2(double y,double x)功能:返回双精度参数y和x由式y/x所计算的反正切三角函数值 头文件:math.hcabs原型:double cabs(struct complex znum)功能:返回一个双精度数,为计算出复数znum的绝对值。
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。
第 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++主程序中调用fortran子例程一、引言C语言和Fortran是两种不同的编程语言,广泛应用于不同的领域。
在某些情况下,可能需要将Fortran程序嵌入到C程序中,以便更好地利用Fortran的优势。
在这种情况下,如何在C主程序中调用Fortran子例程成为了一个重要的问题。
本文将介绍如何在C主程序中调用Fortran子例程,并给出一些示例代码。
二、基本步骤1. 编写Fortran子程序:首先需要编写一个Fortran子程序,该程序可以作为一个独立的程序运行,也可以作为主程序的一个子例程。
2. 编译Fortran子程序:使用Fortran编译器将Fortran子程序编译成可执行文件。
3. 创建C主程序:创建一个C主程序,用于调用Fortran子例程。
4. 链接C和Fortran程序:使用C编译器将C主程序和Fortran 可执行文件链接成一个完整的程序。
三、示例代码下面是一个简单的示例代码,展示如何在C主程序中调用Fortran子例程:Fortran子程序(example.f90):```fortransubroutine add(a, b, result) bind(c, name="add")use iso_c_binding, only: c_intimplicit noneinteger(c_int), intent(in) :: a, binteger(c_int), intent(out) :: resultresult = a + bend subroutine add```这个Fortran子程序接受两个整数参数,并返回它们的和。
它使用了iso_c_binding模块来声明C兼容的变量类型。
C主程序(main.c):```c#include <stdio.h>#include <stdlib.h>#include <complex.h>#include "example.f90"int main() {int result;int a = 5, b = 10;complex c;c = (complex) a + (complex) b; // 将整数转换为复数,以便在C和Fortran之间传递数据类型兼容的数据call add(a, b, result); // 调用Fortran子例程并将结果保存到变量result中printf("Result: %d\n", result); // 输出结果return 0;}```这个C主程序调用了上面定义的Fortran子程序add,并将结果保存到变量result中。
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文件夹,选择新建项。
数值分析程序设计Part I F ortran语言基础COMPAQ VISUAL FORTRAN 6.50编译器的使用0.1 编译器简介高级语言以及汇编语言的程序代码在没有转换成机器代码前,计算机是无法执行的。
编译器的功能是将高级语言的程序代码翻译成计算机可执行的机器码,也就是生成扩展名为EXE, COM的文件。
0.2 Visual Fortran的使用Visual Fortran起源于Microsoft的Fortran PowerStation 4.0,这套工具后来卖给Digital公司继续开发,第二个版本称为Digital Visual Fortran 5.0,Digital 被Compaq并购之后,接下来的版本6.0和6.5称为Compaq Visual Fortran。
下面的介绍以Compaq Visual Fortran 6.5作范例。
Visual Fortran被组合在一个叫做Microsoft Visual Studio的图形接口开发环境中。
Visual Studio提供一个统一的使用接口,这个接口包括文字编辑功能、Project管理功能、调试工具等。
而编译器则被组合到Visual Studio中,VF和VC++使用相同的使用接口。
Visual Fortran 6.5除了完全支持Fortran 95的语法外,扩展功能方面提供了完整的Windows程序开发工具,专业版还含有IMSL数值计算连接库。
另外还可以和VC++直接互相连接使用,也就是把Fortran和C语言的程序代码混合编译成一个执行文件。
安装好Compaq Visual Fortran后,运行Developer Studio就可以开始编译Fortran程序了。
运行Developer Studio启动Visual Fortran,默认程序名称为Compaq Visual Fortran 6.5选择File菜单中的New选项在弹出的对话框中,选择Project标签。
fortran转c语言规则FORTRAN转C语言规则Fortran和C语言是两种编程语言,它们有着不同的语法和语义。
然而,在某些情况下,我们需要将Fortran程序转换为C语言程序。
为了确保转换后的程序具有正确的行为,必须遵循一些规则。
以下是一些Fortran转换成C语言的规则:1. 类型转换Fortran和C语言有不同的数据类型,因此必须进行数据类型转换。
在Fortran中,整数类型默认是4字节。
在C语言中,整数类型的大小取决于编译器。
要确保正确的类型转换,可以使用类型转换操作符。
例如,"(int)variable"表示将Fortran变量variable转换为C语言整数类型。
2. 函数转换在Fortran中,函数通常采用子程序的方式来实现。
在C语言中,函数被定义为返回值和参数的组合。
为了将Fortran函数转换为C语言函数,必须将Fortran子程序的返回值添加到C语言函数中。
此外,Fortran子程序中使用的参数必须转换为相应的C语言数据类型。
3. 数组转换Fortran和C语言在数组处理方面也有所不同。
在Fortran中,数组是基于1的,而在C语言中,数组是基于0的。
为了正确转换数组,必须使用正确的索引。
例如,如果Fortran数组是A(1:10),则在C语言中可以表示为A[0]到A[9]。
4. 结构体转换Fortran程序中使用的结构体可以通过C语言中的结构体来实现。
为了实现结构体的转换,必须使用与Fortran等效的结构体定义。
5. 代码风格转换Fortran和C语言具有不同的代码风格和模式。
为了使转换后的C语言程序更易于阅读和理解,应使用C语言的代码风格和模式。
在完成Fortran到C语言的转换后,需要进行测试以确保程序的正确性。
这可以通过比较Fortran程序和转换后的C程序的输出结果来实现。
如果结果相同,这意味着转换成功。
否则,需要重新审查程序并进行修正。
总结Fortran和C语言是两种不同的编程语言,但它们在某些方面有相似之处。
C/C++采用的是缺省调用约定是STDCALL约定.在C程序中,可以在函数原型的声明中使用_stdcall关键字来指明过程采用STDCALL调用约定。
Fortran过程采用的缺省标识符是,全部大写的过程名加上“_”前缀和“@n”后缀。
在C程序中保留标识符的大小写。
编译程序会给采用STDCALL约定的过程标识符加上“_”前缀和“@n”后缀。
Fortran过程缺省的参数传递方式是引用方式是。
对于下面这个Fortarn过程:SUBROUTINE ForSub(ivar,rvar)
INTEGER ivar
REAL rvar
WRITE(*,*) ivar,rvar
END
在C语言程序中应给出过程的函数原型及调用方式为:
void main()
{
extern void__stdcall FORSUB(int*I,float*f);
int iCV AR=1;
float rCV AR=2.0;
FORSUB(&iCV AR,&rCV AR);
}
在C++中调用Fortan的过程,在声明函数原型时需要用extern“C”语句,以避免C++编译程序对标识符的修饰;并且C++也可以通过引用方式传递参数。
对于上面的Fortran过程,C++程序应给出的函数原型及调用方法是:
void main()
{
extern “C”{void__stdcall FORSUB(int*I,float*f);}
int iCV AR=1;
float rCV AR=2.0;
FORSUB(&iCV AR,&rCV AR);
}
另外,也可以在Fortran中用!MS$ATTRIBUTES编译伪指令来改变Fortran子过程的调用约定,以便于被其他语言的程序调用。
在下面的例子中,过程ForSub具有C语言的调用约定。
SUBROUTINE ForSub(ivar,rvar)
!MS$ATTRIBUTES C::ForSub
INTEGER ivar
REAL rvar
WRITE(*,*) ivar,rvar
END
这样,这个过程使用的是C调用约定,并且参数传递方式也变为传值方式,过程的标识符变为全部小写且有_前缀而无后缀的方式。
在C语言源程序中的函数原型及调用方法为:void main()
{
extern void FORSUB(int ivar,float rvar);
int iVar=1;
float fVar=2.0; FORSUB(iVar,fVar); }。