reset_again 发表于 2007-4-10 11:51:54

急!Legend与hold等的MATLAB混编问题

实在是不好意思,又来骚扰大家了,先行谢过!
我是MATLAB6.5,VC6.0
在VC里直接使用MATALB C++函数库进行混编。
Vlegend(mwArray("Vp"),mwArray("Vn"),mwArray("Idea-Vp"),mwArray("Idea-Vn")/*,mwArray(-1)*/);
hold(mwArray("On"));
编译没报告错误,但是运行时还是出现runtime error!
然后做了一个有legend和hold的m文件,mcc后,发现是如下定义:
inline void Vlegend(const mwVarargin &in1=mwVarargin::DIN, const mwArray &in2=mwArray::DIN, const mwArray &in3=mwArray::DIN, const mwArray &in4=mwArray::DIN, const mwArray &in5=mwArray::DIN, const mwArray &in6=mwArray::DIN, const mwArray &in7=mwArray::DIN, const mwArray &in8=mwArray::DIN, const mwArray &in9=mwArray::DIN, const mwArray &in10=mwArray::DIN, const mwArray &in11=mwArray::DIN, const mwArray &in12=mwArray::DIN, const mwArray &in13=mwArray::DIN, const mwArray &in14=mwArray::DIN, const mwArray &in15=mwArray::DIN, const mwArray &in16=mwArray::DIN, const mwArray &in17=mwArray::DIN, const mwArray &in18=mwArray::DIN, const mwArray &in19=mwArray::DIN, const mwArray &in20=mwArray::DIN, const mwArray &in21=mwArray::DIN, const mwArray &in22=mwArray::DIN, const mwArray &in23=mwArray::DIN, const mwArray &in24=mwArray::DIN, const mwArray &in25=mwArray::DIN, const mwArray &in26=mwArray::DIN, const mwArray &in27=mwArray::DIN, const mwArray &in28=mwArray::DIN, const mwArray &in29=mwArray::DIN, const mwArray &in30=mwArray::DIN, const mwArray &in31=mwArray::DIN, const mwArray &in32=mwArray::DIN)
{
mwVarargin varargin(in1, in2, in3, in4, in5, in6, in7, in8, in9, in10, in11, in12, in13, in14, in15, in16, in17, in18, in19, in20, in21, in22, in23, in24, in25, in26, in27, in28, in29, in30, in31, in32);
int nrhs = 0;
int nlhs = 0;
MatlabMatrix *plhs;
plhs = NULL;
mwList<MatlabMatrix *, 10> _prhs(0 + varargin.Size());
mxArray **prhs = _prhs.GetData();
varargin.GetArrayBuffer(prhs + 0);
nrhs += varargin.Size();
mlxLegend(nlhs, plhs, nrhs, prhs);
if (plhs != NULL) mxDestroyArray(plhs);
}

inline void hold(const mwArray &in1=mwArray::DIN)
{
MatlabMatrix *prhs;
prhs = (!in1.IsDIN())?in1.GetData():(MatlabMatrix*)(NULL);
mlfHold(prhs);
}


请各位高手帮忙看看,我到底该在VC中怎么使用这两个函数!太感谢了!!!

shunfly 发表于 2007-4-10 14:03:25

void CSimweView::On_Menu_070410()
{
    // Simwe论坛主题ID号771811
    //          提问ID号reset_again
    //          内容    legend,hold on
    //          平台    WINXP + VC6 +MATLAB6.5.1
    //          Shunfly,070410
    mwArray x(0.0,.1,10);
    plot(x,sin(x),mwArray("b"));
    hold(mwArray("on"));
    plot(x,cos(x),mwArray("r"));
    legend(mwVarargin("1","2"));
    hold(mwArray("on"));
    plot(x,2*sin(x),mwArray("g"));
}

[ 本帖最后由 shunfly 于 2007-4-10 14:06 编辑 ]

reset_again 发表于 2007-4-12 08:37:21

怎么上次发的没发上。。。
斑竹,我按如下使用legend,但一运行还是runtime error,请帮我看看:
plot(Grayscale,GVoltageP,Grayscale,GVoltageN,Grayscale,oIdeaGVoltage,Grayscale,oIdeaGVoltageN,GP,VIP,mwArray("bx"),GP,VIN,mwArray("gx"),Whole,mwArray(VCOMH),mwArray("--"),Whole,mwArray(VCOMH)-mwArray(VCOMA),mwArray("--"),mwArray("Parent"), h_a,mwArray("linewidth"),mwArray(1.5)/*,mwArray("color"),VNColor,mwArray("color"),RColor*/);

