VC++调用Fortran生成的DLL实例

  VC++++Fortran混合编程借助于Fortran生成的DLL进行

  (采用C默认的传址方式进行函数参数传递)

  1.Fortran 生成DLL

  新建Fortran DLL程序test1.f

  添加如下代码:

  ! test1.f90

  !

  ! FUNCTIONS/SUBROUTINES exported from test1.dll:

  ! test1 - subroutine

  !示例没有返回值的子例程

  subroutine test1(a,b)

  ! Expose subroutine test1 to users of this DLL

  !

  !DEC$ ATTRIBUTES C,DLLEXPORT::test1

  ! Variables

  ! Body of test1

  integer a,b

  integer sum

  sum=a+b

  return

  end subroutine test1

  !示例有返回值的整数四则运算

  !两数相加

  function add(a,b)

  implicit none

  !DEC$ ATTRIBUTES C,DLLEXPORT::add

  integer a,b,add

  add=a+b

  return

  end

  !两数相减

  function abstract(a,b)

  implicit none

  !DEC$ ATTRIBUTES C,DLLEXPORT::abstract

  integer a,b,abstract

  abstract=a-b

  return

  end

  !两数相乘

  function multiply(a,b)

  implicit none

  !DEC$ ATTRIBUTES C,DLLEXPORT::multiply

  integer a,b,multiply

  multiply=a*b

  return

  end

  !两数相除 (需要添加考虑被除数是否为0以及能否整除的判断)

  function divided(a,b)

  implicit none

  !DEC$ ATTRIBUTES C,DLLEXPORT::divided

  integer a,b,divided

  divided=a/b

  return

  end

  编译后生成test1.dll,test1.obj等文件。其中这两个文件是我们在VC中调用所需要的。

  查看test1.dll中生成的函数如下图所示。

   注意:使用伪注释语句!DEC$ ATTRIBUTES C,DLLEXPORT::functionName后,生成的函数名与Fortran中定义的函数名一致,并没有按照Fortran编译器的默认属性将 函数名都转变为大些,如下图所示。在后续的VC中调用的时候需要保持调用的函数名称一致,否则会出现找不到函数的错误提示。

  2.VC控制台调用Fortra生成的DLL

  新建VC控制台应用程序,新建一个checktest1的工程。

   注意:需要在工程的project菜单下的add to project子菜单的file对话框中添加上一步生成的test1.dll,test1.obj两个文件,否则编译能通过,链接的时候失败。还需将以上 两个文件拷贝到checktest1工程的debug目录下,否则运行的时候出现找不到文件的错误提示。自己测试了一下,以上两步是必须的。

  添加如下代码:(注意红色的部分)

  #include “stdafx.h”

  #include “iostream.h”

  //extern “C”{_stdcall TEST1(int* x,int* y);}

  //extern “C”{_stdcall ADD(int* x,int* y);}

  //extern “C”{_stdcall ABSTRACT(int* x,int* y);}

  //extern “C”{_stdcall MULTIPLY(int* x,int* y);}

  //extern “C”{_stdcall DIVIDED(int* x,int* y);}

  //注意此处函数名称要与DLL生成时保持一致(如下中的蓝色部分),否则会出现找不到函数的错误提示。并且一定要记得去掉参数中的指针符号*。

  extern “C”{_cdecl test1(int x,int y);}

  extern “C”{_cdecl add(int x,int y);}

  //采用C的传值方式,则需要将_stdcall修改为_cdecl

  //相应的Fortran DLL处要添加C的调用方式,即将!DEC$ ATTRIBUTES DLLEXPORT::add修改为:!DEC$ ATTRIBUTES C,DLLEXPORT::add

  //适应伪注释!DEC$ ATTRIBUTES C,DLLEXPORT::add后生成的DLL函数中只存在函数名为add的函数,ADD 和_ADD@8 均不存在,参见上图中的DLL函数名称

  extern “C”{_cdecl abstract(int x,int y);}

  extern “C”{_cdecl multiply(int x,int y);}

  extern “C”{_cdecl divided(int x,int y);}

  int main(int argc, char* argv[])

  {

  int a=35,b=5;

  int sum=0;

  int abs=0;

  int mul=0;

  int div=0;

  //TEST1(&a,&b);

  //sum=ADD(&a,&b);

  //abs=ABSTRACT(&a,&b);

  //mul=MULTIPLY(&a,&b);

  //div=DIVIDED(&a,&b);

  test1(a,b);

  sum=add(a,b);

  abs=abstract(a,b);

  mul=multiply(a,b);

  div=divided(a,b);

  printf(“a+b= %dn”,sum);

  printf(“a-b= %dn”,abs);

  printf(“a*b= %dn”,mul);

  printf(“a/b= %dn”,div);

  printf(“Hello World!n”);

  return 0;

  }

  然后编译运行可以得出正确的结果:

时间: 2024-11-02 01:51:36

VC++调用Fortran生成的DLL实例的相关文章

