入力として 2 次元配列を受け入れる s-function ビルダーを使用して、Simulink で s-function を作成しようとしています。入力ポートで次元を指定します: 2d、行: 4、列: 4. f[x][y] を使用して入力ポートにアクセスしようとすると、エラーが発生します: "エラー C2109: 添字には配列またはポインターが必要ですタイプ」、入力ポートがアドレス指定されている行の場合。
2 次元配列である入力ポートを使用して Simulink で s-function を作成するにはどうすればよいですか?
関連コード:
static void mdlInitializeSizes(SimStruct *S)
{
DECL_AND_INIT_DIMSINFO(inputDimsInfo);
DECL_AND_INIT_DIMSINFO(outputDimsInfo);
ssSetNumSFcnParams(S, NPARAMS);
if (ssGetNumSFcnParams(S) != ssGetSFcnParamsCount(S)) {
return; /* Parameter mismatch will be reported by Simulink */
}
ssSetNumContStates(S, NUM_CONT_STATES);
ssSetNumDiscStates(S, NUM_DISC_STATES);
if (!ssSetNumInputPorts(S, NUM_INPUTS)) return;
/*Input Port 0 */
inputDimsInfo.width = INPUT_0_WIDTH;
ssSetInputPortDimensionInfo(S, 0, &inputDimsInfo);
ssSetInputPortMatrixDimensions( S ,0, INPUT_0_WIDTH, INPUT_DIMS_0_COL);
ssSetInputPortFrameData(S, 0, IN_0_FRAME_BASED);
ssSetInputPortDataType(S, 0, SS_DOUBLE);
ssSetInputPortComplexSignal(S, 0, INPUT_0_COMPLEX);
ssSetInputPortDirectFeedThrough(S, 0, INPUT_0_FEEDTHROUGH);
ssSetInputPortRequiredContiguous(S, 0, 1); /*direct input signal access*/
if (!ssSetNumOutputPorts(S, NUM_OUTPUTS)) return;
ssSetNumSampleTimes(S, 1);
ssSetNumRWork(S, 0);
ssSetNumIWork(S, 0);
ssSetNumPWork(S, 0);
ssSetNumModes(S, 0);
ssSetNumNonsampledZCs(S, 0);
/* Take care when specifying exception free code – see sfuntmpl_doc.c */
ssSetOptions(S, (SS_OPTION_EXCEPTION_FREE_CODE |
SS_OPTION_USE_TLC_WITH_ACCELERATOR |
SS_OPTION_WORKS_WITH_CODE_REUSE));
}
(ポート) を通常の配列としてmdlOuputs
扱うようにしています。f
例:
x=f[0][0];
これにより、エラーがスローされます。
編集:まあ、それを理解しました。
入力パラメーターに従ってポートの次元を設定すると、f[x*xw+y] を使用して値を指定できます。ここで、x と y は x と y の位置 (0 から始まる) で、xw は列の数です。
まだより良い方法を見つけていませんが、これはうまくいきます。