第11章 Fortran和C的混合语言编程-授课版
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的混合编程PPT教学课件
的子程序破坏,即这些寄存器是供所调用的子程 序作为工作寄存器的。
2020/12/10
9
2内嵌的汇编器和armasm的区别
• 与armasm相比,内嵌的汇编器在功能和使用方法上主要 有以下特点:
开成几条指令。例如指令: • ADD R0,R0,#1023 • 可能会被展开成下面的指令序列 • ADD R0,R0,#1024 • SUB R0,R0,#01 • 乘法指令MUL可能会被展开成一系列的加法操作和移位操作。 • 事实上,除了与协处理器相关的指令外,大部分的ARM指令和
Thumb指令中包含常量操作数都可能被展开成多条指令。
器的值,用户不需要去保护和恢复这些寄存器的值。
• 用户可以改变处理器模式,但是编译器并不了解处理器模式的改变。 这样,如果用户改变了处理器模式,将不能使用原来的C表达式;重 新恢复到原来的处理器模式后,才能再使用这些C表达式。
2020/12/10
11
3在C程序中使用内嵌的汇编指令
• 3.1在C程序中使用内嵌的汇编指令的语法格式 • 在ARM C语言程序中使用关键词_asm来标识一段汇编指令程序,其格式如下: • _asm •{ • Instruction[;instruction] • …… • [instruction] •} • 其中,如果一行中有很多个汇编指令,则指令之间使用分号“;”隔开。如
• 通常推荐在内嵌的汇编指令中不要指定物理寄存器,因为这可能会影 响编译器分配寄存器,进而可能影响代码的效率。
2020/12/10
4
1.3常量
Fortran混合编程
命名约定(续)
Fortran调用C/C++定义的函数:
program main implicit none real(8):: a=2.0,b=3.0,c interface function add2(m,n) 别名 !dec$ attributes stdcall,alias:'_Add2@16'::add2 real(8) m,n,add2 end function end interface print *,add2(a,b) read (*,*) c end #include<stdio.h> extern "C" double _stdcall Add2(double m,double n) { return m+n; }
end interface
示例
VIF(XE2011)环境下混合编程
VS2010环境下不能同时将多个语言的源程序 放在同一个项目中编译,Fortran和C/C++源程 序需先编译成目标文件.obj,然后在主程序所 在工程中链接形成.exe文件。
Fortran 调用C++ C++ 调用Fortran
命名约定(续)
fortran中模块的名称 Fortran模块名称在.obj文件中的形式为
_MODULENAME_mp_ENTITY[@stacksize]
module tt1 implicit none contains function mult(a,b) !dec$ attributes c::mult !dec$ attributes value::a,b real(4) a,b,mult mult=a*b end function mult end module
混合编程c++与Fortran
1.VS2008+INTELfortran.Fortran为主程序,调用c++函数2.VS2008的设置(1)在已有的fortran工程的解决方案中添加新的c++工程:解决方案可以有好多工程;但是每个工程只能是单独计算机语言的工程,即fortran用fortran建立工程,c++用c++建立工程。
设置解决方案中,各个工程之间的依赖关系。
(2)混合编程的几种方法:c++源文件编译为目标文件与fortran链接合成;c++源文件编译为库文件,然后fortran链接的时候将该库加入。
2.设置runtimelibrary:Multithreaded;而d e bug模式中,r untime library竟然是:M u ltithreaded DLL然能链接通过。
换M u ltithread 和M u ltithreaded DLL 竟的候有而且时,出错交3. 设置项目依赖关系:项目-》项目依赖项3)链接选项(以c++为静态链接库为例)如图库,下接(1)构建或改变c++工程为静态链(2)在主较多:设置比要程(f o rtran工程),需工设置l inker里面附加库(a d ditionary library)的目录和库名称linker-》additionay Library directory设置为:F:\LBM_MOVING_INTER2_FLEXIBLE\LBM_MOVING_INTER2_FLEXIBLE\Release(c++编译为静态库,库所在的目录)\称设置名:库的加附F:\LBM_MOVING_INTER2_FLEXIBLE\LBM_MOVING_INTER2_FLEXIBL E\Release\beamcpp.liblinker-》input-》a ddtionary dependencies:F:\LBM_MOVI NG_INTER2_FLEXIBLE\LBM_MOVING_INTER2_FLEXIBLE\Release\beamcpp.lib4)源程序c++函数的f ortran接口fortran为主程序,即program main{implicit noneint::i,jdoubleprecision,dimension(20)::p.....call GETBEAMDV(i,j,p...)}c++程序中#include <assert.h>#include <iostream>#include <fstream>#include <string>class myclass{...};extern "C"{void GETBEAMDV(int* ,int*,double*);}void GETBEAMDV(int* MM,int*kk,double* Pld){.....return;};几点注意:(1)ifort 编译后(fortran源程序),其函数名为大写名称前方加底横线:如“_GETBEAMDV”(2)VISUAL C++编译后(c++源程序),其函数名也为大写名称前方加底横线:如“_GETBEAMDV”因此,只需相同名称就可以了,比codeblock简单些!!!另外,为了使程序在codeblocks 和 vs2008一致,可在vs2008中进行设置,包括c++和fortran工程中添加编译和链接选项分别为:简单在vs2008的fortran工程中添加编译选项:/names:lowercase增只要加“_”的话这样call getbeamdv(i,j,p...) !!getbeamdv_((i,j,p...))用于intel fortran 编译(编译选项添加/names:lowercase,具体参见vs2008+ifort)。
C++ Fortran混合编程
C/C++/Fortran混合编程浅谈(一)直接链接方式现今流行很多编程语言,在编译型语言中,C/C++/Fortran语言应用非常广泛,C以其效率高效底层操作为著称,C++以其很好的面向对象类框架泛型编程为特点,Fortran则以现世存有大量的计算程序而占有重要的位置,在编程中,集合他们三者的长处是个很好的做法。
混合编程有很多方法,以下介绍一下基本方法。
对于各个编译器,如果编译中间的二进制文件.o或.obj的结构相同,则可以直接链接混合编程。
遵循约定:C/C++默认传值,Fortran传址。
一、相同编译器家族以gcc家族为例,类似的还有Intel C Compiler和Intel Fortran Compiler等。
1、C和Fortran(1)C调用Fortranmain.csub.f90sub.f90(F2003方式)链接方法gcc –o main.o –c main.cgfortran –o sub.o –c sub.f90gcc –o main.exe main.o sub.o或者直接gcc –o main.exe main.c sub.f90 输出(2)Fortran调用Cmain.f90sub.c链接方式gcc –o sub.o sub.cgfortran –o main.o main.f90 gfortran –o main.exe main.o sub.o 或是直接gfortran –o main.exe main.f90 sub.c 输出visual C++与FORTRAN混合编程(2010-04-22 14:15:25)转载标签:分类:科研visualcfortran混合编程原文:/143577510.html本文示例说明用C++编写的主程序调用采用FORTRAN语言编写的子程序的方法。
方法一:直接在Microsoft Developer Studio创建包含c语言和FORTRAN语言的工程。
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 中调用。
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混合编程实现方法
电
脑
学
习
第 ! 期
)*++ 与 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_与Fortran混合编程技术
11
研究与探讨
C++ 编程语言的调用 ABDS软件是在AutoCAD R14图形平台上开发实
2 C++ 语言和 Fortran 语言的差异
FORTRAN 语言发展之初就被认为是科学计算的 专用语言 C最初出现是用作UNIX操作系统的记述 语言 发展之初一直作为 较低级语言 编写与硬 件关系密切的底层软件 由于 UNIX 的成功和广泛 使用 C 语言开始流行起来 并成为一种普遍使用 的程序设计语言
研究与探讨
C++ 与 Fortran 混合编程技术
王红林 刘岩 边保林 梁晓 中国建筑科学研究院计算中心
摘要 本文简要介绍了采用 C++ 与 Fortran 混合编程技术 分析表明 ABDS 采用混合编程技术 极大地保
护了已有的分析资源 同时又充分享受到 C++ 带来的方便和快捷 关键词 混合编程 面向对象 调用协议
ABDS 软件中 采用 Fortran语言编写结构计算 分析程序 采用 C++编写交互输入界面和图形处理 以及辅助设计部分 本文重点介绍ABDS软件中C++ 与 Fortran 混合编程技术
1 C++ 语言和 Fortran 语言的发展
在程序设计语言的发展过程中 FORTRAN 语言 被认为是科学计算的专用语言 后来推出的 FOR- TRAN 90 和 FORTRAN 95 版本也不例外 它们虽然 可以完全实现 C++ 语言同样的功能 然而其软件开 发环境和软件的集成性等方面都远不如 C++ 语言 近年来 随着计算机软硬件技术的发展 数据结构 数据库管理技术 可视化与计算机图形学 用户接 口 系统集成以及人工智能等领域的成果被逐渐应 用到结构分析软件中 结构分析软件的设计并不仅 仅局限于单一的科学计算 需要涉及众多的软件开 发领域 C++ 语言可以提供这类软件开发所需的功 能 而用 FORTRAN 90 却很难实现 另一方面 从 软件的编程环境来看 目前 FORTRAN 90 的编译器 极少 而 C++ 语言的编译系统相当普及 可以运行 在各种机型上 便于实现跨平台的软件系统集成
C#与Fortran混合编程-本地调用Fortran动态链接库
C#与Fortran混合编程-本地调用Fortran动态链接库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文件夹,选择新建项。
添加一个新的Fortran文件然后便开始Fortran代码的编写工作。
这里我们主要实现两个方法:一个方法是求两个数相加之和,并返回结果。
另一个是输入一个数组,对这个数组进行排序,并找出最大值,最后返回排序后的结果,并返回最大值。
这里我们分别演示的是Fortran传出一个数和一个数组有何不同。
关于Fortran的基本语法不是本文的讨论范畴,请读者自行查阅资料。
下面给出的上述我们要实现的功能的具体Fortran代码:DOUBLE PRECISION FUNCTION ADD(A,B)!DEC$ ATTRIBUTES DLLEXPORT::ADD!DEC$ ATTRIBUTES STDCALL,ALIAS:'Add'::ADDDOUBLE PRECISION:: A,BADD=A+BENDFUNCTION SORTANDFINDMAX(ARRAY,LENGTH)!DEC$ ATTRIBUTES DLLEXPORT::SORTANDFINDMAX!DEC$ ATTRIBUTES STDCALL,ALIAS:'Sortandfindmax'::SORTANDFINDMAX DOUBLE PRECISION ::ARRAY(LENGTH)INTEGER::I,JDOUBLE PRECISION::SORTANDFINDMAX,TEMPSORTANDFINDMAX=ARRAY(1)DO I=1,LENGTH-1DO J=I+1,LENGTHIF(ARRAY(I).GT.ARRAY(J)) THENTEMP=ARRAY(I)ARRAY(I)=ARRAY(J)ARRAY(J)=TEMPSORTANDFINDMAX=ARRAY(J)END IFEND DOEND DOEND上面我们声明了两个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 系统平台上最强大的应用程序开发系统之一。
MATLAB 与C C + + 、FORTRAN语言混合编程
MATLAB 与C/ C + + 、FORTRAN语言混合编程摘要:对MATLAB 与C/ C + + 和FORTRAN 语言进行混合编程的常用方法进行了介绍,分析了其实现方式和各自的利弊,并用实例对MEX 文件实现方式进行了较详细的论述.关键词: MATLAB ; C/ C + + ; FORTRAN ; 混合编程中图分类号: TP313 文献标识码: A 文章编号:16722948X(2004) 0620547205 1 混合编程的意义及其实现方式1. 1 混合编程的意义MATLAB 语言具有功能强大、开发效率高等诸多优点, 已在工程实际中得到广泛应用, 但是与FORTRAN、C/ C + + 等语言相比,其执行效率较低,特别是当程序中含有大量循环语句(例如迭代计算)时,MATLAB 就有些力不从心, 速度很慢, 而运用FORTRAN 等擅长数值计算语言进行编程,其运行效率高. 一方面,如果放弃MATLAB 强大功能和数量众多的应用工具箱,无疑是资源的极大浪费. 另一方面,针对工程实际,人们用FORTRAN、C/ C + + 语言已编写了大量实用程序,如果将其重新改写成M 文件移植到MATLAB 环境中,不仅要花费大量的时间和精力,而且有时还降低了其运行效率. 可否将二者优势互补呢? 混合编程就是其有效的解决途径.1. 2 混合编程的实现正是考虑到上面这些原由,MATLAB 系统提供了其应用程序接口(Application Program Interface) 来解决这些问题. API 主要包括3 部分:MEX 文件———外部程序调用接口,用来在MATLAB 环境下调用FORTRAN、C/ C + + 语言编写的程序;MAT 文件应用程序———数据输入输出接口,用于MATLAB 系统与外部环境之间互传数据; 计算引擎函数库———MATLAB 处于后台作为一个计算引擎,与其它应用程序建立客户机/ 服务器关系,在其它应用程序中调用[1 ,2 ] .1. 2. 1 MEX 文件MEX 文件是按照一定格式,用FORTRAN 或C/C + + 语言编写的源程序,在MATLAB 下借助相应的编译器,生成的动态链接函数的统称. 在Windows操作系统下,是用MATLAB 附带的批处理mex. bat来编译生成文件后缀名为. dll (Dynamic Link Li2brary) 动态链接库文件,该文件可在MATLAB 环境下,像命令函数一样直接运行和调用,使用起来极为方便. 采取MEX 文件方式,是重复利用已有FOR2TRAN、C/ C + + 程序,让MATLAB 和FORTRAN、C/ C + + 语言优势互补的最有效和常用的方式,但不足的是其开发的程序只能在MATLAB 环境下运行.本文将详细的论述基于Windows 平台上其实现过程.1. 2. 2 MAT 文件应用程序MATLAB 数据存储的默认文件名后缀为. mat ,习惯上称该格式的文件为MAT 文件, MAT 文件应用程序提供了一种方法让MATLAB 与其它软件进行数据输入输出.1. 2. 3 MATLAB 计算引擎MATLAB 引擎采用客户机/ 服务器的计算模式,通过对Activex 技术的支持,实现VC 应用程序(客户机) 与MATLAB(服务器) 的动态连接通信. 假如用户想以较短的时间开发前台为VC + + 产生的用户界面,后台由MATLAB 计算分析的应用程序, 使用MATLAB 引擎是很好的选择. 在实际应用中,MAT2 LAB 作为ActiveX 的自动化服务器,接收通过引擎传来的数据和指令信息并进行相应的处理,然后将结果经过引擎返回给发送请求的客户机. 但这种方式需要MATLAB 在后台的适时运行, 如果用户没有安装MATLAB ,应用程序就无法正常运行,而且应用程序与MATLAB 间通过字符流传递数据和命令参数,整个算法在MATLAB 中执行,从而降低了程序的执行效率,因而其实际应用不多.1. 2. 4 MCC 和MATCOM前面提到的几种方式都是以MATLAB 为主,程序的运行都离不MATLAB 环境. 除此之外,另一种方式就是将MATLAB 语言程序翻译成C/ C + + 语言代码,再用C/ C + + 语言的方式进行开发. MAT2 LAB 自己提供了C 语言翻译程序mcc , 另一种是原第3 方公司MathTools 开发的MATCOM. 后者出现较早,功能远比MATLAB 自己的翻译程序强大,所以MathTools 公司已经被MathWorks 公司收购,并已将其开发技术融于新推出的MATLAB 6. 0 (Re2 lease 12) 中. 但二者都不完善,有大量的MATLAB函数及数据类型是不能兼容变换的,所以有时会发现将简洁的MATLAB 程序翻译成C 语言程序很晦涩.翻译后的C 程序几乎不适合手动去维护,更谈不上升级了[3 ] .2 C/ C + + 语言MEX文件的实现C/ C + + 语言MEX 文件的实现包括,源程序的编辑、MEX 编译和调试. 在编译和调试前要进行编译器的配置.2. 1 C/ C+ + 语言MEX文件的编写C/ C + + 语言MEX 文件的编写格式,除了要遵循C/ C + + 语言语法外,还须要加入用于MATLAB和C/ C + + 语言通信协议———入口子程序. 我们首先看一个极简单的C 语言MEX 文件,该程序的作用是两个数求和,源程序如下:/ / 示例程序myplus. c :求两个Double 数之和# include ”mex. h”/ 3 计算功能子程序3 /void myplus (double y[ ] ,double x[ ] ,double z[ ]) {y[0 ] = x[0 ] + z[0 ] ;}/ 3 以下是入口子程序3 /void mexFunction(int nlhs ,mxArray 3 plhs[ ] ,int nrhs ,const mxArray 3 prhs[ ]){double 3 x , 3 y , 3 z ;int mrows0 ,ncols0 ;int mrows1 ,ncols1 ;/ 3 检查输入输出变量个数3 /if (nrhs ! = 2)mexErrMsgTxt (”Two input s arquired”) ;elseif ( nlhs > 1) mexErrMsgTxt ( ”Too many output argument s”) ;/ 3 输入量必须是两个非复数double 类型3 /mrows0 = mxGetM(prhs[0 ]) ;ncols0 = mxGetN(prhs[0 ]) ;if ( ! mxIsDouble (prhs [ 0 ]) | | mxIsComplex (prhs [0 ]) | | ! (mrows0 = = 1 & &ncols0 = = 1) ) mexErrMsgTxt ( ”Input s must be all noncomplex scalar double. ”) ;mrows1 = mxGetM(prhs[1 ]) ;ncols1 = mxGetN(prhs[1 ]) ;if ( ! mxIsDouble (prhs [ 1 ]) | | mxIsComplex (prhs [1 ]) | | ! (mrows1 = = 1 & &ncols1 = = 1) ) mexErrMsgTxt ( ”Input s must be all noncomplex scalar double. ”) ;if (mrows0 ! = mrows1| | ncols0 ! = ncols1) mexErrMsgTxt ( ”Input s must be same dimen2sion. ”) ;/ 3 为返回参数创建矩阵3 /plhs [ 0 ] = mxCreateDoubleMat rix ( mrows0 ,ncols0 ,mxREAL) ;x = mxGet Pr (prhs[0 ]) ;z = mxGet Pr (prhs[1 ]) ;548 三峡大学学报(自然科学版) 2004 年12 月y = mxGet Pr (plhs[0 ]) ;/ 3 调用计算功能子程序myplus () 3 /myplus (y ,x ,z) ;}上面程序为一典型的C 语言MEX 文件,程序由两部分构成:一个计算功能子程序(myplus () 函数) 和一个入口子程序(mexFunction () 函数) . 顾名思义,计算功能子程序包含所有实际所需完成的功能、算法,我们已有的或现编的C/ C + + 、FORTRAN 程序就被当做计算功能子程序使用,它由入口子程序调用. 入口子程序是MATLAB 系统和外部程序之间沟通的桥梁,主要用来完成两者之间的通信. 上面示例程序中,mexFunction () 函数有大量语句是用于检查变量的数据类型等辅助性工作,这是必要的,因为MAT2LAB 语言不像C/ C + + 等语言变量使用前须声明,对类型的检查可以避免许多错误的发生.下面简要的说明一下上面程序中用到的MAT2LAB API 函数,它们在mex. h 或mat rix. h 中声明. mexFunction () ,入口子程序函数,其格式如下:void mexFunction(int nlhs ,mxArray 3 plhs[ ] ,intnrhs ,const mxArray 3 prhs[ ]){⋯⋯/ / 一些必要的代码,用来完成MATLAB 系统与计算功能子程序之间的通信}其参数的含意为:nrhs 和nlhs ,整型变量,分别为调用MEX 文件时输入、输出参数的个数. prhs、plhs ,指针数组,其元素分别为指向输入、输出参数的指针. mexErrMsgTxt () ,用于输出错误信息,并返回到MATLAB 命令提示符下.mxGetM() 和mxGetN ( ) ,获得矩阵的行数和列数,参数为指向矩阵的指针,如程序中的mrows0 =mxGetM(prhs[0 ]) 的作用为:得到第一个输入实参的行数,并赋值给整型变量mrows0.mxIsDouble () 、mxIsComplex () ,判断矩阵是否为双精度型、复数型. 输入参数为矩阵指针,返回值为BOOL 值.mxCreateDoubleMat rix(int m ,int n ,mxComplex2ity complexFlag) ,创建一个未赋值的双精度矩阵,m ,n 为创建矩阵的行、列数,complexFlag 为标识是实数还是复数. 该函数返回所创建矩阵的指针.mxGet Pr () 获得矩阵实数部分的指针,输入参数为矩阵的指针,返回值为矩阵实数部分的双精度指针.MATLAB API 函数还包含其它许多接口函数,分为mx2函数和mex2函数,详细情况可查阅相关文献.MEX 源程序编写完成后,还要经过编译后才能生成dll 文件,供MATLAB 或其它程序调用,编译前要对MATLAB 进行编译器的配置.2. 2 编译器的配置编译器的配置是通过MATLAB 的配置文件(mexopt s. bat ) 进行的,其具体过程为: 在MATLAB 命令窗口下键入:mex2steup ,随后系统弹出一个DOS 窗口,按照提示一步步选择完成即可. 该命令可带许多参数,可针对不同的操作系统进行多种配置[2 ,3 ] . 2. 3 C/ C+ + 语言MEX文件的编译编译方法很简单,直接在MATLAB 命令提示符下键入:mex filename ,其中filename 为需编译的源程序名. 如果提示有错误信息,需查错,修改源程序、调试. 直到没有错误信息提示. 编译通过生成的可执行的dll 文件,可在MATLAB 命令提示符下或其它程序中调用.3 FORTRAN语言MEX文件的实现FORTRAN 语言MEX 文件的实现步骤和C/ C+ + 语言MEX 文件大体相同.3. 1 FORTRAN 语言MEX 文件的编写MATLAB 提供了C/ C + + 和FORTRAN 两种语言的接口,基于FORTRAN 语言和前面讲到的基于C/ C + + 语言的MEX 文件在实现方式上相差不大. 我们先还是看一下前面程序用FORTRAN 语言MEX 文件来实现的源程序.! 示例程序myplus. f :求两个数之和! 计算功能子程序subroutine myplus (y ,x ,z)! 变量声明real 3 8 x ,y ,zy = x + zreturnend! 以下是入口子程序subroutine mexFunction(nlhs ,plhs ,nrhs ,prhs) ! 参数声明integer nlhs ,nrhs ,plhs ( 3 ) ,prhs ( 3 )! 调用API 库函数的声明integer mxGet Pr ,mxCreateFullinteger mxGetM ,mxGetN ,mxIsNumeric! 程序内部使用变量的声明第26 卷第6 期陈建平等MATLAB 与C/ C + + 、FORTRAN 语言混合编程549 integer xpr ,ypr ,zprinteger mrows ,ncols ,sizereal 3 8 x ,y ,z! 检查输入输出变量个数if (nrhs. ne. 2) thencall mexErrMsgTxt (’Two input s arquired’)elseif (nlhs. gt . 1) thencall mexErrMsgTxt ( ’Too many output argu2ment s’)endif! 输入量必须是两个数mrows = mxGetM(prhs (1) )ncols = mxGetN(prhs (1) )size = mrows 3 ncolsif (mxIsNumeric (prhs (1) ) . eq. 0) thencall mexErrMsgTxt (’Input s must be a number’)endifmrows = mxGetM(prhs (2) )ncols = mxGetN(prhs (2) )size = mrows 3 ncolsif (mxIsNumeric (prhs (2) ) . eq. 0) thencall mexErrMsgTxt (’Input s must be a number’)endif! 为输出参数创建矩阵plhs (1) = mxCreateFull (mrows ,ncols ,0)xpr = mxGet Pr (prhs (1) )zpr = mxGet Pr (prhs (2) )ypr = mxGet Pr (plhs (1) )! 将数据指针转换成双精度型call mxCopyPt r ToReal8 (xpr ,x ,size)call mxCopyPt r ToReal8 (zpr ,z ,size)! 调用计算功能子程序mypluscall myplus (y ,x ,z)! 将计算结果传给输出数据指针call mxCopyReal8ToPt r (y ,ypr ,size)returnend该程序的结构和内容与前面myplus. c 大致相同,也是由两部分:一个计算功能子例行程序和一个入口子例行程序构成,其程序中参数和变量大多相同,这里就不一一再介绍了. 但值得一提的是, FOR2TRAN 和C/ C + + 语言语法规则相差较大,在C/ C ++ 语言中对字符大小写是敏感的,而FORTRAN 语言中大小写是一样的;C/ C + + 语言中数组是按行存储,数组下标是从0 开始计数的,而FORTRAN 语言中数组是按列存储,数组下标从1 开始. C/ C + + 语言几乎支持所有的数据类型,支持头文件,操作很灵活. 而FORTRAN 语言,不支持指针,参数传输较麻烦[1 ] .3. 2 FORTRAN语言MEX文件的编译和C/ C + + 语言MEX 文件一样,编译前需进行编译器的配置,方法同前,只是选的编译器不同(例如Compaq Visual Fort ran version 6. 6) . 编译的过程也一样,MATLAB6 的编译命令(不再区分C/ C + + 文件用cmex. bat ,FORTRAN 用fmex. bat) 统一使用mex.bat 批处理命令,其后的文件名须带扩展名.4 Visual Studio IDE 下MEX文件的建立和调试4. 1 Visual Studio 的配置前面使用的mex 文件的使用方式,类似在DOS下程序开发方式,程序编辑、编译、调试和执行分开,每次只能创建一个文件,需要来回切换MATLAB 命令窗口和编辑窗口,操作较麻烦. VC 是在Windows环境下的优秀开发平台,将MATLAB 和VC 强强联手,无疑是非常好的混合编程方式. 下面就简要介绍一下如何在VC 的IDE( Integrated Development Envi2 ronment) 中编译MEX 程序. 为了表述的方便,我们以MATLAB6. 5 (安装在C: \ matlab6p5) 和Visual C ++ 6. 0 (安装在D : \ Program Files \ Microsoft Visual Studio) 为例,可以分为以下5 步[4 ,5 ] :①用VC 创建一个工程(假定名称为myproject) ,类型选择Win32 Dynamic - link Library ,并将自己的MEX源程序和mexversion. rc (在C: \ MATLAB6p5\ extern \ include 下) 加入到工程.②创建一个与工程同名的定义文件(myproject .def) ,内容如下:L IBRARY myproject . dllEXPORTS mexFunction(如果是FORTRAN 该行改为EXPORTS -MEXFUNCTION @16 )并加入定义文件myproject . def 到工程③定位库文件( . lib) 位置. 具体操作为:选择VC下拉菜单Tools/ Options ⋯,在弹出的对话框Show di2rectories for 下拉框中选择Library files ,在下部的Di2 rectories : 中添加C: \ MATLAB6p5 \ extern \ lib \win32 \ microsoft \ msvc60 目录. 然后选择VC 下拉菜单Project/ Settings ⋯, 在弹出的对话框中选择550 三峡大学学报(自然科学版) 2004 年12 月Link 选项卡,在Category 栏中选择general 选项,在出现的Object/ library modules : 框中填入libmx. lib , libmex. lib , and libmat . lib.④加入MATLAB include 目录. 具体操作为:选择VC 下拉菜单Tools/ Options ⋯,在弹出的对话框Show directories for 下拉框中选择Include files ,在下部的Directories : 中添加C: \ MATLAB6p5 \ extern\ include 目录. 然后选择VC 下拉菜单Project/ Set2tings ⋯, 在弹出的对话框中选择C/ C + + 选项卡,在Category 栏中选择Preprocessor 选项,在出现的Pre2 processor definitions : 框中填入MATLAB-MEXFILE.⑤最后就是调试运行配置. 具体操作为:选择VC下拉菜单Project/ Settings ⋯,在弹出的对话框选择Debug 选项卡,在Category 栏中选择General 选项,在出现的Executable for debug session :框中填入C: \ MATLAB6p5 \ bin \ win32 \ matlab. exe.4. 2 在Visual Studio 中使用MATLAB add - inMATLAB6. X为Visual Studio IDE 提供了add -in ,该add - in 使MATLAB 的M - files 非常容易的就可加入到VC 环境中,使VC 和MATLAB 很好的融合. 不过要使用该插件需要简单的配置. 具体操作如下:使用前面提到的mex - steup 命令进行编译器的配置, 选择VC 作为编译器后, 该命令自动装载MATLAB add - in. 然后选择VC 下拉菜单Tools/Customize ⋯, 在弹出的对话框中勾选MATLAB add- in 复选框. 随后VC 就出现了如图1 所示的工具条,其中第一个按钮的功能就是用来将M - files 添加到Visual Studio IDE 中的.图1 图标示例5 结语本文对MATLAB 与C/ C + + 和FORTRAN 语言进行混合编程的常用4 种方法进行了论述. 4 种方法各有其优势,又各有不足. 其中MEX 文件的方式,特别是Visual Studio IDE 下混合编程,将MATLAB和Visual Studio 开发系统相接合,以其功能强大、操作便利和利于升级维护,具有广泛的使用价值.参考文献:[1 ] 刘志俭. MATLAB 应用程序接口用户指南[M] . 北京:科学技术出版社,2000.[2 ] 飞思科技产品研发中心. MATLAB6. 5 应用程序接口编程[M] . 北京:电子工业出版社,2003.[3 ] 薛定宇. 科学运算语言MATLAB5. 3 程序设计与应用[M] . 北京:清华大学出版社,2000.[4 ] 王振义. MATLAB 和Visual C + + 的混合编程[J ] . 雁北师范学院学报,2002 ,18 (2) :26~29.[5 ] 马海阳,王艳华,孙道恒. MATLAB 的VC 编程接口浅析[J ] . 信息技术,2003 ,27 (3) :55~57.[责任编辑张莉]第26 卷第6 期陈建平等MATLAB 与C/ C + + 、FORTRAN 语言混合编程551__。
(完整版)Fortran混合编程
Extern “C”Void _ stacall s1(float a, float b,float * c);
参数传递协议(二)
——参数数目
C++可以定义参数可选的函数,对于这种情况
Fortran如何处理呢?
extern “C” float func(float x,float a=0,float b=0)
参数传递协议(一)
——参数传递方式
区别是什么呢……
参数传递方式由Attributes属性指定,两种方式: 方式一、c,stdcall选项: Subroutine s1(a,b,c)
!DEC$ attributes C :: s1 Real(4) a, b,c
End subroutine C、stdcall声明过程遵循Windows标准参数传递方 式,就是C语言参数传递模式
选项C的作用,在后面堆栈管理约定时详细介绍。
参数传递协议(三)
——数据类型
Fortran和C/C++对应的数据类型
Fortran Integer(2) Integer(4)
Real(4) Real(8)
C/C++ short Int,long float double
命名约定
名称约定包括变量名称、例程名称、模块名称 (fortran)等。
主程序: Program a1 Write(*,*) func(1.0,3.0)
end
参数传递协议
——参数数目 结论: 如果Fortran需要调用带有可选参数的C++函数,
须在fortran程序中用c,Varying对例程进行声明。
!dec$ attributes c,varying :: 例程名
基于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语言接口参数传递混合编程
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和fortran混编(基于GNULinux)
c和fortran混编(基于GNU/Linux)2011-08-26 12:02:01| 分类:系统配置 | 标签: |字号大中小订阅/blog/static/41789395200972931110461/c和fortran混编(基于GNU/Linux) (转载于csdn,方便自己查阅)2009-08-29 15:11:10| 分类:默认分类|字号订阅转下来是自己用这个方法编译成功,推荐下。
注意如果gcc版本>=4.0,则将链接时则将-lfrtbegin -lg2c改为-lgfortran -lgfortranbegin。
其实这方面的资料网上很多,我只是总结一下说说自己的理解(因为昨天看到有个xd问到这个)。
先声明一下,我对fortran是一窍不通,只是看了看网上的程序推敲了下面几个的最简单的fortran源码。
网上说要分c为主程序和fortran为主程序两种情况讨论,其实我觉得不用,只要你了解生成可执行文件的机制。
这个机制就是:不论是单一语言模块之间的链接还是不同语言之间的混合链接,本质目的都是要链接器能找到定义于其他模块中的符号,如果全部找到,则链接成功,生成可执行的二进制文件。
下面的内容比较基础,看烦了就跳过。
比如简单的一个c程序:/* main.c */void FOO (); /* 其实按c语言的规定,调用程序之前不需声明,* c编译器会猜测函数的原型。
需要在调用之前* 定义或者声明那是c++的风格*/int main (){FOO ();return 0;}/* foo.c */#include <stdio.h>void FOO (){printf (“hello world\n”);}这两个文件都可以编译通过gcc -c main.cgcc -c foo.c这里gcc只用来编译并不链接,因为单独链接其中一个文件都是不完整的。
必须将两个目标文件(上面会生成main.o和foo.o)链接在一起。
VC与Fortran混合语言编程
VC与Fortran混合语言编程
肖晓玲;卢正鼎;张翔
【期刊名称】《石油天然气学报》
【年(卷),期】2000(022)002
【摘要】VC与Fortran混合语言编程时,按调用方式与实现的不同,调用约定主要
采用C与STDCALL属性的调用约定.命名约定一般使符号名表现为纯大写的名称、纯小写的名称或混合书写形式名称.不同语言之间参数数据的传递主要通过:①调用
变量参数列表;②数据、过程模块结构;③将变量声明为公用、外部和全局类型这3
种方式来实现.采用VC与Fortran混合语言编程设计了大地电磁测深一维交互式
解释系统.
【总页数】4页(P71-74)
【作者】肖晓玲;卢正鼎;张翔
【作者单位】华中理工大学计算机科学与技术学院,湖北,武汉,430074;华中理工大
学计算机科学与技术学院,湖北,武汉,430074;江汉石油学院地球物理勘探系,湖北,荆州,434102
【正文语种】中文
【中图分类】TP311.11
【相关文献】
1.有限元软件中的VC++和FORTRAN混合语言编程 [J], 马书尧;郭占科
2.VC++6.O与Fortran PowerStation 4.0混合语言编程 [J], 黄芝平;戴路;杨波
3.NDP FORTRAN语言与NDPC语言混合编程的方法 [J], 袁斌
4.基于VC与Fortran混合编程的超大型冷却塔热力计算软件编程 [J], 王琦
5.C++语言和Fortran90语言混合编程 [J], 向文国;王泽明
因版权原因,仅展示原文概要,查看原文内容请购买。
FORTRAN和C混合编程
FORTRAN和C混合编程
崔培莲;王喜喜
【期刊名称】《微型机与应用》
【年(卷),期】1993(000)010
【摘要】在进行FORTRAN和C语言混合编程中的经验,并给出它们之间进行参数传递的编程实例。
【总页数】3页(P31-33)
【作者】崔培莲;王喜喜
【作者单位】不详;不详
【正文语种】中文
【中图分类】TP312
【相关文献】
1.C#与 Fortran 混合编程在剪切波速测试中的应用 [J], 李进;曲淑英
2.基于VB与Fortran混合编程的重力坝优化设计软件开发 [J], 杨立凡;严铭姣;马泽宇;杨旸;黄海燕
3.Fortran与Tcl混合编程以及VTk图形可视化的研究 [J], 王江超;赵宏权
4.Fortran与的混合编程 [J], 胡文清;詹杰民
5.基于FORTRAN与DELPHI混合编程的型材库设计 [J], 宋喜庆;孙牧;高翔宇;刘瀛昊;张韩西子
因版权原因,仅展示原文概要,查看原文内容请购买。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
约定,C被调用的函数名nAme在其obj文件中保持混合大小写,以
_nAme@n的形式出现在obj文件中。Fortran的接口块用如下!MS$ ATTRIBUTES编译伪指令说明: :
!MS$ ATTRIBUTES STDCALL, ALIAS:'_nAme@n':: NAME
对应的C语言源程序中,用如下语句说明函数Sum使用_stdcall约 定且用于文件外部: extern int _stdcall Sum(int *p1, int *p2);
一.Fortran调用C语言函数 参数的调用约定
Fortran缺省参数传递为引用传递,若在外部例程中施加 了C或STDCALL调用约定,则缺省的引用传递改为值传递 (数组参数除外)。为了消除调用约定对参数传递的影 响,可以在外部例程中添加具体的参数传递属性( REFERENCE 或VALUE)声明。
第一节
二.Fortran和C的混合编程方式 分别编译、独立运行
概述
将Fortran和C各自要实现的功能模块源代码在各自的开发平台上编译连接成 可执行文件并独立执行,二者的数据通过数据文件交换。这种模式的实现最 为简单,容易掌握,但执行效率较低;
函数级调用
二.C 调用Fortran语言例程
* 对 于 C 语 言 , 要 在 源 程 序 中 对 所 调 用 的 Fortran 例 程 使 用 extern关键字说明该例程来自外部,extern和函数说明中间加 上_cdecl或_stdcall说明调用约定的属性。 * 如果Fortran例程使用缺省方式的调用约定(即不加任何说明 ),它被C调用的函数/例程名在其obj文件中全转化为大写。此 时C在声明所调用的Fortran外部例程原型时,无论采用何种调 用约定,例程名必须大写。
或_stdcall说明调用约定的属性。
第二节 Fortran与C的函数级调用
Fortran调用C的函数时,C的形参必须使用与Fortran实参同 类型的指针变量,必须使用extern。
! Fortran的接口块 INTERFACE FUNCTION SUM(I, J) !MS$ATTRIBUTES C, ALIAS:'_Sum':: SUM !调用C语言的Sum函数 !MS$ATTRIBUTES REFERENCE::I, J INTEGER I, J, SUM END FUNCTION END INTERFACE /* C源程序*/ extern int _cdecl Sum(int *, int *) { … }
第二节 Fortran与C的函数级调用
C调用Fortran例程时,C的实参必须传递与Fortran形参同类 型变量的地址 ,必须用extern
! Fortran的例程 SUBROUTINE SUM(I, J) INTEGER I, J … END FUNCTION /* C源程序*/ extern int _cdecl SUM(int *, int *); int main() { int a, b; … SUM(&a, &b); … }
若某形参为值传递,此时使用VALUE 关键字: !MS$ ATTRIBUTES VALUE :: a !将a定义为值传递方式 若某形参为引用传递,此时可使用REFERENCE关键字(缺 省方式): !MS$ ATTRIBUTES REFERENCE :: a !将a定义为引用传递 方式
一.Fortran调用C语言函数
例程调用约定
如果C采用_cdecl方式的调用约定,它对应于Fortran的C约定,C
被调用的函数名nAme在其obj文件中保持混合大小写,_nAme的形
式出现在obj文件中。Fortran的接口块中必须用如下!MS$ ATTRIBUTES编译伪指令说明: !MS$ ATTRIBUTES C, ALIAS:'_nAme':: NAME 对应的C语言源程序中,用如下语句说明函数Sum使用_cdecl属性 且用于文件外部:
第二节 Fortran与C的函数级调用
表 11-1 Fortran 和 C 语言的调用约定(x86 系统) 语言 调用约定 缺省 Fortran C STDCALL _cdecl (缺省) C _stdcall nAme _nAme@n 注: n 代表所有形参的字节数之和,以十进制表示。 例程名 nAme nAme nAme nAme obj 文件中的例程名 转化为 大小写 _NAME@n _name _name@n _nAme 全部大写 全部小写 全部小写 混合大小写 混合大小写 对应的调用约定
概述
C signed char short int int long int float double 无对应类型,可定义结构 struct complex {float r, i; } char char x[n] char short int long int
表 11-1 Fortran 和 C 调用例程的等价形式 有返回值调用 Fortran C 函数(FUNCTION) 函数(function) 无返回值调用 子例程(SUBROUTINE) 空函数(void function)
Fortran和C分别编译各自的功能模块源代码,得到各自的目标文件(.obj), 然后集成链接这些obj 文件生成一个统一的可执行文件,实现对对方函数的 调用,数据交换通过约定接口来实现。这种方法的缺陷是被调用模块一旦被 修改,整个软件必须重新进行编译连接。软件的可维护性较差;
动态链接库方式
将需要被调用的功能模块源代码编译连接成动态连接库,然后通过约定的接口动态使 用另外的语言调用该功能模块。这是目前普遍采用的一种方式,动态连接库(DLL) 可以包含可执行代码、数据和各种资源,对其修改无需重新编译主调程序,具有较好 的移植性和复用性 。
_stdcall /
_cdecl _stdcall C STDCALL
第二节 Fortran与C的函数级调用
对于Fortran,可在接口块的例程说明或例程头部加入!MS$ ATTRIBUTES编译伪指令告知编译器有关调用约定。其中, !MS$与!DEC$等同。 对于C语言,要在函数说明前面加上extern关键字说明函数 来自外部或供外部使用,extern和函数说明中间加上_cdecl
例11-1 FORTRAN调用C的空函数
! FORTRAN 源文件:ForMain.f90 PROGRAM C4For1 INTERFACE ! Fortran90与C的接口 SUBROUTINE SUM(I, J, k) !无返回值函数相当于fortran的subroutine子程 !MS$ ATTRIBUTES C, ALIAS: '_sum':: SUM ! 命名约定 !MS$ ATTRIBUTES VALUE::I ! 形参I使用值传递方式 !MS$ ATTRIBUTES REFERENCE:: J, K ! 形参J、k使用引用传递方式 INTEGER I, J, K END SUBROUTINE END INTERFACE INTEGER I, J, K I=1; J=2 WRITE(*, '(2(A, I2))') 'I=', I,', J=', J CALL SUM(I, J, K) WRITE(*, '(A, I2)') 'The sum of I and J is ', K END /* C 源文件:function.c */ #include <stdio.h> extern void _cdecl sum(int p1, int *p2, int *p3) /* 调用C++程序时用 extern "C" */ { *p3 = p1 + *p2; }
extern double _cdecl DIS_FUNCTION(double *); 或 extern double _stdcall DIS_FUNCTION(double *); /* 命名必须大写 */ /* 命名必须大写 */
例11-3 C调用Fortranቤተ መጻሕፍቲ ባይዱ程,Fortran使用缺省的调用约定
例11-2 FORTRAN调用C的有值函数
! FORTRAN 源文件:ForMain.f90 PROGRAM C4For2 INTERFACE ! Fortran90与C的接口 FUNCTION SUM(I,J) !有返回值函数相当于fortran的function函数 !MS$ ATTRIBUTES STDCALL, ALIAS:'_sum':: SUM !MS$ ATTRIBUTES VALUE:: I !MS$ ATTRIBUTES REFERENCE:: J INTEGER I, J, SUM END FUNCTION END INTERFACE INTEGER I, J I=1; J=2 WRITE(*,'(2(A, I2))') 'I=', I, ', J=', J WRITE(*,'(A, I2)') 'The sum of I and J is ', SUM(I, J) END /* C 源文件:function.c */ #include <stdio.h> extern int _stdcall sum(int p1, int *p2) { return p1 + *p2; }
extern int Sum(int *p1, int *p2);
或者 extern int _cdecl Sum(int *p1, int *p2);
一.Fortran调用C语言函数
例程的调用约定