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