我不知道是怎么回事。我使用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() 具有多个行为,包括:

  

请注意如果任何值的字段是   一个空单元阵列{}中,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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top