我正在使用Matlab对用于拉伸测试分析的GUI进行硬编码。
当调用GUI时,我将decalare Results
struct包含分析的所有结果,并且我想将它存储在.mat
文件中,其中包含分析过程中创建的所有数据(应力 - 应变曲线,尺寸,等)
当GUI开始为Results.whatever
并且在回调中设置了适当的值时,将声明nan
。当我输入错字时,它只会附加新的Results.whtever
值,而不会抛出任何错误,警告,无论如何......
有什么方法,如何:
Results.whtever=1
时Results.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
剪切到片段;它看起来不是一个问题,但随着请求的增加,代码变得越来越长。
答案 0 :(得分:2)
不,这不可能,您只需要仔细检查您的代码是否有拼写错误。您可以检查字段数量,以确保它始终是您所期望的但是关于它
assert(numel(fieldnames(Results)) == 1, 'You have a typo or something')
当然使用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)
另一个选择是使用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'.