legend(mwVarargin("Vp","Vn","IVp","IVn"));

但若我把legend这一句改成 legend(mwVarargin("Vp"));则又能显示Vp,可是其他的要显示的标注该怎么解决啊?

shunfly 发表于 2007-4-12 09:17:18

设断点调试看一下吧
多个标注应该是没有问题的
另外
你试试我那个
mwArray x(0.0,.1,10);
    plot(x,sin(x),mwArray("b"));
    hold(mwArray("on"));
    plot(x,cos(x),mwArray("r"));
    legend(mwVarargin("1","2"));


注释掉你的PLOT和LEGEND。看这个可以运行不
ps:你这个PLOT怎么如此长?:lol

reset_again 发表于 2007-4-12 11:07:11

斑竹,偶试了,还是不行,把legend去掉就可以
看来我的怎么不支持这个用法啊?

reset_again 发表于 2007-4-12 11:53:37

斑竹,请加我QQ,我上这个网页好慢!
多谢你了!37709810

shunfly 发表于 2007-4-12 14:52:36

我上面的代码你也用不了?
这就奇怪了
你看看6.5的函数声明吧
或者MCC一个M文件
看看MATLAB编译器怎么翻译的
先运行通再管你的实际的代码

reset_again 发表于 2007-4-12 19:07:26

我mcc了一个含legend的文件,转化后的代码如下:
static void Mtestlegend() {
    mwLocalFunctionTable save_local_function_table_
      = &_local_function_table_testlegend;
    mwArray ans = mwArray::UNDEFINED;
    mwArray x = mwArray::UNDEFINED;
    //
    // x=0:0.1:2*pi;
    //
    x = _mxarray0_;
    //
    // plot(x,sin(x))
    //
    ans.EqPrintAns(Nplot(0, mwVarargin(mwVv(x, "x"), sin(mwVv(x, "x")))));
    //
    // hold on
    //
    hold(_mxarray2_);
    //
    // plot(x,cos(x),'ro')
    //
    ans.EqPrintAns(
      Nplot(0, mwVarargin(mwVv(x, "x"), cos(mwVv(x, "x")), _mxarray4_)));
    //
    // xlabel('x')
    //
    ans.EqPrintAns(Nxlabel(0, _mxarray6_, mwVarargin()));
    //
    // legend('sin(x)','cos(x)',4)
    //
    ans.EqPrintAns(
      Nlegend(0, NULL, mwVarargin(_mxarray8_, _mxarray10_, _mxarray12_)));
}

然后又查了Nlegend的声明,是在#include "libmwsglm.hpp"里面,有四种:

inline void Vlegend(const mwVarargin &in1=mwVarargin::DIN, const mwArray &in2=mwArray::DIN, const mwArray &in3=mwArray::DIN, const mwArray &in4=mwArray::DIN, const mwArray &in5=mwArray::DIN, const mwArray &in6=mwArray::DIN, const mwArray &in7=mwArray::DIN, const mwArray &in8=mwArray::DIN, const mwArray &in9=mwArray::DIN, const mwArray &in10=mwArray::DIN, const mwArray &in11=mwArray::DIN, const mwArray &in12=mwArray::DIN, const mwArray &in13=mwArray::DIN, const mwArray &in14=mwArray::DIN, const mwArray &in15=mwArray::DIN, const mwArray &in16=mwArray::DIN, const mwArray &in17=mwArray::DIN, const mwArray &in18=mwArray::DIN, const mwArray &in19=mwArray::DIN, const mwArray &in20=mwArray::DIN, const mwArray &in21=mwArray::DIN, const mwArray &in22=mwArray::DIN, const mwArray &in23=mwArray::DIN, const mwArray &in24=mwArray::DIN, const mwArray &in25=mwArray::DIN, const mwArray &in26=mwArray::DIN, const mwArray &in27=mwArray::DIN, const mwArray &in28=mwArray::DIN, const mwArray &in29=mwArray::DIN, const mwArray &in30=mwArray::DIN, const mwArray &in31=mwArray::DIN, const mwArray &in32=mwArray::DIN)
{
        mwVarargin varargin(in1, in2, in3, in4, in5, in6, in7, in8, in9, in10, in11, in12, in13, in14, in15, in16, in17, in18, in19, in20, in21, in22, in23, in24, in25, in26, in27, in28, in29, in30, in31, in32);
        int nrhs = 0;
        int nlhs = 0;
        MatlabMatrix *plhs;
        plhs = NULL;
        mwList<MatlabMatrix *, 10> _prhs(0 + varargin.Size());
        mxArray **prhs = _prhs.GetData();
        varargin.GetArrayBuffer(prhs + 0);
        nrhs += varargin.Size();
        mlxLegend(nlhs, plhs, nrhs, prhs);
        if (plhs != NULL) mxDestroyArray(plhs);
}


