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

关于mxArray

[复制链接]
发表于 2006-3-9 08:59:57 | 显示全部楼层 |阅读模式 来自 四川成都
读了《深入浅出matlab7.x混合编程》一书,感觉很有收获。但学习第三章的例3-6遇到了些问题,编译的时候老是报错,另外关于mxArray我查找help居然找不到,我用的是matlab7.0.0,请老师和各位朋友指教。
关于这个例子,我自己修改了一点,首先mxErrMsgTxt改为mexErrMsgTxt;另外删除了没有用到的data01,data02。
错误提示:E:\MATLAB7\work\examples\mine\tstfhdl.c(31) : error C2275: 'mxArray' : illegal use of this type as an expression
        E:\MATLAB7\extern\include\matrix.h(195) : see declaration of 'mxArray'
E:\MATLAB7\work\examples\mine\tstfhdl.c(31) : error C2065: 'funHandle' : undeclared identifier
E:\MATLAB7\work\examples\mine\tstfhdl.c(32) : error C2275: 'mxArray' : illegal use of this type as an expression
        E:\MATLAB7\extern\include\matrix.h(195) : see declaration of 'mxArray'
E:\MATLAB7\work\examples\mine\tstfhdl.c(32) : error C2065: 'xx' : undeclared identifier
E:\MATLAB7\work\examples\mine\tstfhdl.c(33) : warning C4047: 'function' : 'const struct mxArray_tag *' differs in levels of indirection from 'int '
E:\MATLAB7\work\examples\mine\tstfhdl.c(33) : warning C4024: 'mexPutVariable' : different types for formal and actual parameter 3
E:\MATLAB7\work\examples\mine\tstfhdl.c(34) : warning C4047: 'function' : 'const struct mxArray_tag *' differs in levels of indirection from 'int '
E:\MATLAB7\work\examples\mine\tstfhdl.c(34) : warning C4024: 'mexPutVariable' : different types for formal and actual parameter 3
采用下面的mexCallMATLAB可以运行,但是有警告。
发表于 2006-3-9 11:19:52 | 显示全部楼层 来自 新加坡

Re:请教董维国老师:关于mxArray

Simdroid开发平台
Which C/C++ compiler are you using?

A couple of things to try:
1. try to rename tstfhdl.c to tstfhdl.cpp.
or
2. separate the declaration and assignment of mxArray variables, and put declarations to the top of the function.

Hope this helps.
 楼主| 发表于 2006-3-10 14:21:25 | 显示全部楼层 来自 四川成都

Re:请教董维国老师:关于mxArray

谢谢董老师,我把定义与赋值分开,并把定义放到if 前面去了,可以运行了。结果正确,但编译仍然有warning,我用的是matlab7.0.0版本的 mex命令。您说的complier我不知道具体是怎么回事,我用的是VC6.0我把编译全部的命令给附上来,请老师指点一下,
his is mex, Copyright 1984-2003 The MathWorks, Inc.

-> Default options filename found in D:\Documents and Settings\Administrator\Application Data\MathWorks\MATLAB\R14
----------------------------------------------------------------
->    Options file           = D:\Documents and Settings\Administrator\Application Data\MathWorks\MATLAB\R14\mexopts.bat
      MATLAB                 = E:\MATLAB7
->    COMPILER               = cl
->    Compiler flags:
         COMPFLAGS           = -c -Zp8 -G5 -W3 -DMATLAB_MEX_FILE -nologo
         OPTIMFLAGS          = /MD -O2 -Oy- -DNDEBUG
         DEBUGFLAGS          = /MDd -Zi -Fd"tstfhdl.pdb"
         arguments           =  
         Name switch         = /Fo
->    Pre-linking commands   =  
->    LINKER                 = link
->    Link directives:
         LINKFLAGS           = /dll /export:mexFunction /MAP /LIBPATH:"E:\MATLAB7\extern\lib\win32\microsoft\msvc60" libmx.lib libmex.lib libmat.lib /implib:_lib1998.x
         LINKFLAGSPOST       =  
         Name directive      = /out:"tstfhdl.dll"
         File link directive =  
         Lib. link directive =  
         Rsp file indicator  = @
