2016-04-13 14 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

統合制限を含むエディットボックスから文字列を取得し、数値データ型に変換する必要があります。 'get(ハンドル。edit3) 'は、オブジェクトのプロパティの構造体を返します。 – excaza

+0

また、 'eval'を使うことは、特にあなたがボックスに入力した何かを評価している場合、非効率で危険な*です。それが 'system'呼び出しの場合はどうなりますか? 'eval'の使用を避けることはできませんか? –

+0

@AndrasDeakこれはセキュリティ上の懸念事項には言及していませんが、私はこの種のものに対して 'eval'を回避する方法はないと思います。私はほぼ肯定的です。 'str2func'は' eval'の単なるラッパーですが、MATLABをチェックすることはできません。 – excaza

答えて

0

コードに複数の問題があります。

@excaza notedのような最初の問題は、最後の2つの編集ボックスのgetstringプロパティを忘れてしまったことです。

第2の問題は、evalが非常に非効率的で、あなたのケースでは非常に危険であるということです。誰かがsystem()を編集ボックスに書き込んでハードディスクを消去した場合はどうなりますか?

evalまたはstr2funcであっても、intは、最初の引数が記号式である必要があります。これは良いことです:実際にevalを使用する必要はありません。最初の文字列をsymに変換するだけです。

第4の問題は、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); 
を呼ぶべきであると仮定すると

いくつかの注意事項:

  • は、それが再に役立ちます一時変数を使用することを恐れてはいけません適性
  • 私はlim1 <の順序左
  • そうしないと、(MATLABのバージョンによって異なります)警告やエラーを取得し、stringsymからformulaを変換 - >edit2 - >edit3lim2 <を。これが確かにあなたが望むものであることを確かめ、注文は元に戻されません。
  • 私は積分限界をdoubleに変換しましたが、sym/intは限界入力変数として文字列入力も受け入れているようです。
+0

ありがとう!私がインターネット上で読んでいたとき、私は安全でない評価がどれほど可能かを知りましたが、当時私は他の方法について知らなかったのです。最初にシンボルとしてそれを作成すると、ずっと良くなりました。私は私のプロジェクトの残りの部分でこれを覚えています! –

+0

@CarlyHauser私は助けてくれるとうれしいです:)ほとんどの場合、evalに代わるより良い方法があります。残りの部分と幸運! –

関連する問題