找回密码
 注册
Simdroid-非首页
查看: 407|回复: 21

MATLAB调用fortran生成的DLL时的几个问题!

[复制链接]
发表于 2009-5-24 14:50:13 | 显示全部楼层 |阅读模式 来自 北京
我这里在用MATLAB调用fortran时存在几个问题无法解决,请高手帮帮忙!谢谢!
      我首先在fortran下生成一个mexCaclT90.f文件(fortran文件),然后使用MATLAB编译此文件生成mexCaclT90.dll,然后在MATLAB下调用此dll文件进行计算,但就算的过程中存在这样的几个问题,不是很理解,请大家帮忙看看。
我在MATLAB下输入如下语句编译fortran文件:
>> mex mexCaclT90.f
紧接着输入如下语句调用dll文件:
>> T90=mexCaclT90(70,10,10,5)
生成的结果如下:
T90 =
   47.5000

       问题在于:当我再一次调用该dll时,即输入>> T90=mexCaclT90(70,10,10,5)语句或>> T90=mexCaclT90(70,8,8,5)语句时为什么输出的结果就变为:
T90 =
     0

       但是当我把MATLAB关闭后再一次重新启动MATLAB,此时再输入>> T90=mexCaclT90(70,10,10,5)语句时又能生成正确的结果,但就是每次只能生成一次,不能重复进行2次计算,只要重复调用此dll,第二次生成的结果都为0,请问这是什么原因造成的?始终让我困惑!
       期待各位老师的帮忙,谢谢!
发表于 2009-5-25 13:46:43 | 显示全部楼层 来自 大连理工大学
Simdroid开发平台
这个问题可以看看有关taohe的几个精华帖子,都比较经典。
回复 不支持

使用道具 举报

 楼主| 发表于 2009-5-25 15:51:28 | 显示全部楼层 来自 北京
本帖最后由 shuangbolover 于 2009-5-25 16:02 编辑

2# zhoulon

好的,谢谢您的帮忙!我看了,但是他的帖子里面涉及到的都是MATLAB与VC的接口问题,没有涉及到MATLAB与fortran之间的接口问题!
不过来时要谢谢您的帮助,谢谢!
回复 不支持

使用道具 举报

 楼主| 发表于 2009-5-25 16:37:34 | 显示全部楼层 来自 北京
这个问题可以看看有关taohe的几个精华帖子,都比较经典。
zhoulon 发表于 2009-5-25 13:46


zhoulon您好!
我在用MATLAB调用fortran的时候又出现了一个问题,想请您帮帮忙!谢谢!
我在MATLAB下执行编译语句
>> mex mexCaclT90.f
能够顺利完成,并生成了dll文件
但是当我调用此dll的时候为什么会有如下错误提示:
>> a=mexCaclT90(70,8,8,5)
Unable to load mex file: D:\MATLAB6p5\work\koala\mexCaclT90.dll.
找不到指定的程序。
??? Invalid MEX-file

我之前在我的电脑上可以运行(即可调用此dll文件),但我在其他电脑上重新编译,然后重新运行就会出现上面所示的错误提示!麻烦您帮忙看看,谢谢!
还有就是MATLAB的版本对其调用有影响吗?我的电脑是安装的是MATLAB7.0的,处错误的这台电脑安装的是MATLAB6.5的版本!
回复 不支持

使用道具 举报

发表于 2009-5-26 07:23:54 | 显示全部楼层 来自 新加坡
关于第一个在连续执行时结果不一样的问题,一个可能的原因就是程序的bug,有可能是有没有正确初始化的变量。

关于第二个问题,请确实确认一下在matlab6.5的电脑上成功地生成了mex文件。另外在确认一下系统的path设置没有问题,也就是说如果用现在所用的Fortran编译器编译一个类似于“Hello World”的简单的程序,你在Explorer中可以执行这个简单的HelloWorld,然后再重新在matlab中实验。

评分

1

查看全部评分

回复 不支持

使用道具 举报

 楼主| 发表于 2009-5-27 14:31:36 | 显示全部楼层 来自 北京
关于第一个在连续执行时结果不一样的问题,一个可能的原因就是程序的bug,有可能是有没有正确初始化的变量。

