【混合编程】C/C++调用Fortran的DLL
【混合编程】C/C++调用Fortran的DLL
以一个简单的加法器为例,介绍C/C++调用Fortran语言DLL的操作过程
一、Fortran操作
1.1 Fortran代码
首先是加法功能的实现,如下代码
!函数功能 两数相加
SUBROUTINE Summator(a,b,c)
REAL a
REAL b
REAL c
c=a+b
END
这是一般在fortran环境下运行的常规格式,为了生成dll,并且被C/C++调用,对以上代码进行编辑修改
!函数功能 两数相加
SUBROUTINE Summator(a,b,c)
!DEC$ATTRIBUTES DLLEXPORT::SUMMATOR
REAL a[VALUE] !此处[VALUE]是必须的,传入的参数值需作此声明,否则会引发读取访问权限冲突的异常
REAL b[VALUE]
REAL c
c=a+b
END
其中
!DEC$ATTRIBUTES DLLEXPORT::SUMMATOR
也可用以下形式替换
!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++所在工程目录下,并对函数进行声明
#include<iostream>
#include <windows.h>
using namespace std;
typedef void(*SUMMATOR)(float a, float b, float *c);
在C++工程文件中进行调用
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;
system("pause");
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代码部分
!函数功能 两数相加
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$IF.NOT.DEFINED(LINKDIRECT)
!MS$ATTRIBUTES DLLEXPORT::SUMMATORArray
!MS$ENDIF
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
END
3.2 C代码
#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;
system("pause");
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;
system("pause");
return -2;
}
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);
for (int i = 0; i < n; i++) {
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混合编程之本地调用Fortran动态链接库
前言 C#发展到现在,已是一门相当完善的语言,他基于C语言风格,演化于C++.并依靠强大的.NET底层框架.C#可以用来快速构建桌面及Web应用.然而在我们的实际工作中,尽管C#已经非常完善,但还是不 ...
- Matlab与C++混合编程 1--在C++中调用自己写的matlab函数
在Visual Studio中使用C++中调用MATLAB程序 在matlab中可以通过mbuild工具将.m文件编译成dll文件供外部的C++程序调用,这样就可以实现matlab和C++混合编程的目 ...
- 【调试经验】C++和C的混合编程以及库调用
问题背景 这两天在移植一个开源的库,偏底层的那种,所以对架构有一些依赖.源码的编译是通过Makefile来构建,怎奈公司的架构用的是CMAKE,所以就在开源的顶层和子目录分别构建了CMakeList, ...
- python c++ 混合编程中python调用c++string返回类型的函数,python中返回为数字的解决办法
本随笔解决 Python使用ctypes 调用c++dll 字符串返回类型函数,在python中显示为数字:原文解决方案见so: https://stackoverflow.com/questions ...
- C#调用Fortran生成的DLL的方法报内存不足
最近在研究一个程序,公司给的,程序是VB写的,程序里面还有一个计算的模型,用Fortran语言写的. 在调试到这个模型里面的方法时报错,说是内存不足,于是就在网上查找方法,看了两篇博客之后问题解决了. ...
- Fortran与C混合编程(转自Ubuntu)
Fortran与C混合编程 由于 GNU 的 Fortran 和 C 语言二者的函数彼此可以直接相互调用,所以混合编程可以非常容易地实现.只要你足够仔细,确保函数调用时传递的参数类型正确,函数就可以在 ...
- 【原创】Matlab.NET混合编程技巧之直接调用Matlab内置函数
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 Matlab和C#混合编程文章目录 :[目录]Matlab和C#混合编程文章目录 在我的上一篇文章[ ...
- matlab和C/C++混合编程--调用opencv
最近的我们已经将整个项目搭起来了,项目比较复杂.由于我们做的是检索系统,所以我们用asp.net(c#)做了网页,但是算法的实现是在matlab下,所以我们不得不用matlab生成动态链接库dll,然 ...
- matlab封装DLL混合编程总结
最近做了个项目要用到matlab做些算法处理,然后用.net项目调用这个类,我把这个matlab封装dll总结了下如下: matlab是商业数学软件,优势是在算法开发上面有很强的功能,提供了很多数学算 ...
随机推荐
- 我的新书——《PHP程序员面试笔试宝典》
你好,是我琉忆. 一个文艺的PHP开发工程师. 很荣幸能够在这里带来我的第一本新书--<PHP程序员面试笔试宝典>. 一.创作过程 <PHP程序员面试笔试宝典>是我的第一本书, ...
- 从零开始学mitmproxy抓包工具
Man In The Middle mitm是Man In The Middle的首字母缩写,意思是位于中间的人,表明mitmproxy是一个代理,可以拦截请求,实现网络抓包.知名的网络抓包工具有Fi ...
- 北京太速科技-6U VPX 6槽 Full Mesh结构背板机箱
一.产品概述 Ori6UVPX6SlotFullMesh264背板机箱 为 6U VPX 6槽 Full Mesh结构,用于实现PCIE.RapidIO IO 4X Full Mesh 高速数据互联, ...
- 前端提交数据到node的N种方式
写在前面 本篇介绍了前端提交数据给node的几种处理方式,从最基本的get和post请求,到图片上传,再到分块上传,由浅入深. GET请求 经典的get提交数据,参数通过URL传递给node,node ...
- 我是如何破解你的WINDOWS密码的 ?(1)
我是如何破解你的WINDOWS密码的 ?(1) 密码可以看作我们主要,甚至某些情况下唯一可用于防范入侵的防线.就算入侵者无法在物理上接触到计算机,对于对外的Web应用,他们依然可以通过远程桌面协议或身 ...
- Lesson11——Pandas去重函数:drop_duplicates()
pandas目录 "去重"通过字面意思不难理解,就是删除重复的数据.在一个数据集中,找出重复的数据删并将其删除,最终只保存一个唯一存在的数据项,这就是数据去重的整个过程.删除重复数 ...
- MyBatisPlus根据ID修改对应的值,其他属性不变.如何实现?
1.基本操作 // 修改订单的状态为已发货和已支付 Order order = new Order(); order.setSend(1); // 已发货 order.setPay(1); // 已支 ...
- 从这3个方面考虑BI工具,选型一选一个准
BI工具在很多场合都能听到,那么BI工具有什么功能呢?能给企业带来什么?好用的BI工具长什么样?今天跟着小编走近BI工具,一探究竟! 首先要了解BI工具的定义,什么是BI工具.BI工具是指利用现代数据 ...
- .Net Core之选项模式Options使用
一.简要阐述 ASP.NET Core引入了Options模式,使用类来表示相关的设置组.简单的来说,就是用强类型的类来表达配置项,这带来了很多好处.利用了系统的依赖注入,并且还可以利用配置系统.它使 ...
- 【C# .Net GC】条件自动垃圾回收 HandleCollector类
条件自动回收 达到指定条件后自动执行GC回收垃圾. GC中的方法AddMemoryPressure和RemoveMemoryPressure 本机资源有时会消耗大量内存,但用于包装它的托管对象只占用很 ...