锁定结构内容

时间:2017-04-19 16:29:46

标签: matlab debugging struct

我正在使用Matlab对用于拉伸测试分析的GUI进行硬编码。

当调用GUI时,我将decalare Results struct包含分析的所有结果,并且我想将它存储在.mat文件中,其中包含分析过程中创建的所有数据(应力 - 应变曲线,尺寸,等)

当GUI开始为Results.whatever并且在回调中设置了适当的值时,将声明nan。当我输入错字时,它只会附加新的Results.whtever值,而不会抛出任何错误,警告,无论如何......

有什么方法,如何:

  • 防止回调例程中的新结构定义发生。即Results.whtever=1Results.whatever=1会抛出错误。
  • 编辑结构内容而不是重新定义它。 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

剪切到片段;它看起来不是一个问题,但随着请求的增加,代码变得越来越长。

2 个答案:

答案 0 :(得分:2)

  1. 不,这不可能,您只需要仔细检查您的代码是否有拼写错误。您可以检查字段数量,以确保它始终是您所期望的但是关于它

    assert(numel(fieldnames(Results)) == 1, 'You have a typo or something')
    
  2. 当然使用set会引发错误,但没有为struct数据类型定义错误。如果这是GUIDE GUI,那么GUI的最简单选项是将数据保存在图中的guidata

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

    或者,您可以将其存储在图中的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类。

答案 1 :(得分: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特定于您可以在任何设置中使用的数据,例如GUI可以调用的绘图例程,而不是将行为硬编码到GUI本身。

如果我们稍微改变我们的properties块:

,这种方法也允许类型强制执行
properties
    aproperty@double        % 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'.