关于第二个问题,请确实确认一下在matlab6.5的电脑上成功地生成了mex文件。另外在确认一下系统的path设 ...
taohe 发表于 2009-5-26 07:23

您好,谢谢您的回复!
第一个问题已经解决了!谢谢!
第二个问题我做了一个比较简单的mex程序能够调用,但是调用我的比较大的程序就会出现上面的那个提示,我把之前生成的dll删除后,重新使用mex mexCaclT90.f语句进行编译,我检查了一下文件夹下确实已经生成了mexCaclT90.dll文件,但是我调用它的时候他就提示一下这个错误:
Unable to load mex file: D:\MATLAB6p5\work\koala\mexCaclT90.dll.
找不到指定的程序。
??? Invalid MEX-file
您以前遇到过这样的问题吗?但在7.0版本上却没有这个问题!您所说的path路径是什么路径?怎么设置?谢谢!
回复 不支持

使用道具 举报

发表于 2009-5-27 15:35:21 | 显示全部楼层 来自 新加坡
如果你的这个mex Fortran程序在matlab7.0的机器上可以编译、运行正常,那就是说源程序没有问题。

我说的“path”就是电脑上操作系统中对于可执行文件所在目录的设置。当你在Windows的DOS窗口,无论当前的目录在那里,你运行“notepad”都能成功的执行并且看到notepad的窗口,原因就是notepad.exe所在的目录已经在“path”中包含了。

现在再回到你的问题,如果那个“mexCaclT90.dll”是个合格的mex文件(也就是有mexfunctioin入口函数),那么出现上述错误的可能原因就是它所依赖的某些DLL文件不在系统的“path”设置中。
回复 不支持

使用道具 举报

 楼主| 发表于 2009-5-30 11:11:44 | 显示全部楼层 来自 北京
如果你的这个mex Fortran程序在matlab7.0的机器上可以编译、运行正常,那就是说源程序没有问题。

我说的“path”就是电脑上操作系统中对于可执行文件所在目录的设置。当你在Windows的DOS窗口,无论当前的目录在那 ...
taohe 发表于 2009-5-27 15:35

taohe老师,您好!
我用fortran写了一个小的调用程序,在MATLAB6.5版本下即能编译,调用的时候也没问题,能够正确执行,但是换成在MATLAB7.0版本下能正确调用且运行的fortran程序,在MATLAB6.5版本下却能够编译,且成功生成dll文件,但在调用时提示如下错误:
>> a=mexCaclT90(70,8,8,5)
Unable to load mex file: D:\MATLAB6p5\work\koala\mexCaclT90.dll.
找不到指定的程序。

??? Invalid MEX-file
又麻烦各位了!谢谢!
回复 不支持

使用道具 举报

发表于 2009-5-30 12:04:02 | 显示全部楼层 来自 新加坡
看不见源代码,也看不到你的系统设置,总是感觉有点讲不清楚。我之前建议你在装有matlab6.5
的电脑上用那个fortran编译器随便编译一个类似于HelloWorld的例子,然后在Windows Explorer
中测试运行它,目的就是想弄清楚系统设置是否有问题。

假设你是在说两台不同的电脑a和b,电脑a上只有matlab7.0,电脑b上只有matlab6.5。编译mex所用的fortran编译器都是一样的,请确认一下。

另外,再来确认一下,你说:“我用fortran写了一个小的调用程序,在MATLAB6.5版本下即能编译,调用的时候也没问题,能够正确执行”。 这是指一个简单的fortran mex吗?如果是的话,那么你现在的matlab安装以及系统设置似乎正常。那么需要分析那个mexCalcIT90是否用到了其他de库函数。如果有的话,在装有matlab6.5的电脑上有那个库吗?

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2009-5-30 20:41:24 | 显示全部楼层 来自 广西贺州
本帖最后由 shunfly 于 2009-5-30 20:47 编辑

绕口令让人崩溃!!!
在MATLAB6.5版本下即能编译,调用的时候也没问题,能够正确执行,但是换成在MATLAB7.0版本下能正确调用且运行的fortran程序,在MATLAB6.5版本下却能够编译,且成功生成dll文件,但在调用时提示如下错误:

shuangbolover 发表于 2009-5-30 11:11

