構造体と、空のセル配列と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 機能。あなたは構造体へのフィールド値として空のセル配列を渡すと、それはあなたが与えられたフィールド名を持つ空の構造体配列をしたいと仮定します。
>> 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()
を含む複数の行動を、持っています:
値フィールドのいずれかがある場合は、あなたが引数として0x0の構造体のメンバを渡す場合は、注意 空のセル配列{}、MATLAB ソフトウェアは、空の構造体を作成し、 すべてのフィールドでもされた配列 空ます。
と明らかに、それは本当に引数リストに表示されない空幻のいくつかの種類のようなものです。 (それはおそらくまだバグです)。
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