스트러크와 빈 셀 어레이가있는 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 빈 셀 어레이를 포함하는 리터럴?

도움이 되었습니까?

해결책

이미 자신을 발견했듯이 이것은 버그가 아니라 "기능"입니다. 다시 말해, 그것은 정상적인 행동입니다. 구조 기능. 빈 셀 배열을 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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top