->    Resource Compiler      = rc /fo "mexversion.res"
->    Resource Linker        =  
----------------------------------------------------------------


--> "cl  -c -Zp8 -G5 -W3 -DMATLAB_MEX_FILE -nologo /Fotstfhdl.obj -IE:\MATLAB7\extern\include -IE:\MATLAB7\simulink\include /MD -O2 -Oy- -DNDEBUG E:\MATLAB7\work\examples\mine\tstfhdl.c"

tstfhdl.c
E:\MATLAB7\work\examples\mine\tstfhdl.c(33) : warning C4090: '=' : different 'const' qualifiers
E:\MATLAB7\work\examples\mine\tstfhdl.c(34) : warning C4090: '=' : different 'const' qualifiers
    Contents of 1998_tmp.rsp:
  tstfhdl.obj
另外我还想请教。为什么搜索mxArray在我的帮助文件里找不到??以及老师前面所说把.c改成。cpp,这两个有什么不同吗。我改成.cpp后不能通过了,错误提示
E:\MATLAB7\work\examples\mine\tstfhdl.cpp(33) : error C2440: '=' : cannot convert from 'const struct mxArray_tag *' to 'struct mxArray_tag *'
        Conversion loses qualifiers
E:\MATLAB7\work\examples\mine\tstfhdl.cpp(34) : error C2440: '=' : cannot convert from 'const struct mxArray_tag *' to 'struct mxArray_tag *'
        Conversion loses qualifiers
 楼主| 发表于 2006-3-10 14:25:56 | 显示全部楼层 来自 四川成都

Re:请教董维国老师:关于mxArray

还有两个问题也想请教一下:
用VC6.0 调试.dll文件的时候,在Project->Setting中Excutable for debug session里面键入E:\MATLAB7\bin\win32\matlab.exe后调试运行,
提示"E:\MATLAB7\bin\win32\MATLAB.exe"does not contain debugging information,
不包含调试信息,不知道如何解决。

还有书中例3.8用的是VC7.1,,我用的是vc6.0,找不到linker Addtional Dependencies和Additional Dependencies选项,也就不知道如何加入库文件和.DEF文件。请大家帮忙,企盼回音
发表于 2006-3-10 21:09:04 | 显示全部楼层 来自 新加坡

Re:请教董维国老师:关于mxArray

首先说例3-6的问题。不好意思,书中列出的这个程序编译有问题,无法正常编译。主要的问题有:
1. mxErrMsgTxt应该为mexErrMsgTxt
2. 变量funHandle和xx的申明应该放到函数的开始。这是C语言的语法要求。
3. 变量funHandle和xx的申明应该为const mxArray*。
4. data1和data2没有用到,应该去掉。

书中列出的代码,以及出版社提供的例子程序下载中的tstfhdl.c都没有修改过来,不过我自己的工作空间的已经改过来了。

关于上面的问题2,在C++语言中则没有类似的规定。所以把tstfhdl.c改名为tstfhdl.cpp后,有可能通过编译,但由于funHandle和xx没有申明成常量,所以还是会有问题。下面附上修改过的tstfhdl.c以及tstfhdl.cpp,它们都已经过测试,可以编译。先贴上tstfhdl.c:
  1. #include <math.h>
  2. #include "mex.h"
  3. void mexFunction(int nlhs, mxArray *plhs[],
  4.     int nrhs, const mxArray *prhs[])
  5. {
  6.     int m, n;
  7.     const mxArray *funHandle;
  8.     const mxArray *xx;
  9.    
  10.   if (nrhs != 2)
  11.     mexErrMsgTxt("The number of input must be two!");
  12.     if (nlhs > 1)
  13.         mexErrMsgTxt("The number of output must be zero or one!");
  14.    
  15.   if ( !mxIsClass(prhs[0], "function_handle") )
  16.   {
  17.     mexErrMsgTxt("The first input must be a function handle!");
  18.   }
  19.    
  20.     m = mxGetM(prhs[1]);
  21.     n = mxGetN(prhs[1]);
  22.     plhs[0] = mxCreateDoubleMatrix(m, n, mxREAL);
  23.   funHandle = prhs[0];
  24.   xx = prhs[1];
  25.   mexPutVariable("base", "xx", xx);
  26.   mexPutVariable("base", "funHandle", funHandle);
  27.   mexEvalString("yy = feval(funHandle, xx);");
  28.   plhs[0] = mexGetVariable("base", "yy");
  29.   /*
  30.   mexCallMATLAB(1, &plhs[0], 2, prhs, "feval");
  31.   */
  32. }
