未声明的标识符(C-mex S-Functions)

时间:2012-12-03 14:04:27

标签: matlab mex

我知道这是一个很常见的问题。但我不明白如何链接到我的程序。这是一个简单的c = a + b程序。我有以下作为我的C-Mex S功能:

#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

然而,当在matlab上编译时,我不断收到以下错误:

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)

任何评论都将不胜感激!

1 个答案:

答案 0 :(得分:0)

您在错误消息顶部提到的两行中拼错了SimStruct。关于括号的错误意味着编译器不知道SimStruc是一个类型,因此*不适合。之后,这两个函数没有定义,因此simulink接口会因为在文件中找不到这两个必需的函数而感到沮丧。