2012-12-03 5 views
1

많은 문제가 있음을 알고 있습니다. 그러나 나는 나의 프로그램에 연결하는 방법을 이해하지 못한다. 이것은 간단한 c = a + b 프로그램입니다. 내 C-멕스 S-기능으로는 다음이있다 : MATLAB에 컴파일 할 때선언되지 않은 식별자 (C-mex S-Functions)

#define S_FUNCTION_NAME Addition 
#define S_FUNCTION_LEVEL 2 

#include "simstruc.h" 

static void mdlInitializeSizes(SimStruct *S) 
{ 
int_T nInputPorts = 2; /* Set no. of input ports */ 
int_T nOutputPorts = 1; /* Set no. of output ports */ 
int_T needsInput = 1; /* Direct feed through = yes */ 

int_T inputPortIdx = 0; 
int_T outputPortIdx = 0; 

ssSetNumSFcnParams(S, 0); 

if (ssGetNumSFcnParams(S) != ssGetSFcnParamsCount(S)) 
{ 
    return; /* If no. of expected input parameters is not equal to no. 
       of parameters entered in dialog box, return. Simulink 
       to generate an error indicating parameter mismatched */ 
} 

/* Configure input ports */ 
if (!ssSetNumInputPorts(S, 2)) return; 

/* Configure first input ports */ 
ssSetInputPortWidth(S, 0, DYNAMICALLY_SIZED); /* Set dimensions of first input port */ 
ssSetInputPortDirectFeedThrough(S, 0, 1); /* Set direct feed through */ 

/* Configure second input ports */ 
ssSetInputPortWidth(S, 1, DYNAMICALLY_SIZED); /* Set dimensions of second input port */ 
ssSetInputPortDirectFeedThrough(S, 1, 1); /* Set direct feed through */ 

/* Configure output ports */ 
if (!ssSetNumOutputPorts(S,1)) return; 
ssSetOutputPortWidth(S, 0, DYNAMICALLY_SIZED); /* Set dimensions of output ports */ 

ssSetNumSampleTimes(S, 1); /* Set no. of sample times */ 

ssSetSimStateCompliance(S, USE_DEFAULT_SIM_STATE); 

ssSetOptions (S,0); 

} /* End of mdlInitializeSizes */ 


static void mdlInitializeSampleTimes (SimStruc *S) 
{ 
ssSetSampleTimes(S, 0, INHERITED_SAMPLE_TIME); 
/* Inherited Sample time: S-function block executes whenever driving block executes */ 
ssSetOffsetTime(S, 0, 0.0); /* No offset required */ 
ssSetModelReferenceSampleTimeDefaultInheritance(S); /* */ 
} /* End of mdlInitializeSampleTime */ 


static void mdlOutputs (SimStruc *S, int_T tid) 
{ 
int_T i; 
InputRealPtrsType uPtrs = ssGetInputPortRealSignalPtrs(S,0); 
real_T *y = ssGetOutputPortRealSignal(S,0); 
int_T width = ssGetOutputPortWidth(S,0); 

for (i=0; i<width; i++) /* i = location of memory. from 0 to 1. */ 
{ 
    *y++ = (*uPtrs[i+1]) + (*uPtrs[i]); /* c = a + b */ 
} 
} /* End of mdlOutputs */ 


static void mdlTerminate(SimStruct *S) 
{ 
/* No task to be perform at end of simulation therefore no termination required. 
    But this is a compulsory function to have for C-mex S-function */ 
} /* End of mdlTerminate */ 

#ifdef MATLAB_MEX_FILE 
#include "simulink.c" 
#else 
#include "cg_sfun.h" 
#endif 

그러나, 나는 다음과 같은 오류가 계속 :

Addition.c:47: error: expected ‘)’ before ‘*’ token 
Addition.c:56: error: expected ‘)’ before ‘*’ token 
In file included from Addition.c:82: 
/DIST/it/sw/amd64/matlab/r2010b/simulink/include/simulink.c: In function ‘_ProcessMexSfunctionCmdLineCall’: 
/DIST/it/sw/amd64/matlab/r2010b/simulink/include/simulink.c:2545: error: ‘mdlInitializeSampleTimes’ undeclared (first use in this function) 
/DIST/it/sw/amd64/matlab/r2010b/simulink/include/simulink.c:2545: error: (Each undeclared identifier is reported only once 
/DIST/it/sw/amd64/matlab/r2010b/simulink/include/simulink.c:2545: error: for each function it appears in.) 
/DIST/it/sw/amd64/matlab/r2010b/simulink/include/simulink.c:2601: error: ‘mdlOutputs’ undeclared (first use in this function) 

모든 의견이 크게 감사합니다!

답변

0

오류 메시지 상단에 언급 된 두 줄에 SimStruct의 철자가 잘못되었습니다. 그 괄호에 대한 오류는 컴파일러가 SimStruc이 유형이라는 것을 모르기 때문에 *가 맞지 않는다는 것을 의미합니다. 그 후이 두 함수는 정의되지 않으므로 simulink 인터페이스는 파일에서이 두 필수 함수를 찾을 수 없다는 사실에 화를냅니다.

+0

피터. 답장을 보내 주셔서 감사합니다. 그러나 현재 나는 다른 오류 --- mex : Addition.c 정상적인 파일이 없거나 존재하지 않습니다. 이것은 무엇을 의미합니까? 나는 필요한 모든 파일을 경로에 추가했다. –

+0

컴파일 할 때 올바른 디렉토리에 있습니까? 파일에 대소 문자를 올바르게 사용하고 있습니까? Linux 파일 이름은 대소 문자를 구분합니다. – Peter

관련 문제