复制代码
发表于 2006-3-10 21:11:22 | 显示全部楼层 来自 新加坡

Re:请教董维国老师:关于mxArray

再贴上C++语言版本tstfhdl.cpp例程,以供参考:
  1. #include <math.h>
  2. #include "mex.h"
  3. void mexFunction(int nlhs, mxArray *plhs[],
  4.     int nrhs, const mxArray *prhs[])
  5. {
  6.     int i, j, m, n;
  7.    
  8.   /* 输入变量为2,一个是函数句柄,另一个是参数*/
  9.   if (nrhs != 2)
  10.     mexErrMsgTxt("The number of input must be two!");
  11.   /*输出变量数目可以为0或者1*/
  12.     if (nlhs > 1)
  13.         mexErrMsgTxt("The number of output must be zero or one!");
  14.    
  15.     /* 第一个输入必须是函数句柄 */
  16.   if ( !mxIsClass(prhs[0], "function_handle") )
  17.   {
  18.     mexErrMsgTxt("The first input must be a function handle!");
  19.   }
  20.    
  21.     /* 得到输入矩阵的大小 */
  22.     m = mxGetM(prhs[1]);
  23.     n = mxGetN(prhs[1]);
  24.     /* 创建输出变量所对应的mxArray */
  25.     plhs[0] = mxCreateDoubleMatrix(m, n, mxREAL);
  26.   /* 使用函数句柄的第一种方法:调用mexEvalString */
  27.   const mxArray *funHandle = prhs[0];
  28.   const mxArray *xx = prhs[1];
  29.   mexPutVariable("base", "xx", xx);
  30.   mexPutVariable("base", "funHandle", funHandle);
  31.   mexEvalString("yy = feval(funHandle, xx);");
  32.   plhs[0] = mexGetVariable("base", "yy");
  33.   /* 使用函数句柄的第二种方法:调用mexCallMATLAB */
  34.   /*
  35.   mexCallMATLAB(1, &plhs[0], 2, prhs, "feval");
  36.   */
  37. }
复制代码
发表于 2006-3-10 21:29:39 | 显示全部楼层 来自 新加坡

Re:请教董维国老师:关于mxArray

zhuiming wrote:
还有两个问题也想请教一下:
用VC6.0 调试.dll文件的时候,在Project->Setting中Excutable for debug session里面键入E:\MATLAB7\bin\win32\matlab.exe后调试运行,
提示"E:\MATLAB7\bin\win32\MATLAB.exe"does not contain debugging information,
不包含调试信息,不知道如何解决。
这个是警告信息,可以忽略。主要是说,VC发觉你要调试程序,而载入的可执行文件matlab.exe并不包含调试信息。这合情合理,因为matlab是正式发布的商业软件,编译它时一定用了优化,不会带调试信息。但这不影响我们需要做的工作,因为我们只是想调试mex文件,而不是matlab本身。
zhuiming wrote:
还有书中例3.8用的是VC7.1,,我用的是vc6.0,找不到linker Addtional Dependencies和Additional Dependencies选项,也就不知道如何加入库文件和.DEF文件。请大家帮忙,企盼回音
附件是针对VC6.0重新写的例3-8,暂称例3-8a。请需要的朋友下载、使用。有问题请反馈。

