c语言调用fortran dll,【混合编程实例】C/C++调用FORTRAN编写的DLL

这篇博客介绍了如何使用FORTRAN编写函数并编译成DLL,然后在C语言程序中调用这些函数。作者提供了两种调用方式,分别是显式调用(通过LoadLibrary和GetProcAddress)和动态库调用,并给出了相应的代码示例。文章强调了FORTRAN函数在DLL中的导出和C语言中的使用方法,适合对跨语言调用感兴趣的读者。
摘要由CSDN通过智能技术生成

之前都是用C/C++写好一些公用函数并将其包装在DLL中以供某应用模块调用,这

方面的教程在网络上一搜一大堆,以后再抽空在这里用实例简单地讲述一下。这次

是用FORTRAN写好几个函数然后编译成DLL,然后在C语言程序中使用。

1、首先是编写一段代码,这里给出一个例子

! forsubs.f90

! FUNCTIONS/SUBROUTINES exported from forsubs.dll:

! forsubs - subroutine

INTEGER*4 FUNCTION Fact (n)

!DEC$ ATTRIBUTES DLLEXPORT::Fact

INTEGER*4 n [VALUE]

INTEGER*4 i, amt

amt = 1

DO i = 1, n

amt = amt * i

END DO

Fact = amt

WRITE(*,*) "Call Fortran Sub...OK"

END! Function Fact

SUBROUTINE Pythagoras (a, b, c)

!DEC$ ATTRIBUTES DLLEXPORT::Pythagoras

REAL*4 a [VALUE]

REAL*4 b [VALUE]

REAL*4 c [REFERENCE]

c = SQRT (a * a + b * b)

END! SUBROUTINE Pythagoras

! EOF

以上!DEC$打头的两行,如第一个,其另一形式如下

!MS$IF .NOT. DEFINED(LINKDIRECT)

!MS$ATTRIBUTES DLLEXPORT::FACT

!MS$ENDIF

可分别替换之,而余下代码都是一样的。

2、如果你用的是诸如Intel Visual Fortran这样的IDE,那么

可以这样建立DLL框架([文件(File)]->[新建(New)]):

0818b9ca8b590ca3270a3433284dd417.png

按一般习惯通常是先建立一个工程然后添加(新建)源文件并编辑代码,但我们也

可以先写好代码并保存到文件forsubs.f90然后将其添加到DLL工程forsubs中,

然后编译链接得到forsubs.dll

3、调用

调用方式至少有3种,我一般是用后两种:

(1)显式,即使用前先LoadLibrary使用后FreeLibrary,比较麻烦,用的少

(2)静态lib,建立静态工程并将上述函数导出到*.lib文件然后添加到需要应用它的工程中

(3)动态lib,这个是我的偏爱

以下分别提供(1)和(3)的示例。

方式(1)的一个实例如下

#ifndef _MBCS

#define _MBCS

#endif

#include

#include

using namespace std;

typedef int (__stdcall *FACT)(int n);

typedef void (__stdcall *PYTHAGORAS)(float a,float b,float* c);

int main(void)

{

HINSTANCE hLibrary=LoadLibrary(TEXT("forsubs.dll"));if(hLibrary==NULL)

{

cout<

system("pause");

return -1;

}

FACT fact=(FACT)GetProcAddress(hLibrary,"FACT");

PYTHAGORAS py=(PYTHAGORAS)GetProcAddress(hLibrary,"PYTHAGORAS");if(fact==NULL||py==NULL)

{

cout<

system("pause");

return -2;

}

float c;

cout<

py(30,40,&c);

cout<

FreeLibrary(hLibrary);

system("pause");

return 0;

}

注意以突出颜色显示那几行。

方式(3)的一个实例如下

#ifndef _MBCS

#define _MBCS

#endif

#include

using namespace std;

#pragma comment(lib,"forsubs.lib")

//CCPP

extern "C" {int _stdcall FACT (int n);}

extern "C" {void _stdcall PYTHAGORAS (float a, float b, float *c);}

int main(void)

{

float c;

cout<

PYTHAGORAS(30,40,&c);

cout<

system("pause");

return 0;

}

以上两例定义_MBCS宏是为设置“使用多字节字符集”。

运行结果截图如下

0818b9ca8b590ca3270a3433284dd417.png

今后可能会继续完善,如果觉得有用请关注本博客的后续更新。

本文原创,FORTRAN代码由网络上源码改编,转载请注明出处

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值