C与Fortran混合编程-本地调用Fortran动态链接库.docx

C与Fortran混合编程-本地调用Fortran动态链接库.docx

ID:59256020

大小:482.39 KB

页数:16页

时间:2020-09-08

C与Fortran混合编程-本地调用Fortran动态链接库.docx_第1页
C与Fortran混合编程-本地调用Fortran动态链接库.docx_第2页
C与Fortran混合编程-本地调用Fortran动态链接库.docx_第3页
C与Fortran混合编程-本地调用Fortran动态链接库.docx_第4页
C与Fortran混合编程-本地调用Fortran动态链接库.docx_第5页
资源描述:

《C与Fortran混合编程-本地调用Fortran动态链接库.docx》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、C#与Fortran混合编程-本地调用Fortran动态链接库Fortran是一门古老的语言,它是世界上最早出现的计算机高级程序设计语言,广泛应用于科学和工程计算领域。FORTRAN语言以其特有的功能在数值、科学和工程计算领域发挥着重要作用。然而Fortran程序本身不适合开发独立的应用程序,例如我们传统的桌面应用或者Web应用。因此这里我们便想将C#与Fortran结合,C#借助Fortran可以实现精度更高,计算更快的程序,而Fortran通过C#,便也能够达到可视化设计。 一、基本思路运用Fortran,编写动态链接库(DLL),在DLL中提供计算的函数接口,然后在C#中调用该DLL中

2、计算部分的函数,实现计算过程。这里需要注意的是,由于我们使用的是Fortran编译器,生成的DLL属于第三方非托管DLL,因此无法直接在程序中添加DLL的引用。具体的做法将在后续部分说明。 二、编写Fortran程序,生成动态链接库文件知道思路之后便开始正式的Coding。首先新建一个空的FortranDynamic-linkLibrary项目。在Intel(R)VisualFortran点击Library,选中右图的Dynamic-linkLibrary.然后点击OK.这时的项目如下所示:点击SourcesFile文件夹,选择新建项。添加一个新的Fortran文件然后便开始Fortran代

3、码的编写工作。这里我们主要实现两个方法:一个方法是求两个数相加之和,并返回结果。另一个是输入一个数组,对这个数组进行排序,并找出最大值,最后返回排序后的结果,并返回最大值。这里我们分别演示的是Fortran传出一个数和一个数组有何不同。关于Fortran的基本语法不是本文的讨论范畴,请读者自行查阅资料。下面给出的上述我们要实现的功能的具体Fortran代码:DOUBLEPRECISIONFUNCTIONADD(A,B)!DEC$ATTRIBUTESDLLEXPORT::ADD!DEC$ATTRIBUTESSTDCALL,ALIAS:'Add'::ADDDOUBLEPRECISION::A,B

4、ADD=A+BENDFUNCTIONSORTANDFINDMAX(ARRAY,LENGTH)!DEC$ATTRIBUTESDLLEXPORT::SORTANDFINDMAX!DEC$ATTRIBUTESSTDCALL,ALIAS:'Sortandfindmax'::SORTANDFINDMAXDOUBLEPRECISION::ARRAY(LENGTH)INTEGER::I,JDOUBLEPRECISION::SORTANDFINDMAX,TEMPSORTANDFINDMAX=ARRAY(1)DOI=1,LENGTH-1DOJ=I+1,LENGTHIF(ARRAY(I).GT.ARRAY(J)

5、)THENTEMP=ARRAY(I)ARRAY(I)=ARRAY(J)ARRAY(J)=TEMPSORTANDFINDMAX=ARRAY(J)ENDIFENDDOENDDOEND上面我们声明了两个Fortran函数,一个是计算两个数相加,一个是选择排序并找出最大值。之后我们点击VisualStudio的BuildSolution.开始编译成DLL。关于代码段解释:!DEC$ATTRIBUTESDLLEXPORT::ADD!DEC$ATTRIBUTESSTDCALL,ALIAS:'Add'::ADD这两句代码很关键。下面通过三个一致来简单的说一下以上代码段的意思和C#调用需要注意的问题。1.函

6、数名一致:在Fortran编译器中默认的导出函数名全部是大写形式。而在C#中调用FortranDll时必须指定函数名一致。在Fortran方面解决的办法是:使用ALIAS(别名)属性指定导出函数名。例如对于下面的Fortran函数:DOUBLEPRECISIONFUNCTIONADD(A,B)!DEC$ATTRIBUTESDLLEXPORT::ADDDOUBLEPRECISIONA,BADD=A+BEND对应的C#声明为:[DllImport("MathDll")]privatestaticexterndoubleADD(doubleA,doubleB);使用ALIAS修改后的定义如下:Do

7、ublePrecisionFunctionADD(A,B)!DEC$ATTRIBUTESDLLEXPORT::ADD!DEC$ATTRIBUTESALIAS:'Add'::AddDoublePrecisionA,BAdd=A+BEnd对应的C#声明为:[DllImport("MathDll")]privatestaticexterndoubleAdd(doubleA,doubleB);而在C#中提供的解决方案

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。