2014-05-13 2 views
2

/r/matlab에있는 누군가가 며칠 전 Flappy Bird clone과 관련된 MATLAB FEX에 관한 정말 흥미로운 질문을했습니다. 포스터는 주 .m 파일을 열고 첫 번째 줄의 디버거에서 중지하고 whos()을 실행하면 함수에서 명시 적으로 정의하기 전에 많은 변수를 보게된다는 것을 알았습니다.중첩 된 함수가있는 변수 선언

편집기에서 가장 먼저 알아 낸 점은 중첩 된 함수가 있음을 나타내는 구문 강조입니다. 한눈에, whos()에 의해 반환 된 변수는 기본 함수의 범위에서 어느 시점에서 정의되는 변수 인 것 같습니다.

당신은 간단한 예제를 통해이 문제를 다시 만들 수 있습니다 : 당신이 얻을, 당신은 첫 번째 줄에 중단 점을 설정하면

function testcode 
asdf = 1; 
    function testing 
     ghfj = 2; 
    end 
end 

을하고 whos()을 실행

Name  Size   Bytes Class   Attributes 

    ans  0x0     0 (unassigned)    
    asdf  0x0     0 (unassigned) 

내가 찾을 수가 없습니다 중첩 된 함수 또는 관련 항목에 대한 설명서에서이 동작을 설명하는 항목 저는 컴퓨터 과학자가 아니며 프로그래밍 지식은 MATLAB과 파이썬의 아주 작은 뿌리에 국한됩니다. 아무도 무슨 일이 일어나는지 설명 할 수 있습니까? MATLAB이 런타임에 코드를 컴파일하는 방법과 관련이 있습니까?

답변

1

중첩 기능이있는 작업 영역이 보호됩니다. 함수가 호출되면 Matlab은 함수의 어느 부분에서 어떤 변수가 범위에 있는지를 결정하기 위해 코드를 분석해야합니다. 주 함수에서 선언되고 중첩 된 함수에서 사용되는 변수는 참조로 전달되며 입력 또는 출력으로 명시 적으로 선언되지 않은 경우에도 중첩 된 함수 내에서 수정할 수 있습니다.

중첩 된 함수가 망가지는 것을 방지하고 가능하면 속도를 높이기 위해 Matlab에서는 해당 함수의 작업 영역에 추가 변수를 할당 할 수 없습니다. 예를 들어, 1 행에서 코드의 실행을 중지 한 다음 새 변수 klmn에 값을 할당하려고하면 Matlab에서 오류가 발생합니다. 디버깅에는 약간의 불편을 겪을 수 있지만 다행히도 항상 ans을 할당 할 수 있습니다.

+0

흥미 롭습니다. 감사합니다. 더 많이 파고 들자 나는 [function basics documentation] (http://www.mathworks.com/help/matlab/matlab_prog/variables-in-nested-and-anonymous-functions.html)에서 몇 문장을 보았습니다. 변수는 코드의 텍스트에 존재해야합니다. 나는 정적 인 작업 공간을 사용하는 추리에 대해 더 많이 알고 싶어할지 모르지만, 필자가 본 검색 결과는이 오류에 대한 질문을 가리킨다. – excaza