構造体と、空のセル配列とMATLAB「バグ」(または本当に奇妙な行動)

StackOverflow https://stackoverflow.com/questions/939544

質問

私はここで何が起こっているか見当がつかない。私は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に固執し、(私はそれのために意図したデザイナーを言わないだろうが)本当に実際にはバグではありません。 あなたは(それを選択し、F9キーを押して発言)add_something(S「ボイン」)へのステップと、最初の引数を見たとき、あなたは取得したいの空の構造体Sに関連するいくつかのの出力 add_something(S.something、「試験」)へのステップと、最初の引数を見て、あなたはそれが「試験」と解釈し、実際にです参照してくださいね!

構文struct.fieldnameは、「カンマ区切りのリスト」タイプのオブジェクトを返すように設計されています。 MathWorks社の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