【混合编程】C/C++调用Fortran的DLL
以一个简单的加法器为例,介绍C/C++调用Fortran语言DLL的操作过程
一、Fortran操作
1.1 Fortran代码
首先是加法功能的实现,如下代码
1
2
3
4
5
6
7
8
9
|
!函数功能 两数相加 SUBROUTINE Summator(a,b,c) REAL a REAL b REAL c c=a+b END |
这是一般在fortran环境下运行的常规格式,为了生成dll,并且被C/C++调用,对以上代码进行编辑修改
1
2
3
4
5
6
7
8
|
!函数功能 两数相加 SUBROUTINE Summator(a,b,c) REAL a REAL b REAL c c=a+b END |
其中
1
|
!DEC$ATTRIBUTES DLLEXPORT::SUMMATOR |
也可用以下形式替换
1
2
3
|
!MS$IF.NOT.DEFINED(LINKDIRECT) !MS$ATTRIBUTES DLLEXPORT::SUMMATOR !MS$ENDIF |
1.2 Dll工程文件建立
使用VS软件,可以通过【文件】->【新建】建立DLL框架:
在新项目下将编辑好的代码添加,编译链接得到 TESTFOR.dll文件。
二、C / C++调用
调用方式有3种,此处只介绍其中一种显示调用方法,其他方式可参照链接
(7条消息) 【混合编程实例】C/C++调用FORTRAN编写的DLL_fengyhack的博客-CSDN博客
首先需要将第一步生成的 .dll 文件Copy到当前C++所在工程目录下,并对函数进行声明
1
2
3
4
|
#include<iostream> #include <windows.h> using namespace std; typedef void (*SUMMATOR)( float a, float b, float *c); |
在C++工程文件中进行调用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
int main(){ //第一步,加载fortran下生成的dll文件 HINSTANCE hLibrary = LoadLibrary(TEXT( "TESTFOR.dll" )); //判断是否加载成功 if (hLibrary == NULL) { cout << "Cannot open lib" << endl; system ( "pause" ); return -1; } //第二步,从加载的结果 hLibrary 中查找函数并命名 SUMMATOR summator = (SUMMATOR)GetProcAddress(hLibrary, "SUMMATOR" ); //判断是否查找到函数 if (summator == NULL) { cout << "Cannot find 'SUMMATOR' function" << endl; return -2; //第三步,调用 float a = 1.0; float b = 2.0; float c = 0.0; summator(a,b,&c); //调用函数 cout << c << endl; //输出计算的c FreeLibrary(hLibrary); //释放Library system ( "pause" ); return 0; } |
三、完整代码
3.1 Fortran代码部分
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
!函数功能 两数相加 SUBROUTINE Summator(a,b,c) !MS$IF.NOT.DEFINED(LINKDIRECT) !MS$ATTRIBUTES DLLEXPORT::SUMMATOR !MS$ENDIF REAL a[VALUE] REAL b[VALUE] REAL c c=a+b END !函数功能 两个数组相加 SUBROUTINE SummatorArray(array1,array2,array3,n) !MS$ATTRIBUTES DLLEXPORT::SUMMATORArray INTEGER n[VALUE] INTEGER i REAL,DIMENSION(n)::array1 REAL,DIMENSION(n)::array2 REAL,DIMENSION(n)::array3 do i=1,n array3(i)=array1(i)+array2(i) end do |
3.2 C代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
#include<iostream> #include<windows.h> using namespace std; typedef void (*SUMMATOR)( float a, float b, float *c); typedef void (*SUMMATORARRAY)( float *array1, float *array2, float *array3, int n); int main() { //加载dll函数 HINSTANCE hLibrary = LoadLibrary(TEXT( "TESTFOR.dll" )); if (hLibrary == NULL) { cout << "Cannot open dll" << endl; system ( "pause" ); return -1; } SUMMATOR summator = (SUMMATOR)GetProcAddress(hLibrary, "SUMMATOR" ); if (summator == NULL) { cout << "Cannot find 'SUMMATOR' function" << endl; return -2; float a = 1.0; float b = 2.0; float c = 0.0; summator(a,b,&c); cout << c << endl; SUMMATORARRAY summatorArray = (SUMMATORARRAY)GetProcAddress(hLibrary, "SUMMATORARRAY" ); if (summatorArray == NULL) { cout << "Cannot find 'SUMMATORARRAY' function" << endl; int n = 3; float *array1 = ( float *) calloc (n, sizeof ( float )); float *array2 = ( float *) calloc (n, sizeof ( float )); float *array3 = ( float *) calloc (n, sizeof ( float )); for ( int i = 0; i < n; i++) { array1[i] = i; array2[i] = i * i; summatorArray(array1, array2, array3, n); cout << array1[i]<< "+" <<array2[i]<< "=" << array3[i]<<endl; FreeLibrary(hLibrary); free (array1); free (array2); free (array3); system ( "pause" ); return 0; } |
运行结果
到此这篇关于C/C++调用Fortran的DLL的文章就介绍到这了,更多相关C++调用Fortran的DLL内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://www.cnblogs.com/GeophysicsWorker/p/16043719.html