4

入力として 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 は列の数です。

まだより良い方法を見つけていませんが、これはうまくいきます。

4

2 に答える 2

1

私は、S-Function ビルダが次のようなコードを生成していると推測していますmdlOutputs

real_T *y0 = (real_T *)ssGetOutputPortSignal(S, 0);
// OR 
real_T *y0 = ssGetOutputPortRealSignal(S, 0);

どちらの行y0も 1 次元配列へのポインターであるため、2 次元配列であるかのように 2 つの添字を使用してアクセスしようとすると、コンパイラーはエラーを出します。

編集で投稿したように、2-D インデックスを線形インデックスに変更することで修正できます。これはまったく問題なく動作します。実際、2 つの添字を使用して 2 次元配列にインデックスを付けるときに、コンパイラが舞台裏で行う必要があることです。

ssGetInputPortSignalもう 1 つのオプションは、 (またはssGetInputPortRealSignal)の戻り値をポインター型へのポインターにキャストすることです。

real_T **y0 = (real_T **)ssGetOutputPortSignal(S, 0);

y0[1][1] = 0;
于 2012-07-17T16:28:06.223 に答える