我不知道这里发生了什么。我正在使用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
文字?
答案 0 :(得分:15)
正如您已经发现的那样,这不是一个错误,而是一个“功能”。换句话说,这是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]
答案 1 :(得分:2)
ARGH ......我想我找到了答案。 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
答案 2 :(得分:2)
这种行为在2008b中仍然存在,实际上并不是一个真正的错误(虽然我不会说设计者的意图): 当你进入add_something(S,'boing')并观察第一个参数(比如通过选择它并按F9)时,你会得到与空结构S相关的一些输出。 进入add_something(S.something,'test')并观察第一个参数,你会发现它实际上被解释为'test'!
语法struct.fieldname旨在返回“逗号分隔列表”类型的对象。 matlab中的函数用于接收这种精确类型的对象:参数名称按照传递的顺序赋予列表中的值。在您的情况下,由于第一个参数是空列表,因此函数接收的逗号分隔列表实际上以您传递的第二个值开始 - 即'test'。
答案 3 :(得分:1)
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