第11章 Fortran和C的混合语言编程-授课版


约定,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语言函数
例程的调用约定
合集下载

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的混合编程PPT教学课件

汇编语言与C的混合编程PPT教学课件
• 第1个寄存器列表中的寄存器用于存放输入的参数。 • 第2个寄存器列表中的寄存器用于存放返回的结果。 • 第3个寄存器列表中的寄存器的内容可能被所调用
的子程序破坏,即这些寄存器是供所调用的子程 序作为工作寄存器的。
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混合编程

命名约定(续)

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

混合编程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++ 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语言接口参数传递混合编程

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混合编程技术

调用已经存在的源代码 历年的科学研究中 我们积累了大量成熟的 FORTRAN 程序 如现阶段结 构分析程序大都是用 FORTRAN 语言编写的 为了有 效地利用现有的资源 可把原有的源代码编译成动 态链接库 DLL Dynamic Link Library 以便于
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函数,一个是计算两个数相加,一个是选择排序并找出最大值。

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