消息中提到
我用fortran编了一个小程序可以调用,但是用我的大程序的时候就会提示下面的这个错误

告诉我,WHAT IS 小程序?WHAT IS 大程序?!!
大程序是否调用了其他的MEX。。。。。。。。。
清晰地提问是一门多么重要的知识!
回复 不支持

使用道具 举报

 楼主| 发表于 2009-5-31 09:51:45 | 显示全部楼层 来自 北京
告诉我,WHAT IS 小程序?WHAT IS 大程序?!!
大程序是否调用了其他的MEX。。。。。。。。。
清晰地提问是一门多么重要的知识!
shunfly 发表于 2009-5-30 20:41

您好,真不好意思,我的表达上有问题,以后改过来!嘿嘿!谢谢您的提醒!
我所说的小程序是指程序之间不相互调用,只写了一个简短的代码,而大程序主要是一个流场的计算,里面会相互进行调用,但并没有调用其他的MEX,只是有一些相互的迭代以及函数子函数之间的调用而已!
我找到其中的一个原因了,我一部分一部分的调试,发现当我的程序开动态数组的时候就会出现上面提示的找不到指定的文件,当不开动态数组写成静态数组的时候就不会有这个问题,想问一下这是什么原因?在MATLAB7.0版本里fortran开动态数组没问题,为何6.5版本里fortran就开不了动态数组呢?我这个求解问题又无法避免不开动态数组,谢谢!
回复 不支持

使用道具 举报

发表于 2009-5-31 18:45:58 | 显示全部楼层 来自 广西梧州
1,问题语段出在哪里?
   是在Gateway Routine?还是你的FORTRAN SUBROUTINE,即NOTHING TO DO WITH MATLAB?
2。动态数组是指FORTRAN中还是MEX中用mxCalloc
3。我试试
发现当我的程序开动态数组的时候就会出现上面提示的找不到指定的文件,当不开动态数组写成静态数组的时候就不会有这个问题,想问一下这是什么原因?
shuangbolover 发表于 2009-5-31 09:51
回复 不支持

使用道具 举报

发表于 2009-6-1 00:28:36 | 显示全部楼层 来自 广东潮州
晚上清静写报告。刚玩了十把CS AWP,装了个FOR6.6。如果我没猜错你地意思地话,你地问题我稍候贴代码上来。
回复 不支持

使用道具 举报

发表于 2009-6-1 10:36:05 | 显示全部楼层 来自 广西贺州
本帖最后由 shunfly 于 2009-6-1 10:39 编辑

应用
CL1D(5)
返回
[1 2 3 4 5]

  1.    !--------------------------------------------------------!
  2.    !  Date                                                            !
  3.    !            2009,5,31,23:21                                !
  4.    !  Author                                                         !
  5.    !            Shunfly@Simwe                                !
  6.    !            Shunfly517@gmail.com                    !
  7.    !  Parameter                                                  !
  8.    !            NLength                                           !
  9.    !                The Length of the Vector             !
  10.    !  Return Value                                              !
  11.    !            1:NLength                                         !
  12.    !  System Ver                                                 !
  13.    !            MATLAB6.5.1                                   !
  14.    !            CVF6.6                                             !
  15.    !            WINXP SP2                                       !
  16.    !-------------------------------------------------------!
  17.       
  18. ! MODULE DEC
  19.       MODULE MODULE_Dim
  20. IMPLICIT NONE
  21. REAL*8,DIMENSION(:),ALLOCATABLE::Ek
  22. END MODULE MODULE_Dim
  23.       ! MODULE APP
  24.       MODULE MODULE_Fun
  25. USE MODULE_Dim
  26. IMPLICIT NONE
  27. CONTAINS
  28. SUBROUTINE AllocMatSub(INDim)
  29. IMPLICIT NONE
  30. INTEGER  INDim,IDex
  31.       
  32. ALLOCATE(Ek(INDim))
  33. DO IDex=1,INDim
  34.     Ek(IDex) = IDex*1.0D0
  35. END DO
  36. END SUBROUTINE AllocMatSub
  37. END MODULE MODULE_Fun
  38.       ! MEX GATEWAY
  39.       SUBROUTINE mexFunction(nlhs, plhs, nrhs, prhs)
  40. USE MODULE_Dim
  41. USE MODULE_Fun
  42.       INTEGER mxGetPr
  43.       INTEGER plhs(*), prhs(*),nlhs, nrhs
  44. INTEGER mxCopyReal8ToPtr
  45. INTEGER plhs1
  46. REAL*8  RNDim
  47. INTEGER INDim
  48.   IF (nrhs .ne. 1) THEN
  49.      ! 输入一个参数
  50.      RETURN
  51.       END IF
  52. CALL mxCopyPtrToReal8(mxGetPr(prhs(1)),RNDim,1)
  53. INDim = INT(RNDim)
  54. plhs(1)=mxCreateDoubleMatrix(1,INDim,mxREAL)
  55. plhs1  =mxGetPr(plhs(1))
  56. CALL AllocMatSub(INDim)
  57. CALL mxCopyReal8ToPtr(Ek,plhs1,INDim)
  58. ! DEALLOCATE
  59. DEALLOCATE(Ek)
  60.       END SUBROUTINE