最后,请不要称呼老师,在这里大家都是朋友,另外,这里只有注册的taohe,没有董维国。谢谢!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
发表于 2006-3-10 21:40:31 | 显示全部楼层 来自 新加坡

Re:请教董维国老师:关于mxArray

mxArray是matlab数据类型在C语言的描述。没见过专门讲解它的文档,不过matlab提供了一系列的API函数,可以被用来在C/C++或者Fortran中和mxArray类型的数据交换信息。了解这些API函数后基本上就能满足绝大多数开发要求。具体文档应该在External Interfaces Reference-->MX Array Manipulation (C).
 楼主| 发表于 2006-3-13 09:18:52 | 显示全部楼层 来自 四川成都

Re:请教董维国老师:关于mxArray

谢谢taohe耐心的解答,受益匪浅。我用了您的针对VC6.0重新写的例3-8,编译没有错误,但是在matlab中运行VC6.0编译后的hellomex.dll时候,出现这样的错误。
Mex file entry point is missing.  Please check the (case-sensitive)
spelling of mexFunction (for C MEX-files), or the (case-insensitive)
spelling of MEXFUNCTION (for FORTRAN MEX-files).
??? Invalid MEX-file 'E:\vcpp32\mine\hellomex\Debug\hellomex.dll': 找不到指定的模块。
请您帮忙看看。谢谢
发表于 2006-3-13 10:36:01 | 显示全部楼层 来自 新加坡

Re:请教董维国老师:关于mxArray

Have you created hellomex.def file?

Please follow the steps carefully one more time.
 楼主| 发表于 2006-3-13 11:36:19 | 显示全部楼层 来自 四川成都

Re:关于mxArray

我创建了hellomex.def,又重新做了一遍,错误完全一样。我创建的hellomex.def是直接点工具栏上的空文件建立的。保存的时候提示后缀名是.txt。我保存成hellomex.def。应该不会有什么问题吧。By the way,我用的是MATLAB 7.0.0。编译后在matlab中用cd命令转到dubug目录,运行hellomex

此外,我还想请教一下,我在MATLAB环境中编译引擎程序engdemo.c,产生的.exe文件运行提示找不到很多dll文件。我一个一个加入到exe目录下后,运行正常。请问taohe,有相关的Include命令吗,不用一个个加。我把加入的dll文件名列一下:
icudt24l.dll,icuin24.dll,icuio24.dll,icuuc24.dll,libeng.dll,libmat.dll,
libmex.dll,libmx.dll,libut.dll,libz.dll,此时可以产生窗口,但弹出窗口提示找不到相关dll,加入dforrt.dll.lapack.dll,atlas_p4.dll后程序正常。

最后,您前面提及您的工作空间,我想拜访学习一下,请问网址是什么。

一直得到您的指导和关心,非常感谢。再次向您表示崇高的敬意。
 楼主| 发表于 2006-3-13 15:41:02 | 显示全部楼层 来自 四川成都

Re:关于mxArray

下午继续学习,又遇到了些小麻烦,还要再麻烦您指教一下
在编写例7-1时候,即“在MFC程序中使用mcc编译后的库函数”:
首先,我的应用环境是windows2000和matlab7.0.0和vc++6.0
我将您的程序稍微改动了一下,否则VC下不能通过,但也许就是这样导致了后面的错误。请您看一下:
1、我在Cmccmfc01Dlg::OnInitDialog函数中将书中的libcopyfigureInitialize()改为libmcctest01Initialize();否则程序报错为'libcopyfigureInitialize' : undeclared identifier。
2、我给Test添加鼠标单击相应事件函数时用ClassWizard时候找不到书中所说的OnBnClickedButtonTest(),我想可能是VC6.0和7.0的区别,采用了OnButtonTest() ;
3、Close按钮和Test一样也有类似的问题,我将书中所说的OnBnClickedButtonClose()改为OnButtonClose();
4、在VC6.0中的添加库函数,我按照您上面指导的方式添加,应该没有问题。
5、初始建立工程文件的时候我选的是MFC AppWizard,然后选的是Dialog Based.
这样改后编译无误,运行提示找不到mclmcrrt70.dll,我将其拷贝到工程目录,可运行,但首先提示在OnInitDialog函数中的“Could not initialize the application",然后出现对话框界面,点击test和Close任何一个按钮,都会报错。终止程序进行。