inline mwArray legend(const mwVarargin &in1=mwVarargin::DIN, const mwArray &in2=mwArray::DIN, const mwArray &in3=mwArray::DIN, const mwArray &in4=mwArray::DIN, const mwArray &in5=mwArray::DIN, const mwArray &in6=mwArray::DIN, const mwArray &in7=mwArray::DIN, const mwArray &in8=mwArray::DIN, const mwArray &in9=mwArray::DIN, const mwArray &in10=mwArray::DIN, const mwArray &in11=mwArray::DIN, const mwArray &in12=mwArray::DIN, const mwArray &in13=mwArray::DIN, const mwArray &in14=mwArray::DIN, const mwArray &in15=mwArray::DIN, const mwArray &in16=mwArray::DIN, const mwArray &in17=mwArray::DIN, const mwArray &in18=mwArray::DIN, const mwArray &in19=mwArray::DIN, const mwArray &in20=mwArray::DIN, const mwArray &in21=mwArray::DIN, const mwArray &in22=mwArray::DIN, const mwArray &in23=mwArray::DIN, const mwArray &in24=mwArray::DIN, const mwArray &in25=mwArray::DIN, const mwArray &in26=mwArray::DIN, const mwArray &in27=mwArray::DIN, const mwArray &in28=mwArray::DIN, const mwArray &in29=mwArray::DIN, const mwArray &in30=mwArray::DIN, const mwArray &in31=mwArray::DIN, const mwArray &in32=mwArray::DIN)
{
        mwVarargin varargin(in1, in2, in3, in4, in5, in6, in7, in8, in9, in10, in11, in12, in13, in14, in15, in16, in17, in18, in19, in20, in21, in22, in23, in24, in25, in26, in27, in28, in29, in30, in31, in32);
        int nrhs = 0;
        int nlhs = 1;
        MatlabMatrix *plhs;
        plhs = NULL;
        mwList<MatlabMatrix *, 10> _prhs(0 + varargin.Size());
        mxArray **prhs = _prhs.GetData();
        varargin.GetArrayBuffer(prhs + 0);
        nrhs += varargin.Size();
        mlxLegend(nlhs, plhs, nrhs, prhs);
        return plhs;
}


inline mwArray legend(mwArray *out1, const mwVarargin &in1=mwVarargin::DIN, const mwArray &in2=mwArray::DIN, const mwArray &in3=mwArray::DIN, const mwArray &in4=mwArray::DIN, const mwArray &in5=mwArray::DIN, const mwArray &in6=mwArray::DIN, const mwArray &in7=mwArray::DIN, const mwArray &in8=mwArray::DIN, const mwArray &in9=mwArray::DIN, const mwArray &in10=mwArray::DIN, const mwArray &in11=mwArray::DIN, const mwArray &in12=mwArray::DIN, const mwArray &in13=mwArray::DIN, const mwArray &in14=mwArray::DIN, const mwArray &in15=mwArray::DIN, const mwArray &in16=mwArray::DIN, const mwArray &in17=mwArray::DIN, const mwArray &in18=mwArray::DIN, const mwArray &in19=mwArray::DIN, const mwArray &in20=mwArray::DIN, const mwArray &in21=mwArray::DIN, const mwArray &in22=mwArray::DIN, const mwArray &in23=mwArray::DIN, const mwArray &in24=mwArray::DIN, const mwArray &in25=mwArray::DIN, const mwArray &in26=mwArray::DIN, const mwArray &in27=mwArray::DIN, const mwArray &in28=mwArray::DIN, const mwArray &in29=mwArray::DIN, const mwArray &in30=mwArray::DIN, const mwArray &in31=mwArray::DIN, const mwArray &in32=mwArray::DIN)
{
        mwVarargin varargin(in1, in2, in3, in4, in5, in6, in7, in8, in9, in10, in11, in12, in13, in14, in15, in16, in17, in18, in19, in20, in21, in22, in23, in24, in25, in26, in27, in28, in29, in30, in31, in32);
        int nrhs = 0;
        int nlhs = 1;
        MatlabMatrix *plhs;
        plhs = NULL;
        if (out1 != NULL) {
          plhs=NULL;
        }
        mwList<MatlabMatrix *, 10> _prhs(0 + varargin.Size());
        mxArray **prhs = _prhs.GetData();
        varargin.GetArrayBuffer(prhs + 0);
        nrhs += varargin.Size();
        mlxLegend(nlhs, plhs, nrhs, prhs);
        if (out1 != NULL) *out1 = plhs;
        return plhs;
}


