首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >锁定结构内容

锁定结构内容
EN

Stack Overflow用户
提问于 2017-04-19 16:29:45
回答 2查看 42关注 0票数 0

我正在用Matlab硬编码一个用于拉伸测试分析的GUI。

当调用图形用户界面时,Results结构包含分析的所有结果,我希望用分析过程中创建的所有数据(应力-应变曲线、尺寸等)来存储.mat文件。

Results.whatever是在GUI启动为nan并在回调中设置适当值时声明的。当我做一个错误,它只是附加新的Results.whtever值,没有抛出任何错误,警告,任何.

有没有办法,如何:

  • 防止回调例程中出现新的结构定义。也就是说,Results.whtever=1抛出一个错误,而Results.whatever=1不抛出一个错误。
  • 编辑结构内容,而不是重新定义它,例如,foo(Results.whtever,1)抛出一个错误,而foo(Results.whatever,1)不抛出错误。

编辑:代码片段

代码语言:javascript
复制
% 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

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

EN

回答 2

Stack Overflow用户

发布于 2017-04-19 16:32:35

  1. 不,这是不可能的,您只需要仔细检查您的代码是否输入。您可以检查字段的数量,以确保它始终是您所期望的,但仅此而已 断言(numel(字段名(结果)) == 1,“您有一个错误或其他什么”)
  2. 当然,使用set抛出一个错误,它不是为struct数据类型定义的。如果这是一个指南图形用户界面,那么您的图形用户界面最简单的选择就是将数据保存在图形的guidata中。 Results.whatever = 1;handles.Results =结果;%将其保存在guidata中(hObject,句柄) 或者,您可以将其存储在图形的UserData属性中。 %gcbf= get(gcbf,'UserData');%更改值Results.whatever = 1;%保存它再次设置(gcbf,'UserData',结果)
  3. 另一种选择是使用handle类,而不是通过引用传递的struct。我编写了structobj,它本质上创建了一个行为类似于structhandle类。
票数 2
EN

Stack Overflow用户

发布于 2017-04-19 16:59:41

虽然我认为苏弗的回答的#3最适合通用的“结果”数据结构,但另一种方法可以是自定义数据类:

代码语言:javascript
复制
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初始化实例化,并将所有想要的数据存储为类的属性:

代码语言:javascript
复制
>> results = crowleydata();
>> results.aproperty = 2

results = 

  crowleydata with properties:

          aproperty: 2
    anotherproperty: []

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

这种方法的优点是您可以在任何设置中使用特定于您的数据的创建方法,比如GUI可以调用的绘图例程,而不是将行为硬编码到GUI本身。

如果要稍微更改properties块,此方法还允许类型强制执行:

代码语言:javascript
复制
properties
    aproperty@double        % Undocumented syntax, works >= R2012a (and probably older)
    anotherproperty double  % Documented syntax introduced in R2016a
end

我们可以得到以下信息:

代码语言:javascript
复制
>> 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'.
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43501288

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档