我比较笨些,不会的比较多,请见谅。但我真心希望能学好,期盼您的回音。
发表于 2006-3-13 20:23:28 | 显示全部楼层 来自 新加坡

Re:请教董维国老师:关于mxArray

zhuiming wrote:
谢谢taohe耐心的解答,受益匪浅。我用了您的针对VC6.0重新写的例3-8,编译没有错误,但是在matlab中运行VC6.0编译后的hellomex.dll时候,出现这样的错误。
Mex file entry point is missing.  Please check the (case-sensitive)
spelling of mexFunction (for C MEX-files), or the (case-insensitive)
spelling of MEXFUNCTION (for FORTRAN MEX-files).
??? Invalid MEX-file 'E:\vcpp32\mine\hellomex\Debug\hellomex.dll'
: 找不到指定的模块。
请您帮忙看看。谢谢

错误信息似乎说的比较清楚,那就是说生成的hellomex.dll并不是个有效的mex文件。一个极有可能的原因就是hellomex.dll并没有导出mexFunction或者导出的函数名不是mexFunction(请注意各个字母的大小写)。

你可以用Visual Studio 6.0的工具depends.exe打开hellomex.dll,如果正常的话,你应该能够看到导出的mexFunction函数。请看附图,这个文件正是我最近编写上面附件关于hellomex和VC6的文档时一步一步地做的,所以我觉得那些步骤是正确的,如果有兴趣,请再仔细比对文档中的步骤。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

评分

1

查看全部评分

发表于 2006-3-13 20:32:20 | 显示全部楼层 来自 新加坡

Re:关于mxArray

zhuiming wrote:
我创建了hellomex.def,又重新做了一遍,错误完全一样。我创建的hellomex.def是直接点工具栏上的空文件建立的。保存的时候提示后缀名是.txt。我保存成hellomex.def。应该不会有什么问题吧。By the way,我用的是MATLAB 7.0.0。编译后在matlab中用cd命令转到dubug目录,运行hellomex
看不出这些步骤会有什么问题。可能是其他那个环节出了错。请记住,一个有效的c语言mex文件必须导出mexFunction函数,注意字母大小写。
zhuiming wrote:
此外,我还想请教一下,我在MATLAB环境中编译引擎程序engdemo.c,产生的.exe文件运行提示找不到很多dll文件。我一个一个加入到exe目录下后,运行正常。请问taohe,有相关的Include命令吗,不用一个个加。我把加入的dll文件名列一下:
icudt24l.dll,icuin24.dll,icuio24.dll,icuuc24.dll,libeng.dll,libmat.dll,
libmex.dll,libmx.dll,libut.dll,libz.dll,此时可以产生窗口,但弹出窗口提示找不到相关dll,加入dforrt.dll.lapack.dll,atlas_p4.dll后程序正常。

最后,您前面提及您的工作空间,我想拜访学习一下,请问网址是什么。

一直得到您的指导和关心,非常感谢。再次向您表示崇高的敬意。

我想可能是因为你的$MATLAB\bin\win32目录没有在系统路径上。检查方法:在DOS窗口运行path,看看path设置里有没有上述目录,没有的话就加上。没有必要把dll文件拷贝到engdemo.exe的目录。
发表于 2006-3-13 20:44:40 | 显示全部楼层 来自 新加坡

Re:关于mxArray