inline mwArray Nlegend(int nargout, mwArray *out1, const mwVarargin &in1=mwVarargin::DIN, const mwArray &in2=mwArray::DIN, const mwArray &in3=mwArray::DIN, const mwArray &in4=mwArray::DIN, const mwArray &in5=mwArray::DIN, const mwArray &in6=mwArray::DIN, const mwArray &in7=mwArray::DIN, const mwArray &in8=mwArray::DIN, const mwArray &in9=mwArray::DIN, const mwArray &in10=mwArray::DIN, const mwArray &in11=mwArray::DIN, const mwArray &in12=mwArray::DIN, const mwArray &in13=mwArray::DIN, const mwArray &in14=mwArray::DIN, const mwArray &in15=mwArray::DIN, const mwArray &in16=mwArray::DIN, const mwArray &in17=mwArray::DIN, const mwArray &in18=mwArray::DIN, const mwArray &in19=mwArray::DIN, const mwArray &in20=mwArray::DIN, const mwArray &in21=mwArray::DIN, const mwArray &in22=mwArray::DIN, const mwArray &in23=mwArray::DIN, const mwArray &in24=mwArray::DIN, const mwArray &in25=mwArray::DIN, const mwArray &in26=mwArray::DIN, const mwArray &in27=mwArray::DIN, const mwArray &in28=mwArray::DIN, const mwArray &in29=mwArray::DIN, const mwArray &in30=mwArray::DIN, const mwArray &in31=mwArray::DIN, const mwArray &in32=mwArray::DIN)
{
        mwVarargin varargin(in1, in2, in3, in4, in5, in6, in7, in8, in9, in10, in11, in12, in13, in14, in15, in16, in17, in18, in19, in20, in21, in22, in23, in24, in25, in26, in27, in28, in29, in30, in31, in32);
        int nrhs = 0;
        int nlhs = nargout;
        MatlabMatrix *plhs;
        plhs = NULL;
        mwList<MatlabMatrix *, 10> _prhs(0 + varargin.Size());
        mxArray **prhs = _prhs.GetData();
        varargin.GetArrayBuffer(prhs + 0);
        nrhs += varargin.Size();
        mlxLegend(nlhs, plhs, nrhs, prhs);
        if (nlhs > 1) {
          if (out1 != NULL) *out1 = plhs;
        }
        return plhs;
}

reset_again 发表于 2007-4-12 19:20:37

忘记说了,mcc后再在VC里用就可以,奇怪啊,不知道 是哪里不对

ibrave 发表于 2010-9-9 08:59:24

请问这位大侠,你的问题最后是怎么解决的!小弟也遇到了这个问题?

ibrave 发表于 2010-9-9 09:05:59

9# reset_again
请问这位大侠,你的问题最后是怎么解决的!小弟也遇到了这个问题?

ibrave 发表于 2010-9-9 10:54:21

4# shunfly
您好!
       我的问题和他描述的一样,如果使用legend(mwArray("1")) 没有问题,但是当多个输入参数时例如:legend(mwArray("1"),mwArray("2")) ,运行时出现Runtime Error!
尝试了很多种方法,但是没有仍没有解决,是不是我的函数库有问题?很是迷惑,请指教!

lengyunfeng 发表于 2010-9-9 11:02:08

12# ibrave

