MatLab图形用户界面故障:计算积分

MatLab图形用户界面故障:计算积分,matlab,matlab-guide,Matlab,Matlab Guide,我已经创建了一个MatlabGUI,用户可以在其中选择一个变量来集成输入、方程以及下限和上限。当我的代码去计算按钮回调上的积分时,我得到了一个我不理解的错误 这是导致错误的代码行: i1 = int( eval(get(handles.edit1,'string')), (handles.respectvar), get(handles.edit3), get(handles.edit2) ); %respactva

我已经创建了一个MatlabGUI,用户可以在其中选择一个变量来集成输入、方程以及下限和上限。当我的代码去计算按钮回调上的积分时,我得到了一个我不理解的错误

这是导致错误的代码行:

i1 = int( eval(get(handles.edit1,'string')),
          (handles.respectvar), 
          get(handles.edit3),
          get(handles.edit2)
        );
%respactvar是用户选择的变量,edit3和edit2是下限和上限

这是错误消息:

使用sym>tomupad时出错(第1135行) 无法从“struct”转换为“sym”

sym中的错误(第151行) S.S=tomupad(x)

sym/int中的错误(第142行) b=符号(b)

projectCALC>pushbutton1_回调中出错(第376行) i1=int(eval(get(handles.edit1,'string'),(handles.reservar),get(handles.edit3),get(handles.edit2))

gui_mainfcn中的错误(第95行) feval(varargin{:})

projectCALC中的错误(第42行) gui_mainfcn(gui_State,varargin{:})

@(hObject,eventdata)projectCALC('pushbutton1_Callback',hObject,eventdata,guidata(hObject))中出错

计算UIControl回调时出错


谢谢大家!

您的代码存在多个问题

第一个问题是,您忘记了
获取最后两个编辑框的
字符串
属性,而您对第一个编辑框进行了此操作

第二个问题是
eval
效率很低,而且在您的情况下,非常不安全。如果有人在editbox中编写了一个
system()
调用,删除了你的硬盘驱动器,会怎么样

第三个问题是,即使使用
eval
str2func
int
也要求其第一个参数是符号表达式。这是一件好事:实际上不必使用
eval
,只需将第一个字符串转换为
sym

第四个问题是
handles.reservar
似乎也是一个GUI对象,因此您可能需要
get()

假设我的怀疑是正确的,并且您的
edit1
包含一个类似
'3*x+y'
的字符串,
edit2
edit3
是限制,例如
'1'
'3'
以及
句柄。reservar
有一个计算结果为
'x'
的属性,那么您应该调用它

formula = sym(get(handles.edit1,'string'));
variable = handles.respectvar;    %// more likely: get(handles.respectvar,...)
lim1 = str2double(get(handles.edit3,'string'));
lim2 = str2double(get(handles.edit2,'string'));
i1 = int(formula,variable,lim1,lim2);
请注意:

  • 不要害怕使用临时变量,因为它有助于提高可读性
  • 我将
    公式
    sym
    转换为
    字符串
    ,否则会出现警告或错误(取决于MATLAB版本)
  • 我留下了
    lim1
    edit3
    lim2
    edit2
    的顺序。确保这确实是您想要的,并且订单不会颠倒
  • 我将积分限制转换为
    double
    ,但似乎
    sym/int
    也将接受字符串输入作为限制变量,因此这主要是为了清楚起见

您需要从包含积分限制的编辑框中获取字符串,并将其转换为数字数据类型
get(handles.edit3)
将只返回对象属性的结构。此外,使用
eval
效率低且不安全,尤其是当您正在评估用户在框中输入的内容时。如果是
系统
呼叫怎么办?你确定你不能避免使用
eval
?@AndrasDeak虽然这并没有解决安全问题,但我认为这类事情没有任何方法可以绕过
eval
。我几乎肯定str2func
只是
eval
的一个包装器,但我没有MATLAB可供检查。@excaza,表明它更好。在R2012b上,
str2func('system('echo oops!''),
将发出警告(在将来的版本中可能是错误)并且不执行该命令(当然可以,
str2func('@()system('echo oops!''))
可以通过
int
计算以造成伤害)。另外,
str2func
是一个编译的内置程序。@excaza感谢您的帮助!我将get(handles.edit3)和另一个放在str2double()中。我不再收到错误,但无论我键入什么,结果框都会显示NaN。i1=int(eval(get(handles.edit1,'string'),(handles.reservar),str2double(get(handles.edit3)),str2double(get(handles.edit2));非常感谢你!当我在互联网上四处阅读时,我确实了解到评估是多么不安全,但当时我不知道有任何其他方法。首先,把它当作一个符号会让它变得更好。我将在我的项目的其余部分记住这一点@CarlyHauser我很高兴能帮上忙:)几乎总是有比
eval
更好的选择。祝其他人好运!