2011-02-02 2 views
2

나는 다음과 같은 test_mex MEX 기능이 있습니다mexGetArrayPtr이 예상대로 작동하지

void mexFunction(int nlhs, mxArray **plhs, int nrhs, const mxArray **prhs) 
{ 
    const mxArray* m_var = NULL; 
    if ((m_var = mexGetArrayPtr("a", "caller")) == NULL) 
    { 
    mexErrMsgTxt("oopsie"); 
    } 
} 

그리고 다음 test.m 파일 :

function test() 
    a = 12345; 
    test_mex(); 
  • 내가 그것을 실행하면 항상 실패하고 인쇄를 " oopsie ".
  • a을 전역으로 설정하고 mex 함수의 "caller"문자열을 "global"로 변경하면 정상적으로 작동합니다.

내가 뭘 잘못하고 있니?

주 :

  • 이 MATLAB의 긍정적 고대 버전이다 : 버전 6.1.0.450 릴리스 12.1
  • mexGetArrayPtr는 mexGetVariablePtr의 이전 버전이며, 예 인수의 순서가 다른
+0

코드가 mexGetArrayPtr과 호환되도록 mex 컴파일러에 '-V5' 옵션을 지정해야하지만 코드가 내 컴퓨터에서 예상대로 컴파일되어 실행됩니다. 저는 Matlab 7.5 (R2007b)를 사용하고 있습니다. 다시 컴파일하기 전에'clear mex'를 사용해보십시오. 그러나 이것이 문제라고 생각하지는 않습니다. –

+0

@Itamar mex는 c이므로 일반 툴 체인으로 컴파일되고 스크립트는 mcc로 컴파일되므로 환경과 관련이 없다고 생각합니다. 또는 나는 무엇인가 놓치고 있냐? – nakki

+0

완전성을 위해 버전을 언급했습니다. '일반 도구 체인'은 무엇입니까? 어떤 컴파일러가 'mex'에서 사용하도록 정의 되었습니까? –

답변

1

Solaris에서 버전 6.1.0.450에서이 예제를 시도했습니다. 내가 변경 한 한 가지

test_mex(); 

는 MATLAB의 이전 버전에 구문 오류가 있음을, 그리고 나는 (오류가 생성되지 않았다)이 근무

test_mex; 

로 변경했습니다. 당신은 당신의 코멘트에 "mcc로 스크립트를 컴파일 중"이라고 언급했다. MCC에서 test.m 함수를 컴파일하고 있다는 것을 의미합니까? R12.1에서 MCC 컴파일 된 M 코드가 C 코드 (MEX 또는 독립 실행 형 실행 파일)로 변환되었으므로 mexGetArrayPtr이 액세스 할 수있는 "작업 영역"이 없었습니다. 본질적으로 이는 MCC 컴파일러의 한계였습니다. "발신자"없이 오류를 사용할 때 나는 "발신자"케이스는 "oopsie"오류를 설명 보았다 "글로벌"의 경우 모두 (고객 센터 생성 MEX-파일을 빌드)

mcc -x test.m 

시도 당신이 설명한 것처럼 "글로벌"을 사용할 때.

+0

MEX에서 시작했을 때 혼란 스러웠다.'mex'는'mexFunction'을 정의한 * .c 파일을 Matlab이 호출 할 수있는 공유 라이브러리로 변환한다. 'mcc'는 * .m 파일을'mexFunction'를 정의하는 * .c 파일로 (불완전하게) 변환합니다. 'mcc'는 C로 무언가를 쓰고 Matlab에서 그것을 호출하는 일반적인 경우에는 필요하지 않습니다. – aschepler