2015-01-29 9 views
2

m 파일을 실행 파일에 배포하려고합니다. mcc 명령을 사용하고 있습니다 : mcc -m epidemic.m. 유행은 인수를 취하지 않고 벡터를 반환하고 그 벡터를 txt에 쓰는 제 함수입니다. Mcc는 epidemic.exe를 생성하고 그 EXE를 실행할 때 txt 파일을 생성하지만 반환 값 (.exe의 반환 값)을 반환하지는 않습니다. 내가 사용 MATLAB에서 EXE 파일을 실행하려고 :실행 파일에 matlab 파일 배포

cmd = ['epidemic.exe ']; 
system(cmd); 

이 cmdout를 돌려 "상태 0은 어떻게 .EXE의 반환 값을 사용할 수 있습니다

답변

3

컴파일 MATLAB 코드와 같은 :.

function [out1, out2] = epidemic(in1, in2, in3) 
%[ 
    ... 
%] 
int main(int argc, char** argv) 
{ 
    // Load compiled code produced by mcc 
    HMCRInstance* hInst = loadByteCodeProducedByMccFromResources(); 

    // Similar to have wrote in matlab "epidemic(argv[0], argv[1], ...)" 
    // 1) Without asking for any argument output 
    // 2) Argument inputs are passed as strings 
    int errorCode = mclFevalFromExeArg(hInst, "epidemic", argc, argv); 

    return errorCode; // only indicates if call to 'mclFEvalFromExeArg' 
         // succeded, it does not relate to out1, out2 at all. 
} 

NB :는 매트랩 다음 의사 C 코드 어떻게 든 생산하고 .exe를 그것을 컴파일 (mcc -m epidemeic.m를) 독립하고, 당신이 내 고객 센터에 의해 생성 된 정확한 코드를 보려면 사용 mcc -W main -T codegen epidemic.m

그래서 독립형으로 직접 컴파일하면 Matlab 함수의 출력으로 작업 할 수 없습니다. 당신은 epidemic의 출력 인수와 함께 놀러해야하는 경우 중 하나

  • [간단한 솔루션]disp (NB를 사용하여 콘솔을 쉘 파일에 출력을 저장하거나 표시 고려 : 당신은 당신의하는 .m에 isdeployed을 사용할 수 있습니다 MATLAB 또는 컴파일 된 코드에서 실행 중인지 확인하는 파일). 당신이 공유 라이브러리에 코드를 컴파일 할 때, mcc는 DLL을 생성합니다 :

  • 는 [고급 솔루션] (mcc -m epidemeic.m)

NB 공유 라이브러리 (mcc -l epidemic.m) 대신 독립에 코드를 컴파일 고려 그 다음 함수 보냅니다

extern LIB_epidemeic_C_API 
bool MW_CALL_CONV mlxEpidemic(int nlhs, mxArray *plhs[], int nrhs, mxArray *prhs[]); 

nrhs/prhs 입력 인수 및 수 있습니다 그들의 값 (mxArray 유형). 그리고 nlhs/plhsepidemic을 호출 할 때 필요로하는 출력 인수입니다. mxArray와 동등한 C 기본 유형 사이의 마샬링을 수행 할 수 있습니다.

편집 당신이 epidemic 값의 벡터를 반환하는 표시로

,이 같은 독립형에서 그들을 표시 할 수 있습니다

function [output] = epidemic(v1, v2, v3) 
%[ 
    % When called from system cmd line, v1, v2, v3 are passed 
    % as string. Here is how to convert them to expected type if required 
    if (ischar(v1)), v1 = str2double(v1); end 
    if (ischar(v2), v2 = str2double(v2); end 
    if (ischar(v3)), v3 = str2double(v3); end 

    ... 
    output = ...; 
    ... 

    if (isdeployed()) 
     disp(output); 
    end 
%] 
+0

lib를 만드는 데 문제가있어서 실행 파일의 해결책을 결정했습니다. 텍스트 파일에 출력을 썼습니다. 입력 사건에 대해 어떻게해야합니까? MATLAB 함수의 입력 인수로 취할 수 있습니까? –

+0

또 다시, 네 ... 시스템 콘솔'epidemic.exe riri fifi loulou'에 글을 쓰면 eaxctly와 똑같습니다. matlab promt'epidemic ('riri', 'fifi', 'loulou')' ... 모든 인수는 문자열로 전달됩니다. 필요한 경우 함수 시작 부분에서 'ischar'을 사용하여 변환 할 수 있습니다 ... 내 대답은 업데이트를 참조하십시오. – CitizenInsane

3

EXE 파일을 반환 값이없는 ., 당신은 콘솔 출력 또는 텍스트 파일을 통해 예를 들어 당신이 얻을 것은 오류 코드 및 오류 메시지가 다시 데이터를 전송하는 또 다른 방법을 찾을 필요가

+0

어떻게 출력을 콘솔에 우리의 데이터를 전송 할 수 있습니까? –

+0

또한 터미널에서 내 MATLAB 함수에 입력 할 수 있습니까? my .m 파일에 인수를 입력하면 배포 된 .exe를 호출 할 때 터미널에서 파싱 할 수 있습니까? –

+0

.exe에 대한 인수는 .m 파일에 문자열로 전달됩니다.matlab 측에서 올바른 형식을 얻기 위해 .m 파일의 시작 부분 (예 :'ifchar (param1), param1 = str2num (param1); end')에 변환을 추가 할 수 있습니다. – CitizenInsane