1

これは、多くの人が直面している非常に一般的な問題であることを理解しています。ただし、プログラムにリンクする方法がわかりません。これは単純な c = a+b プログラムです。C-Mex S-Function として次のものがあります。

#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)

どんなコメントでも大歓迎です!

4

1 に答える 1

0

SimStructエラー メッセージの上部に記載されている 2 行のスペルが間違っています。括弧に関するエラーは、コンパイラがそれが型であることを認識していないことを意味するSimStrucため、* は適合しません。その後、これらの 2 つの関数は定義されていないため、simulink インターフェイスは、ファイル内でこれら 2 つの必要な関数を見つけることができないという混乱を引き起こします。

于 2012-12-03T14:31:27.920 に答える