我创建了一个matlab GUI,用户可以在其中选择要相关的变量,输入等式,以及下限和上限。当我的代码去计算按钮回调时的积分时,我得到一个我不明白的错误。
这是导致错误的代码行:
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 = sym(b);
projectCALC中的错误> pushbutton1_Callback(第376行) I1 = INT(EVAL(得到(handles.edit1, '字符串')),(handles.respectvar),得到(handles.edit3),得到(handles.edit2));
gui_mainfcn出错(第95行) feval(varargin {:});
projectCALC出错(第42行) gui_mainfcn(gui_State,varargin {:});
@(hObject,eventdata)projectCALC('pushbutton1_Callback',hObject,eventdata,guidata(hObject))中的错误
评估UIControl回调时出错
谢谢!
答案 0 :(得分:0)
您的代码存在多个问题。
第一个问题,@excaza noted,就是您忘记了get
最后两个编辑框的string
属性,而您为第一个编辑框执行了此操作。
第二个问题是eval
非常低效,而且在你的情况下,非常不安全。如果有人在编辑框中写了system()
电话,擦除你的硬盘怎么办?
第三个问题是,即使使用eval
或str2func
,int
也要求其第一个参数为符号表达式。这是一件好事:您实际上不必使用eval
,只需将第一个字符串转换为sym
。
第四个问题是handles.respectvar
似乎也是一个GUI对象,所以你可能需要为它get()
一些属性才能将它用作集成变量。
假设我的怀疑是正确的,并且您的edit1
包含'3*x+y'
之类的字符串,则edit2
和edit3
是'1'
和{{}等限制1}},'3'
有一个评估为handles.respectvar
的属性,那么你应该调用
'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);
从formula
转换为sym
,否则会收到警告或错误(取决于MATLAB版本)string
< - >的顺序了。 lim1
,edit3
< - > lim2
。确保这确实是你想要的,订单不会逆转。edit2
,但似乎double
也会接受字符串输入作为限制变量,所以这主要是为了清晰起见。