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 aREAL bREAL cc=a+bEND

    这是一般在fortran环境下运行的常规格式,为了生成dll,并且被C/C++调用,对以上代码进行编辑修改
    !函数功能 两数相加SUBROUTINE Summator(a,b,c)REAL aREAL bREAL cc=a+bEND

    其中
    !DEC$ATTRIBUTES DLLEXPORT::SUMMATOR

    也可用以下形式替换
    !MS$IF.NOT.DEFINED(LINKDIRECT)!MS$ATTRIBUTES DLLEXPORT::SUMMATOR!MS$ENDIF


    1.2 Dll工程文件建立 使用VS软件,可以通过【文件】->【新建】建立DLL框架:
    C/C++调用Fortran的DLL的操作过程
    文章图片

    在新项目下将编辑好的代码添加,编译链接得到 TESTFOR.dll文件。

    二、C / C++调用
    调用方式有3种,此处只介绍其中一种显示调用方法,其他方式可参照链接
    (7条消息) 【混合编程实例】C/C++调用FORTRAN编写的DLL_fengyhack的博客-CSDN博客
    首先需要将第一步生成的 .dll 文件Copy到当前C++所在工程目录下,并对函数进行声明
    #include#include 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; //输出计算的cFreeLibrary(hLibrary); //释放Library system("pause"); return 0; }


    三、完整代码

    3.1 Fortran代码部分
    !函数功能 两数相加SUBROUTINE Summator(a,b,c)!MS$IF.NOT.DEFINED(LINKDIRECT)!MS$ATTRIBUTES DLLEXPORT::SUMMATOR!MS$ENDIFREAL a[VALUE]REAL b[VALUE]REAL cc=a+bEND!函数功能 两个数组相加SUBROUTINE SummatorArray(array1,array2,array3,n)!MS$ATTRIBUTES DLLEXPORT::SUMMATORArrayINTEGER n[VALUE]INTEGER iREAL,DIMENSION(n)::array1REAL,DIMENSION(n)::array2REAL,DIMENSION(n)::array3do i=1,narray3(i)=array1(i)+array2(i)end do


    3.2 C代码
    #include#includeusing 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]<<"+"< 运行结果
    C/C++调用Fortran的DLL的操作过程
    文章图片

    【C/C++调用Fortran的DLL的操作过程】到此这篇关于C/C++调用Fortran的DLL的文章就介绍到这了,更多相关C++调用Fortran的DLL内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

      推荐阅读