2016-04-13 126 views
0

我已經創建了一個matlab GUI,用戶在其中選擇一個變量進行積分,輸入方程,以及下限和上限。當我的代碼去計算按鈕回調的積分時,我得到一個我不明白的錯誤。MatLab GUI麻煩:計算積分

這是代碼導致錯誤行:

i1 = int(eval(get(handles.edit1,'string')), 
      (handles.respectvar), 
      get(handles.edit3), 
      get(handles.edit2) 
     ); 

%respactvar is the user-selected variable, and edit3 and edit2 are the lower and upper limits.

這是錯誤消息:

Error using sym>tomupad (line 1135) Conversion to 'sym' from 'struct' is not possible.

Error in sym (line 151) S.s = tomupad(x);

Error in sym/int (line 142) b = sym(b);

Error in projectCALC>pushbutton1_Callback (line 376) i1=int(eval(get(handles.edit1,'string')),(handles.respectvar),get(handles.edit3),get(handles.edit2));

Error in gui_mainfcn (line 95) feval(varargin{:});

Error in projectCALC (line 42) gui_mainfcn(gui_State, varargin{:});

Error in @(hObject,eventdata)projectCALC('pushbutton1_Callback',hObject,eventdata,guidata(hObject))

Error while evaluating UIControl Callback

謝謝!

+3

您需要從包含集成限制的編輯框中獲取字符串,並將它們轉換爲數字數據類型。 '得到(句柄。edit3)'只會返回對象屬性的結構。 – excaza

+0

此外,使用'eval'效率低且不安全*,特別是如果您正在評估用戶在框中輸入的內容。如果這是一個「系統」調用呢?你確定你不能避免使用'eval'嗎? –

+0

@AndrasDeak雖然這並沒有解決安全問題,但我認爲對於這種事情我沒有辦法解決'eval'。我幾乎肯定'str2func'只是'eval'的一個包裝器,但我沒有MATLAB可用來檢查。 – excaza

回答

0

您的代碼有多個問題。

第一個問題,因爲@excaza noted,是你忘了get的最後兩個編輯框的string屬性,當你這樣做的第一個。

第二個問題是eval效率非常低,在您的情況下,非常不安全。如果有人寫了system()調用進入編輯框,擦除硬盤驅動器會怎麼樣?

第三個問題是即使使用evalstr2func,int也要求其第一個參數是符號表達式。這是一件好事:您實際上不必使用eval,您只需將第一個字符串轉換爲sym即可。

第四個問題是handles.respectvar也似乎是一個GUI對象,因此您可能需要get()某些屬性才能將其用作集成變量。

假設我的懷疑是正確的,你的edit1包含像'3*x+y'edit2edit3字符串是限制如'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); 
屬性

的幾個注意事項:

  • 不要害怕使用臨時變量它有助於重新adability。
  • 我轉換formulasymstring,否則你會得到一個警告或錯誤(取決於MATLAB版)
  • 我離開的lim1 <順序 - >edit3lim2 < - >edit2。確保這確實是你想要的,並且訂單不會倒過來。
  • 我將積分限制轉換爲double,但似乎sym/int也將接受字符串輸入作爲限制變量,所以這主要是爲了清楚起見。
+0

非常感謝!當我在網上閱讀的時候,我瞭解了不安全評估的可能性,但當時我不知道其他方法。首先將它作爲一個符號進行處理使其更好。我會在我的其餘項目中記住這一點! –

+0

@CarlyHauser我很高興我可以幫助:)幾乎總是有更好的選擇'eval'。祝好運! –