你的语句用得有问题,没有理解shunfly的语句,可以把你的改成: legend(mwVarargin("1","2"));
这里要注意mwVarargin表示的是lengend函数的输入参数;而你在llegend(mwArray("1"),mwArray("2")) 里的mwArray表示的是输入符号数组。

ibrave 发表于 2010-9-9 12:28:49

13# lengyunfeng 谢谢您的回复!
我也尝试了 legend(mwVarargin("1","2"));但是还是运行到inline mwArray legend(......)函数里面的mlxLegend(nlhs, plhs, nrhs, prhs)出现Runtime Error!但是shunfly 就可以,所以很是奇怪我这里那里出现了问题。
代码如下:

mwArray x(0.0,.1,10);
plot(x,sin(x),mwArray("b"));
plot(x,cos(x),mwArray("r"));

legend(mwVarargin("1","2"));

plot(x,2*sin(x),mwArray("g"));

/*
    mxChar _array7_ = { '1' };
   mwArray _mxarray6_ = mclInitializeString(1, _array7_);
legend(_mxarray6_);//成功
    mxChar _array9_ = { '2' };
    mwArray _mxarray8_ = mclInitializeString(1, _array9_);
   legend(mwVarargin("1","2"));//出错
   Nlegend(0, NULL, NULL, NULL, mwVarargin(_mxarray6_, _mxarray8_));//出错
    Vlegend(mwVarargin(_mxarray6_, _mxarray8_));//出错
*/

lengyunfeng 发表于 2010-9-9 19:23:02

本帖最后由 lengyunfeng 于 2010-9-9 19:24 编辑

14# ibrave

混编我不是很懂,尤其是在你的“/*”和“*/”之间的东西。不过我看你的程序从开始往下第一个legend之前画了两条曲线,然后用legend(mwVarargin("1","2"));,按你的意思是这里没出错;接下来你在未hold on的情况下只画了一条曲线,导致图里只剩一条曲线,所以你在“/*”和“*/”之间里的第一个legend(_mxarray6_);没出错。接下来你在未画图的情况下又再次用了legend(mwVarargin("1","2"));语句。这里肯定要出问题的,因为你的图里只有一条曲线啊!!!

ibrave 发表于 2010-9-9 21:09:00

本帖最后由 ibrave 于 2010-9-9 21:15 编辑

15# lengyunfeng
我按着shunfly的代码也操纵了一下,还是出错,    mwArray x(0.0,.1,10);
    plot(x,sin(x),mwArray("b"));
    hold(mwArray("on"));
    plot(x,cos(x),mwArray("r"));
    legend(mwVarargin("1","2"));
图中有三种情况:
1.注释legend(mwVarargin("1","2"));可以运行;
2.没有注释legend(mwVarargin("1","2"));出错
3.legend(mwVarargin("1"));只输入一个参数也可以运行,为什么输入两个参数就出错呢?
再次感谢!!!

lengyunfeng 发表于 2010-9-9 21:54:59

To 16#

这可能是你VC环境设置的问题吧,你第二张图上提示信息很多软件好像都出现过,你可以看看http://forums.oracle.com/forums/ ... D=859451&tstart=195,http://hi.baidu.com/wytzsjzly/bl ... bdbbac4723e8c1.html以及http://proxxb-sys.spaces.live.co ... logview&_c=BlogPart。

btw,shunfly的命令能运行不出错,而你的不行,可能的原因有很多,想找到哪个环节出错,你可以按shunfly的运行环境再试一下,比如他的运行平台是WINXP + VC6 +MATLAB6.5.1。如果你的matlab版本或者vc版本与它不符的话,可能就不能实现。我觉得你的问题可能出在matlab版本过新上。

ibrave 发表于 2010-9-10 08:57:03

17# lengyunfeng 非常感谢你耐心的回答!
昨天一个在一个朋友的帮忙下问题解决了!
思路:当给legend输入一个参数可以运行,所以我们就尝试用vertcat这个函数
          合并所需添加的legend字符。
具体方法:
mwArray x(0.0,.1,10);
plot(x,sin(x),mwArray("b"));
hold(mwArray("on"));
plot(x,cos(x),mwArray("r"));
mwArray mwLegend=vertcat("1","2");
legend(mwLegend);
页: [1]
查看完整版本: 急!Legend与hold等的MATLAB混编问题