MATLAB“臭虫”(或很奇怪的行为)与结构和空单元阵列
-
06-09-2019 - |
题
我不知道是怎么回事。我使用R2006b。任何机会,有人在那里有一个较新的版本可以测试,看看他们是否得到相同的行为,在我提交错误报告?
代码:(bug1.m
)
function bug1
S = struct('nothing',{},'something',{});
add_something(S, 'boing'); % does what I expect
add_something(S.something,'test'); % weird behavior
end
function add_something(X,str)
disp('X=');
disp(X);
disp('str=');
disp(str);
end
输出:
>> bug1
X=
str=
boing
X=
test
str=
??? Input argument "str" is undefined.
Error in ==> bug1>add_something at 11
disp(str);
Error in ==> bug1 at 4
add_something(S.something,'test');
它看起来像S.something
的空虚/虚无允许它的参数用于转移函数调用。这似乎是非常糟糕的行为。在短期内,我想找到远在其周围(我试图让,增加了项目最初为空的单元阵列,这是一个结构的成员函数)。
修改强>
推论问题:因此没有办法来构造struct
含有任何空单元阵列字面
解决方案
正如你已经发现自己,这是不是一个错误,但一个“功能”。换句话说,它是的 STRUCT 一个正常行为>功能。如果传递空单元阵列作为字段值STRUCT,它假定要与给定的字段名的空结构阵列。
>> s=struct('a',{},'b',{})
s =
0x0 struct array with fields:
a
b
要传递一个空单元阵列作为实际字段值,可以执行以下操作:
>> s = struct('a',{{}},'b',{{}})
s =
a: {}
b: {}
顺便提及,任何要设置一个字段值,以使用STRUCT单元阵列时,您需要涵盖它在另一个单元阵列。例如,这产生了一个单一结构元件与含有一个单元阵列和向量字段:
>> s = struct('strings',{{'hello','yes'}},'lengths',[5 3])
s =
strings: {'hello' 'yes'}
lengths: [5 3]
但是,这创建了两个结构元件的阵列,分发单元阵列,但复制矢量:
>> s = struct('strings',{'hello','yes'},'lengths',[5 3])
s =
1x2 struct array with fields:
strings
lengths
>> s(1)
ans =
strings: 'hello'
lengths: [5 3]
>> s(2)
ans =
strings: 'yes'
lengths: [5 3]
其他提示
啊...我想我找到了答案。 struct()
具有多个行为,包括:
请注意如果任何值的字段是 一个空单元阵列{}中,MATLAB 软件创建一个空的结构 阵列,其中所有字段都还 空。
显然,如果你传递一个为0x0结构的成员作为参数,它像某种空幻影并没有真正在参数列表中显示出来。 (这仍然可能存在错误)
bug2.m:
function bug2(arg1, arg2)
disp(sprintf('number of arguments = %d\narg1 = ', nargin));
disp(arg1);
测试用例:
>> nothing = struct('something',{})
nothing =
0x0 struct array with fields:
something
>> bug2(nothing,'there')
number of arguments = 2
arg1 =
>> bug2(nothing.something,'there')
number of arguments = 1
arg1 =
there
这个问题仍然存在于2008B,实际上是在没有真正的错误(虽然我不会说给它的设计者): 当你进入add_something(S,“嘣”)和观看的第一个参数(比如通过选择它并按下F9),你会得到一些与该空结构S. 输出 走进add_something(S.something,“测试”),并观看了第一个参数,你会看到它实际上是解释为“测试”!
的语法struct.fieldname被设计为返回类型“逗号分隔的列表”的一个目的。在MATLAB函数被用来接收这个确切类型的对象:参数名被给予列表中的值,在它们传递的顺序。在您的情况下,因为第一个参数是一个的空列表下,该逗号分隔列表中的功能接收确实在第二值开始传递 - 即,“测试”
输出是在相同R2008b:
>> bug1
X=
str=
boing
X=
test
str=
??? Input argument "str" is undefined.
Error in ==> bug1>add_something at 11
disp(str);
Error in ==> bug1 at 4
add_something(S.something,'test'); % weird behavior