dll动态库-c调用fortran生成dll,我现在有.c.for.def .lib 文件,不知道怎么重新编译dll

问题描述 c调用fortran生成dll,我现在有.c.for.def .lib 文件,不知道怎么重新编译dll 我现在有的文件如下: BLAS.lib CMB82.c CMB82.def CMB82.inc CMB82a.for CMB82b.for LAPACK.lib WKShead.h 这是在网上下的别人的DLL源文件,怎样才能重新编译成dll文件

c-关于VB.net调用C生成的dll,遇到的比字符集不匹配还纠结的问题

问题描述 关于VB.net调用C生成的dll,遇到的比字符集不匹配还纠结的问题 升级项目.从6.0到2012.升级后出现调用dll中c的方法:DLLEXPORT BOOL WINAPI InsUpdDel( LPSTR lpSqlStr LPRTNINFO RtnInfo )其中 LPSTR lpSqlStr 是_char × 类型,在API _winnt.h中定义:winnt.h // ANSI (Multi-byte Character) types//typedef Null_termin

mfc-LabView中调用MFC-Wizard生成的DLL实现自定义文件对话框功能出错

问题描述 LabView中调用MFC-Wizard生成的DLL实现自定义文件对话框功能出错 VC创建MFC-Wizard生成的Dll,在导出函数MyFileOpen中调用由CFileDialog派生类CMyFileDlg实现自定义文件对话框.再在LabView中引用库函数节点调用MFC生成的DLL,输入输出参数设置输入类型int32.输出为C字符串指针即为文件对话框返回的选中目标文件路径. 如上配置完成后,运行弹出1097错误,用error_out屏蔽后,返回路径没有输出结果.DLL调试执行My

c++调用matlab生成的Dll动态连接库

点击打开链接http://download.csdn.net/detail/nuptboyzhb/4228429 c++调用matlab生成的Dll动态连接库 实验平台:   matlab 7.0(R2009a)   VC++6.0思路:1. 设置matlab的编译器,使用外部的VC或者gcc等编译器. 2. 编译m文件成dll 3. 设置VC的Include路径和lib链接库的路径 4. 编写C++调用dll步骤:1.    设置matlab的编译器在命令行窗口下,输入并执行如下命令:mex

如何在NodeJS中调用SS生成的DLL

要想在NodeJS中调用SS生成的DLL, 需要借助EdgeJS. EdgeJS: http://tjanczuk.github.io/edge/ 如果你还不知道如何在SS 中生成DLL, 请查看: Spider Studio 新版本 (x-mas) - 可以引入第三方程序集, 可以将脚本生成为DLL 下面以曾经写过的XML/JSON互转的脚本为例 (C#中 另辟蹊径解决JSON / XML互转的问题) 说明如何在NodeJS中应用SS DLL: 1. 安装edgejs npm install

关于调用matlab生成的dll问题(符号运算)

问题描述 关于调用matlab生成的dll问题(符号运算) __function [res]=Mint(f1)syms x;f2=simplify(int(f1x));res=f2;end__简单的求一个不定积分 问如何在源文件中调用此函数(c/c++)? 解决方案 看我写的博客:http://www.blogjava.net/wxb_nudt/archive/2008/01/28/178246.html当年可是好好研究过的. 解决方案二: http://www.cnblogs.com/lida

编程-c++、MFC调用labview生成的DLL

问题描述 c++.MFC调用labview生成的DLL 我用labview这个软件生成了一个前面板,labview主要用于显示仪表,现在整个面板生成为一个DLL.我想用vs C++来调用该dll,比如在MFC中一个指定的窗口中显示前面板.请熟悉这方面的大神指点一下或者和我一起讨论下vs和labview的混合编程.不甚感激! 解决方案 参考这篇文章:http://wenku.baidu.com/link?url=EOQA4viGBoEX_0ztvAa0RjYUX1lohMqvtfV3vtswGkB

c++-C#调用C++生成的dll时,报错参数不匹配

问题描述 C#调用C++生成的dll时,报错参数不匹配 C++代码 int WINAPI ilbc_encoder(short pin,unsigned char pout) { int k; float block[BLOCKL_MAX]; /* convert signal to float */ for (k=0; k<iLBCenc_inst.blockl; k++) block[k] = (float)pin[k]; /* do the actual encoding */ iLBC_

c#-关于C#调用matlab生成的.dll文件时的问题

问题描述 关于C#调用matlab生成的.dll文件时的问题 本人用matlab做了一个海浪波长计算程序,想在C#中调用该程序,自己始终无法调用. 也找了网上一些资料,按他们所说的做,结果发现引用后的.dll文件无法应用(已在注册表添加过注册),希望有经验的前辈帮忙解答一下,谢谢. 解决方案 http://www.jb51.net/article/41034.htm 解决方案二: 我使用的是:VS 2008, matlab R2009a: ? 首先遇到的第一个问题是:**** 类型初始值设定项引