2016-04-13 20 views
0

Bir kullanıcının bir değişken, girdi, denklemi girme ve alt ve üst limitleri ile entegre etmek için bir değişken seçtiği bir matlab GUI yarattım. Kodum pushbutton Callback üzerindeki integrali hesaplamaya gittiğinde, anlamadığım bir hata alıyorum.MatLab GUI Sorunları: Bir İntegral hesaplanıyor

Bu hataya neden kod satırı:

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.

Ve bu hata iletisi:

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

teşekkür ederiz!

+3

Tümleştirme sınırlarınızı içeren düzenleme kutularından dizeleri almanız ve bunları sayısal veri türüne dönüştürmeniz gerekir. '(Kolları almak.edit3) 'sadece nesnenin özelliklerinin bir yapısını döndürür. – excaza

+0

Ayrıca, “eval” kullanımı etkisiz ve * güvenli olmayan *, özellikle de kullanıcının kutuya girdiği bir şeyi değerlendiriyorsanız. Ya bir "sistem" çağrısı ise? "Eval" kullanmanın önüne geçemeyeceğinizden emin misiniz? –

+0

@AndrasDeak Bu, güvenlik konusunu ele almasa da, bu tür şeyler için "eval" etrafında bir yol olduğunu düşünmüyorum. Neredeyse pozitif 'str2func' sadece 'eval' için bir sarıcı ama kontrol etmek için MATLAB'ım yok. – excaza

cevap

0

Kodunuzda çok sayıda sorun var.

@excaza noted gibi ilk sorun, ilk iki kişi için bunu yaparken son iki düzenleme kutusunun getstring özelliğini unuttuğunuzdır.

İkinci sorun, eval'un çok verimsiz olması ve sizin durumunuzda çok güvensiz olmasıdır. Birisi düzenleme kutusuna system() çağrı yazdıysa, sabit sürücünüzü sildiyse?

Üçüncü sorun, eval veya str2func, int ile bile ilk argümanın sembolik bir ifade olmasını gerektirmesidir. Bu iyi bir şey: aslında eval'u kullanmanız gerekmiyor, sadece ilk dizginizi sym'a dönüştürmeniz gerekiyor.

Dördüncü sorun, handles.respectvar'un da bir GUI nesnesi gibi görünmesidir, bu nedenle bir tümleştirme değişkeni olarak kullanabilmek için get() bazı özelliklerine gereksiniminiz olabilir.

benim şüphe doğrudur ve sizin edit1'3*x+y', edit2 ve edit3 gibi bir dize böyle '1' ve '3' olarak sınırları içerir ve handles.respectvar sonra

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); 
arayarak gerektiğini 'x' olarak değerlendirilen bir özelliğe sahip olduğunu varsayarsak

birkaç not:

  • o re yardımcı nerede geçici değişkenleri kullanarak korkmayın adability. >edit3, lim2 < - ->edit2
  • başka türlü bir uyarı veya bir hata (MATLAB sürümüne bağlı)
  • Ben lim1 < sırasını sol olsun, string için sym den formula dönüştürdü. Bunun gerçekten istediğiniz şey olduğundan ve siparişlerin tersine çevrilmediğinden emin olun.
  • Entegrasyon limitlerini double'a dönüştürdüm, ancak sym/int da limit değişkenleri olarak string girişini kabul edecek gibi görünüyor, dolayısıyla bu çoğunlukla açıklık içindir.
+0

Çok teşekkür ederim! İnternette okuduğum gibi, güvensiz değerlendirmenin ne olabileceğini öğrendim, ama o zaman başka bir yöntem bilmiyordum. İlk etapta bir sembol olarak davranmak onu çok daha iyi hale getiriyor. Bunu projemin geri kalanında hatırlayacağım! –

+0

@CarlyHauser Yardım edebildiğime sevindim :) 'eval' için neredeyse her zaman daha iyi bir alternatif var. Geri kalanlarla iyi şanslar! –