C/C++调用Fortran的DLL的操作过程

目录
  • 【混合编程】C/C++调用Fortran的DLL
    • 一、Fortran操作
      • 1.1 Fortran代码
      • 1.2 Dll工程文件建立
    • 二、C / C++调用
    • 三、完整代码
      • 3.1 Fortran代码部分
      • 3.2 C代码

【混合编程】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)

      REAL a
      REAL b
      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;
		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$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代码

#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内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++ 编写DLL文件给易语言调用方法

    摸索了两天了,终于解决了所有问题,在此跟大家分享. 需要三个文件,dll_demo.h.dll_demo.cpp.dll_dome.def 直接上代码: 头文件如下: #ifndef _DLL_DEMO_H_ #define _DLL_DEMO_H_ #ifdef DLLDEMO_EXPORTS #define DLL_DEMO extern "C" __declspec(dllexport) #else #define DLL_DEMO extern "C" __

  • 关于C#调用C++dll传指针释放内存问题

    一.传入dll前,在C#中申请内存空间 c#里面的指针即 IntPtr 申请如下: IntPtr SrcImgData = Marshal.AllocHGlobal(length); 这种需要提前知道空间大小,否则无法确定空间大小,会导致dll内部处理时越界报错. c#里面申请空间了,那么c++里面一般就是在这些空间里面操作了,一般不会重新分配内存,那么就不需要加引用了. c++: uchar* SrcImg c#导入dll函数时申明: IntPtr SrcImg 那么内存释放自然也是由c#来进

  • C++ DLL注入工具(完整源码)

    先上源码: #include "Inject_Main.h" #include "resource.h" #include <Windows.h> #include <TlHelp32.h> #include <string> #include <TCHAR.H> using namespace std; /// <summary> /// 通过进程名称获取该进程句柄 /// </summary>

  • C#调用C++dll方法步骤

    C#调用C++dll的方法和步骤 其他分享涉及到的概念和方法对于像我这样比较菜的选手看起来比较费劲并且很难抓住重点,这里我总结了一段时间的研究成果供初学者救济之用,简单明了. 1.新建项目->Visual C++->Win32项目 MyDLL 注意:C++编写的dll一般是不能直接拿来C#调用,需要先新建个C++的工程把dll里的方法重新封装成可被C#外部调用的函数. 2.MyDLL.cpp里的代码如下: extern "C" _declspec(dllexport)int

  • C/C++调用Fortran的DLL的操作过程

    目录 [混合编程]C/C++调用Fortran的DLL 一.Fortran操作 1.1 Fortran代码 1.2 Dll工程文件建立 二.C / C++调用 三.完整代码 3.1 Fortran代码部分 3.2 C代码 [混合编程]C/C++调用Fortran的DLL 以一个简单的加法器为例,介绍C/C++调用Fortran语言DLL的操作过程 一.Fortran操作 1.1 Fortran代码 首先是加法功能的实现,如下代码 !函数功能 两数相加 SUBROUTINE Summator(a,

  • Python调用C# Com dll组件实战教程

    之前公司有套C# AES加解密方案,但是方案加密用的是Rijndael类,而非AES的四种模式(ECB.CBC.CFB.OFB,这四种用的是RijndaelManaged类),Python下Crypto库AES也只有这四种模式,进而Python下无法实现C# AES Rijndael类加密效果了. 类似于这种C# 能实现的功能而在Python下实现不了的,搜集资料有两种解决方案,第一种方式,使用IronPython 直接调用C# dll文件,教程网上很多,不在赘述了,这种方式有个缺点,用的是ir

  • python调用fortran模块

    在python中调用fortran代码,要用到f2py这个程序.它的项目主页在此.现在该项目已经合并到numpy中了,先安装python再装好numpy,就可以使用f2py.不过对windows平台必须使用gnu的fortran编译器gfortran,在此下载.装完了python,numpy和gfortran这三样东西之后,还必须更改如下几个环境变量: 1.在$PATH中添加gfortran的路径,我的是c:\Program Files\pythonxy\mingw\bin\ 2.在$PATH中

  • C++调用C#的DLL程序实现方法

    把C#编译成DLL或者Axtive控件,再由C调用!比如使用C++调用C#的DLL. SwfDotNet是.net下输出flash的类库.SwfDotNet是C#编写的,作者的C#水平,真是令我佩服.这是个特别好的读写Swf文件的库.但是,我要用在C++项目中,怎么让C++调用C#的DLL呢.今天一上午都在琢磨这个问题,耽误了很多时间,原因是编译是出现:warning C4819: 该文件包含不能在当前代码页(936)中表示的字符.请将该文件保存为 Unicode 格式以防止数据丢失. 接着就是

  • C++调用C#的DLL实现方法

    SwfDotNet是C#编写的,这是个特别好的读写Swf文件的库.本文讲述了在C++项目中,怎么让C++调用C#的DLL动态链接库文件. 具体的实现步骤如下: 一.创建C# DLL,需要指定应用类型为"类库",代码: namespace CSLib { public class Class1 { private string name; public string Name { get { return name; } set { name = "Your Name: &qu

  • 易语言调用微信PrScrn.dll文件进行截图的代码

    DLL命令表 .版本 2 .DLL命令 GetProcAddress, 整数型, "kernel32", "GetProcAddress", , 返回函数地址 .参数 hModule, 整数型 .参数 lpProcName, 文本型 .DLL命令 GetModuleHandle, 整数型, "kernel32", "GetModuleHandleA", , 获取一个应用程序或动态链接库的模块句柄 如执行成功成功,则返回模块句柄

  • vs2019 实现C#调用c++的dll两种方法

    1.托管与非托管的区别 链接地址(仅供参考) 除了链接中的,在实用角度出发: 非托管需要一个个声明引用,就很繁琐 但是托管(虽然麻烦)不用声明,只需要调好配置即可,还是比较方便的 为什么写这个博客,也是因为不同版本vs2017和vs2019有所区别,托管就容易踩坑,希望大家能看看,解决问题(我也很菜,大佬轻喷) 2.非托管类的实现 第一步:创建C++空项目(命名Caculate)添加一个类AddOperate .h代码部分: #pragma once extern "C" _decls

  • C#调用C类型dll入参为struct的问题详解

    前言 C# 可以通过 DllImport 的方式引用 C 类型的 dll.但很多 dll 的参数不会是简单的基础类型,而是结构体 struct .因此就需要在 C# 端定义同样的结构体类型,才能实现调用 C 类型 dll.这里例举几种不同的结构体情况,以及其对应的解决方案. 基础调用方式 对于一个结构体类型: typedef struct DATA { int nNumber; float fDecimal; }; 在 C# 端就需要定义为 [StructLayout(LayoutKind.Se

  • C#如何调用MFC 窗口 DLL

    目录 C#调用MFC 窗口 DLL MFC DLL MFC DLL属性 C# 调用 C++ MFC DLL C++ MFC DLL 的封装 C# 中调用,CharSet须设置为多字节的 Ansi C#调用MFC 窗口 DLL MFC DLL 创建一个窗口类,加public和AFX_EXT_CLASS MFC DLL属性 注意 MFC的使用:在共享DLL中使用MFC 公共语言运行时支持:公共语言运行时支持(/clr) 在预处理器中添加_AFXEXT 在项目名称.cpp里添加要输出的函数 注意第一行

  • python 使用ctypes调用C/C++ dll详情

    python和C/C++混合编程,推荐使用python的内置模块ctypes,从名字上可以看出是c,可见对C++的支持并不太好. 一般的步骤: 1.导入ctypes模块,加载C/C++ dll到python进程空间 2.python类型转换为ctypes类型 3.ctypes类型转换为C/C++类型 ctypes文档 VS2017 + Python3.8(IDE:py Charm) 基本数据类型以及结构体类型都可以正常通信.DLL: extern "C"{ struct MyStruc

随机推荐