2009-06-02 4 views
6

나는 여기서 무슨 일이 일어나는 지 전혀 모른다. 나는 R2006b를 사용하고 있습니다. 새로운 버전의 누군가가 버그 리포트를 보내기 전에 동일한 행동을하는지 테스트 할 수 있습니까?구조체와 빈 셀 배열로 MATLAB "버그"(또는 정말로 이상한 동작)

코드 (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 문자가 포함 된 빈 셀 어레이를 구성 할 수있는 방법이 없다?

답변

14

이미 발견했기 때문에 이것은 버그가 아니며 "기능"입니다. 즉, STRUCT 함수의 정상적인 동작입니다.빈 셀 배열을 필드 값으로 STRUCT에 전달하면 지정된 필드 이름이있는 빈 구조체 배열이 필요하다고 가정합니다. 덧붙여

>> s = struct('a',{{}},'b',{{}}) 

s = 

    a: {} 
    b: {} 

, 사용 셀 배열에 필드 값을 설정하려는 시간 :

>> s=struct('a',{},'b',{}) 

s = 

0x0 struct array with fields: 
    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] 
+0

AH : 감사합니다. 셀 배열을 전달할 때마다 여분의 중괄호를 사용하는 것에 대해 이야기하는 구조체 함수의 메모를 보지 못했습니다. Grrr. –

1

출력 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 
2

아으 ... 난 내가 답을 찾은 것 같아요. 값 필드의 모든 빈 셀 어레이 {}는 MATLAB 소프트웨어 모든 필드는 비어있는 빈 구조 배열을 생성 경우

참고 struct() 포함한 여러 행동을 갖는다.

그리고 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 
2

이 문제는 2008b에서 계속하고, 정말 버그가 (사실상 전 같으면 비록 디자이너가 의도 한대로 말하지 않는다) : add_something (S, 'boing')으로 들어가서 첫 번째 인자를 보았을 때 (F9를 누르고 선택하면) 일부는과 관련이있다. 구조 S. add_something (S.something, 'test')에 들어가서 첫 번째 인수를 살펴보면 실제로 'test'로 해석됩니다.

구문 struct.fieldname은 '쉼표로 구분 된 목록'유형의 개체를 반환하도록 설계되었습니다. matlab에있는 함수는이 정확한 유형의 객체를 받도록 설계되었습니다. 인수 이름은 전달 된 순서대로 목록의 값에 지정됩니다. 귀하의 경우 첫 번째 인수가 빈 목록이기 때문에 함수가받는 쉼표로 구분 된 목록은 실제로 전달한 두 번째 값, 즉 'test'에서 시작됩니다.

+0

실제로 디자이너는이 동작을 수행했습니다. STRUCT 함수에 인수를 전달하는 구문은 입력 인수의 셀 배열 캡슐화 사용에 따라 배열 또는 구조체 배열이 포함 된 구조를 만들 수 있도록 설계되었습니다. – gnovice

+0

또한 CSL (쉼표로 구분 된 목록) 동작도 사용됩니다. 입력 및 출력 인수 목록은 CSL로 설계되며 다음 구문은 CSL을 만듭니다. structureArray.fieldName, cellArray {:}. – gnovice

+0

물론 두 가지 행동은 의도적으로 설명한 것입니다. 그러나 몇 가지 인수가 함수에 전달되고 가운데 하나가 빈 CSL 인 상황은 혼란을 야기하는이 디자인의 결과를 수반합니다. 이러한 시나리오 (나에게 보임)는 별도의 디자인주의를 정당화합니다. 적어도 런타임 경고를 제기하십시오. –