2017-04-19 49 views
0

我使用Matlab對拉伸測試分析的GUI進行了硬編碼。鎖定結構內容

當調用我decalare Results結構等都含有從分析所有結果的GUI和欲.mat文件存儲它與分析(應力 - 應變曲線,尺寸等)

期間創建的所有數據當GUI開始爲nan時,聲明Results.whatever,並在回調中設置適當的值。當我做一個錯字,它只是新的附加價值Results.whtever不拋出任何錯誤,警告,無論...

有一些方法,如何在回調例程

  • 防止新的結構定義(一個或多個)即將發生。即Results.whtever=1拋出錯誤,而Results.whatever=1不會。
  • 編輯結構內容而不是重新定義它I.e. foo(Results.whtever,1)拋出錯誤,而foo(Results.whatever,1)不會。

編輯:代碼段

% GUI initiation (declaring nested variables) 
function=runGUI 
% code 

Results.Rpt=nan; 

% another code 

    % Callback using nested variables Results and DataArray 
    function PushFoo 
    % more code 
    RP=find(DataArray(:,11)>0.2,1,'first'); 
    Results.RPt=round(DataArray(RP,9)); 
    % yet another code 
    end 
end 

切到代碼段;它看起來不是問題,但隨着請求的增加代碼變得越來越長。

+1

你能解釋一下什麼地方你是否正在犯這個錯字,以及當前如何存儲/使用該值?在您的回調中,您可以使用'isfield'來確保該字段當前存在,而不是添加新字段... – tmpearce

回答

2
  1. 沒有這個不可能,你只需要仔細檢查你的代碼是否有錯別字。您可以檢查字段的數量,以確保它總是你所期望的,但僅此而已

    assert(numel(fieldnames(Results)) == 1, 'You have a typo or something') 
    
  2. 使用set當然拋出一個錯誤,它不是爲struct數據類型定義。如果這是一個GUIDE GUI,那麼你的GUI最簡單的方法是保存數字

    Results.whatever = 1; 
    handles.Results = Results; 
    
    % Save it in the GUI 
    guidata(hObject, handles) 
    

    交替的guidata內的數據,你可以在你的身影UserData屬性中其存儲

    % Get the stored value 
    Results = get(gcbf ,'UserData'); 
    
    % Change the value 
    Results.whatever = 1; 
    
    % Save it again 
    set(gcbf, 'UserData', Results) 
    
  3. 另一種選擇是使用handle類而不是struct,它將通過引用傳遞。我寫了structobj,它基本上創建了一個handle類,其行爲類似於struct

+0

對不起,您的'set'評論無效。我是關於'set'的功能,而不是使用'set'本身。 – Crowley

1

雖然我覺得Suever's answer#3將是最合適的一個通用的「結果」數據結構,另一種方法可以是自定義數據類:

classdef crowleydata < handle 
    properties 
     aproperty 
     anotherproperty 
    end 

    methods 
     function myObj = crowleydata(myObj) 
      if nargout == 0 
       % No instance if an output variable isn't specified 
       clear myObj; 
      end 
     end 
    end 
end 

,你可以用你的GUI實例初始化和所有需要的資料貯存在類的屬性:

>> results = crowleydata(); 
>> results.aproperty = 2 

results = 

    crowleydata with properties: 

      aproperty: 2 
    anotherproperty: [] 

>> results.thing = 5 
No public property thing exists for class testcode. 

這種方法的好處是,你可以create methods特異性T o您可以在任何設置中使用的數據,例如GUI可以調用的繪圖例程,而不是將行爲硬編碼到GUI本身。

這種方法還允許類型的執法,如果我們稍微改變我們的properties塊:

properties 
    [email protected]  % Undocumented syntax, works >= R2012a (and probably older) 
    anotherproperty double % Documented syntax introduced in R2016a 
end 

我們可以得到如下:

>> a = crowleydata(); 
>> a.aproperty = 2 

a = 

    crowleydata with properties: 

      aproperty: 2 
    anotherproperty: [] 

>> a.aproperty = 'hi' 
Error setting property 'aproperty' of class 'crowlydata': 
Value must be 'double'. 
+0

看起來簡單而強大。我認爲這是新項目的好方法;我覺得我現在太過分了。 – Crowley

+0

除了添加一行來初始化之外,沒有必要對您現有的GUI代碼進行更改。 – excaza