2012-10-25 3 views
2

저는 Matlab로 작성된 일부 코드를 독립형의 컴파일 된 Matlab 응용 프로그램으로 변환하려고합니다. 그러나 이상한 오류가 발생하면 코드에서 여러 번 사용 된 동일한 이름 (그러나 다른 결과/계산)을 가진 여러 함수가 있음을 알리기 위해 경로에서 추가 및 제거를 많이 사용합니다. 주위를 둘러 보니 이름 앞에 "+"를 삽입하고 패키지의 기능이 name_of_folder.name_of_function을 사용하여 서로 참조되는지 확인하여 폴더를 패키지로 만들 수 있음을 발견했습니다. 이것은 네임 스페이스 문제를 해결하지만 잠재적으로 많은 작업을 만듭니다. 이제는 각 함수 호출에 올바른 패키지를 추가해야합니다. (그리고 많은 파일을 복제해야 할 수도 있습니다.)Matlab의 가져 오기 기능의 범위는 무엇입니까?

그렇다면 import 기능을 보았고 시간을 절약 해 주길 바랍니다. 하나 또는 두 개의 특정 함수에 원하는 패키지를 전달하고 해당 함수를 패키지를 가져온 다음 해당 함수가 호출하는 함수가 해당 import 문의 범위에 속하면 원하는대로 작동 할 것이라고 생각합니다. 내가

function foo(var1, var2, ..., packagename) 
    eval(sprintf('import %s.*', packagename)); 
    ... 
    bar1(var1, var2); 
    ... 
    bar2(var2); 
    ... 

같은 것을 설정 한 경우 예컨대, 그럼 내가 가져 오기 문을 가져온 패키지를 사용합니다 bar1bar2를 희망하고있다. 문서에 따르면 조건문과 함수의 import 문은 해당 코드 블록으로 제한되어 있지만 "해당 코드 블록"은 해당 텍스트 만 또는 "해당 코드 블록"이 코드 및 평가되는 모든 것을 의미하는지 여부를 알지 못합니다 그 결과로 나는 그것이 전 (前者)이라는 느낌을 가지고 있지만, 나는 그것이 후자임을 희망하면서 묻습니다.

그래서 import 문 범위는 무엇입니까? 또는이 문제를 해결할 다른 방법이 있습니까?

답변

1

필자는 직접 테스트 해보기 위해 약간의 테스트 코드를 작성했는데 실제로 import 문은이 함수를 호출 한 함수에만 국한되어 있지만 필자의 희망은 내 판단을 흐리게 만들었다. 기록을 위해, 나는 그것을 테스트하기 위해 다음과 같은 간단한 기능을 썼다 :

function package_test(package_name) 
    eval(sprintf('import %s.*;', package_name)); 

    test_function(); 
end 

 

function test_function() 
    nested_function() 
end 

을 다음 첫 번째 두 가지 기능과 같은 폴더에

function nested_function() 
    disp('I\'m in the original folder :('); 
end 

을두고,

function nested_function() 
    disp('I\'m in the package! :)'); 
end 
폴더 +trial

이 있습니다. 내가 package_test('trial')을 실행했을 때 물론, 내가 trial.nested_function() 나에게 내가 볼 희망 문자열을 준 반면, 창에 표시된 "나는 원래 폴더 :(에있어"보았다. 또한

eval 기능에 문제를 제기 컴파일러, 그리고 그것을 import(sprintf('%s.*', package_name));으로 바꾸는 것은 도움이되지 않는 것 같습니다. 그래서 파일을 복제하는 것으로 돌아갑니다.

2

"가장 좋은 방법은"여러 기능을 사용할 때까지 이름을 바꾸는 것입니다. 같은 이름으로 "문제가 없어졌습니다. 여러분과 미래의 유지 보수자가 이해할 수 있도록 코드를 훨씬 쉽게 만들 것입니다.(내가 좋아하는) 패키지 아이디어 다릅니다

두 가지 옵션 :

  1. 당신은 단지 추가 (또는 앞에 추가) 디렉토리 이름을 함수 이름과 새에 모두 넣을 수 있습니다 (더 나은 -named) 디렉토리에 있습니다. 상황에 따라 더 이해할 수 있습니다.

  2. 당신이 디렉토리 barcar에 정의 된 두 가지 기능 foo을 가지고 있고, 두 기능이 같은 인수를 경우 추가 인수로 bar 또는 car 소요 하나의 함수에서 그들을 통합 할 수 있습니다

    function foo(parm1, parm2, parm3, version) 
    if strcmp(version, 'bar') 
        // bar code 
    else 
        // car code 
    end 
    

    이것은 좋지는 않지만 경로를 변경하는 것보다 훨씬 좋으며 MATLAB 패턴 (함수의 자세한 동작을 변경하기 위해 문자열 인수를 전달)을 따라 정렬합니다. 두 개의 foo 함수가 서로 다른 인수를 가지고 있더라도이 작업을 수행 할 수는 있지만 인수에 대한 성가신 구문 분석을 수행해야합니다. 그러면 포장 아이디어가 훨씬 쉽게 나타납니다.