스트러크와 빈 셀 어레이가있는 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
빈 셀 어레이를 포함하는 리터럴?
해결책
이미 자신을 발견했듯이 이것은 버그가 아니라 "기능"입니다. 다시 말해, 그것은 정상적인 행동입니다. 구조 기능. 빈 셀 배열을 Field 값으로 구조로 전달하면 주어진 필드 이름이있는 빈 구조 배열을 원한다고 가정합니다.
>> s=struct('a',{},'b',{})
s =
0x0 struct array with fields:
a
b
빈 셀 배열을 실제 필드 값으로 전달하려면 다음을 수행합니다.
>> s = struct('a',{{}},'b',{{}})
s =
a: {}
b: {}
우연히 어느 구조물을 사용하여 필드 값을 셀 어레이로 설정하려면 다른 셀 어레이에 포함해야합니다. 예를 들어, 셀 어레이와 벡터를 포함하는 필드가있는 단일 구조 요소를 만듭니다.
>> 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]
다른 팁
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
이 동작은 2008b에 지속되며 실제로 버그는 아닙니다 (디자이너가 의도 한 의도는 말하지는 않지만) : Add_something (S, 'Boing')으로 들어가서 첫 번째 논쟁을 시청할 때 (예 : 선택하여) 그리고 F9를 누르면 얻을 수 있습니다 약간 빈 구조와 관련된 출력 S. add_something (s.something, 'test')으로 들어가서 첫 번째 인수를 보면 실제로 '테스트'로 해석되는 것을 볼 수 있습니다!
구문 struct.fieldName은 'comma 분리 목록'유형의 객체를 반환하도록 설계되었습니다. Matlab의 함수는이 정확한 유형의 객체를 받도록 설계되었습니다. 인수 이름은 목록의 값에 전달 된 순서대로 제공됩니다. 당신의 경우, 첫 번째 논쟁은 빈 목록, Comma-Separated-List 기능은 실제로 전달한 두 번째 값, 즉 '테스트'에서 시작됩니다.
출력은 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