zhuiming wrote:
...
首先,我的应用环境是windows2000和matlab7.0.0和vc++6.0
我将您的程序稍微改动了一下,否则VC下不能通过,但也许就是这样导致了后面的错误。请您看一下:
1、我在Cmccmfc01Dlg::OnInitDialog函数中将书中的libcopyfigureInitialize()改为libmcctest01Initialize();否则程序报错为'libcopyfigureInitialize' : undeclared identifier。
你的改动正确。书上的错了。很抱歉。
2、我给Test添加鼠标单击相应事件函数时用ClassWizard时候找不到书中所说的OnBnClickedButtonTest(),我想可能是VC6.0和7.0的区别,采用了OnButtonTest() ;
3、Close按钮和Test一样也有类似的问题,我将书中所说的OnBnClickedButtonClose()改为OnButtonClose();
4、在VC6.0中的添加库函数,我按照您上面指导的方式添加,应该没有问题。
5、初始建立工程文件的时候我选的是MFC AppWizard,然后选的是Dialog Based.
这些针对VC6的改动都应该是正确的。
这样改后编译无误,运行提示找不到mclmcrrt70.dll,我将其拷贝到工程目录,可运行,但首先提示在OnInitDialog函数中的“Could not initialize the application",然后出现对话框界面,点击test和Close任何一个按钮,都会报错。终止程序进行。

原因可能和engdemo.exe所遇到的错误一样是因为$MATLAB\bin\win32没有在系统路径上。
我比较笨些,不会的比较多,请见谅。但我真心希望能学好,期盼您的回音。
别客气,学习的过程就是这样的,学习的乐趣也就是这样的。知道通过学习获得自己不会的行为是值得赞赏的。

“没有愚蠢的问题,只有愚蠢的回答” --某人语(不是偶)
发表于 2006-3-13 20:57:29 | 显示全部楼层 来自 新加坡

Re:关于mxArray

在matlab的这些接口技术中,我个人最喜欢mex。有空的话,请多琢磨第三章中的例子,尤其是上面提到的tstfhdl,它能使你的mex和matlab更好的互动。掌握了这些技术,能够使得matlab在你的手中变得如虎添翼。书中的例子虽然简单,但是有效地演示了各种技术,这是我在编写此书时努力想要达到的一个目的。但是由于篇幅限制,有些讨论不够突出,导致这些例子所体现的功能有可能被读者忽视。希望感兴趣的朋友在翻阅时最好花点时间体会,这样的话收获可能多一些。
 楼主| 发表于 2006-3-14 14:14:42 | 显示全部楼层 来自 四川成都

Re:关于mxArray

谢谢taohe,我已经解决了例3-8的部分问题,我发现主要问题在于hellomex.def,我编写并保存在工作区间后,没有在工程下Project——>Add to project 里面加入,只是单纯的编写。保存在工程所在目录。回想起来太自己机械了,书中虽然未明确指出,但是也应该想到这一点(因为hellomex.c都是这样加入的),希望给大家起个警示作用吧。这样加入后,可正常编译,生成dll 文件,在MATLAB中运行正常,但是在您所说的Dependcy Walker里面仍然提示找不到相关的dll文件。把所有的加入能够给出您上面图形所显示的那样。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| 发表于 2006-3-14 14:18:47 | 显示全部楼层 来自 四川成都

Re:关于mxArray

点击LIBMEX.DLL可以看到如下图,

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| 发表于 2006-3-14 14:30:56 | 显示全部楼层 来自 四川成都

Re:关于mxArray

此外,我加入了path路径后,果然解决了之前加入一堆dll文件的问题。我的系统路径是在我的电脑———属性——高级里的环境变量中和系统变量中的path里加入的。但对于前面例7-1,还是有一样的错误。我把图贴上来请您再帮忙看看,

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| 发表于 2006-3-14 14:37:43 | 显示全部楼层 来自 四川成都

Re:关于mxArray

这是按了test或close按钮的情况

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

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

本版积分规则

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

GMT+8, 2024-4-28 01:27 , Processed in 0.065187 second(s), 15 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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