复制代码

评分

1

查看全部评分

回复 不支持

使用道具 举报

 楼主| 发表于 2009-6-1 20:26:12 | 显示全部楼层 来自 北京
14# shunfly

shunfly老师,谢谢您的帮忙!
      我所说的动态数组指的是在fortran程序里开的动态数组,即FORTRAN SUBROUTINE程序里,后来我将里面的所有动态数组都改为静态数组后试了一下,用MATLAB6.5版本调用就没有出现之前的错误提示,看来真的是在6.5版本下不能调用fortran中含有动态数组的程序。
      不知道我所发现的这个现象对不对,如果哪位老师感兴趣的话也可以帮忙试试,帮我确认一下我所说的这个情况对不对,谢谢!

在这里还要感谢之前messengertaoheljelly、zhoulon 老师的帮忙,谢谢大家!
回复 不支持

使用道具 举报

发表于 2009-6-1 20:53:18 | 显示全部楼层 来自 新加坡
你在装有matlab7.0的电脑上看一个dos窗口,运行"set path",看看结果;然后在装有matlab6.5也就是你现在遇到问题的电脑上也开一个dos窗口,运行“set path”,然后看看和前者有什么不同,也看看能不能给你一些提示。最好把结果贴到这里让我们也学习一下。

另外,你上面提到的那个“现象”应该是没有道理的,mex文件中对于各编程语言的使用是和matlab没有关系的。
回复 不支持

使用道具 举报

发表于 2009-6-1 21:19:05 | 显示全部楼层 来自 广东潮州
仔细看我的程序,里面不是有用MODULE实现的动态数组么?
回复 不支持

使用道具 举报

发表于 2009-6-1 21:51:39 | 显示全部楼层 来自 新加坡
shunfly,你觉得楼主遇到的问题是什么原因呢?或者你能重现他/她的问题吗?

我怀疑是因为在第二台电脑上对于CVF的安装没有作完整,所以CVF的某些DLL没有在系统的path上,导致mex文件执行失败。要是能用Dependence Walker等工具看看那个mex文件可能就知道问题了。
回复 不支持

使用道具 举报

发表于 2009-6-1 22:31:26 | 显示全部楼层 来自 广东潮州
上帝才知道楼主到底遇到什么问题了。我的理解是可能动态数组使用不当。我昨晚试验了下,使用不当会出现可以编译无法调用,出现楼主的错误提示。尤其是需要传入传出的动态数组需要仔细对待。我贴的程序证明动态数组使用是可以的。楼主不愿意给个简单的出错误的代码,我们也只能猜。这样交流,发贴人不累回贴猜的头疼
回复 不支持

使用道具 举报

发表于 2009-6-1 22:53:08 | 显示全部楼层 来自 新加坡
因为对于fortran的动态数组的使用应该和matlab版本无关,而楼主又说了在装有matlab7.0的电脑上用相同的mex源代码可以成功编译和运行该mex文件。

再者,楼主说在这两台电脑上用的CVF编译器是相同的。

于是这个问题变得有点意思了。我觉得有时候猜这样的问题很有意思,嘿嘿。
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Simapps系列直播

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-10-7 07:23 , Processed in 0.058279 second(s), 19 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表