2017-04-19 56 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