S-Function 用の行優先のコードの生成
S-Function を含むモデル用の行優先コードを生成できます。既定では、コード ジェネレーターは列優先のコードを生成します。行優先のコード生成の詳細については、行列および配列のコード生成を参照してください。
S-Function を含む既存のモデルで、コンフィギュレーション パラメーター配列のレイアウトを [Row-major] に設定する場合、コンフィギュレーション パラメーター行優先コード生成の外部関数互換性が有効になり、既定で [error] に設定されます。既存のモデルをビルドしようとしても、S-Function が行優先のコード生成で既定で有効になっていないため、エラーが表示されます。[行優先コード生成の外部関数互換性] コンフィギュレーション パラメーターを使用して、行優先のコード生成用の S-Function の互換性をテストできます。
このワークフローは、モデルの C Caller ブロックにも適用可能です。
例
1. モデル例 ex_sfcn_rowmajor_unset を開きます。モデルには、次の追加ファイルが必要です。
S-Function:
ex_sfcn_rowmajor.cTLC:
ex_sfcn_rowmajor.tlc
これらのファイルをローカル フォルダーに保存します。
open_system('ex_sfcn_rowmajor_unset');

2. このモデルでは、[配列のレイアウト] が [Column-major] に設定されています。行優先のコード生成を有効にするには、[配列のレイアウト] を [Row-major] に設定します。
3. モデルをビルドすると、コード ジェネレーターはビルドを停止し、次のエラー メッセージが表示されます。

4. 続行するには、次のいずれかを行います。
モデルの行優先のコードを含む既存の S-Function をテストする場合、コンフィギュレーション パラメーター [行優先コード生成の外部関数互換性] の設定を [
warning] または [none] に設定します。コード ジェネレーターは、S-Function 用の行優先のコードを生成せずにビルドを完了します。行優先の配列レイアウトと互換性があるように S-Function を更新する場合、S-Function API を使用して行優先のコード生成用の S-Function を有効化します。
配列レイアウトが指定されていない S-Function 用のモデルをテストするために、モデルでモデル アドバイザー チェックを実行することもできます。[配列のレイアウトが未設定の TLC S-Function を特定] チェックをオンにして、[このチェックを実行] ボタンをクリックします。モデルに配列レイアウトが指定されていない S-Function が含まれている場合、次のような警告が表示されます。

ユーザー定義の S-Function の配列レイアウトを指定するために、SimStruct API の関数ssSetArrayLayoutForCodeGenを使用します。列挙型 SSArrayLayout を以下に設定できます。
SS_UNSET– この設定は、ブロックを行優先のコード生成について無効にする既定の設定です。SS_COLUMN_MAJOR– ブロックを列優先のコード生成についてのみ指定します。SS_ROW_MAJOR– ブロックを行優先のコード生成についてのみ指定します。SS_ALL – ブロックを配列レイアウトに関係なくコード生成できるとして指定します。
5. 行優先のコード生成用にブロックを構成するには、ex_sfcn_rowmajor.c で mdlInitializeSizes メソッド内の ssSetArrayLayoutForCodeGen 関数のコメントを解除します。
static void mdlInitializeSizes(SimStruct *S)
{
/* Specify array layout of the S-function */
ssSetArrayLayoutForCodeGen(S, SS_ROW_MAJOR);
.
.
.
}
S-Function が配列レイアウトの影響を受けない場合、SSArrayLayout を SS_ALL に設定します。
6. MATLAB® コマンド ウィンドウで、次のコマンドを使用して S-Function をコンパイルします。
mex ex_sfcn_rowmajor.c
Building with 'gcc'. MEX completed successfully.
7. モデルをビルドしてコードを生成するには、Ctrl+B を押します。
8. 生成されたコードを確認します。
ex_sfcn_rowmajor_unset_data.c で、入力配列は行優先の順序で配置されています。
const ConstP_ex_sfcn_rowmajor_unset_T ex_sfcn_rowmajor_unset_ConstP = {
/* Expression: reshape(1:25,[5,5])
* Referenced by: '<Root>/Constant1'
*/
{ 1.0, 6.0, 11.0, 16.0, 21.0, 2.0, 7.0, 12.0, 17.0, 22.0, 3.0, 8.0, 13.0, 18.0,
23.0, 4.0, 9.0, 14.0, 19.0, 24.0, 5.0, 10.0, 15.0, 20.0, 25.0 }
};
ex_sfcn_rowmajor_unset.c で、ステップ関数により、線形化された配列の [5] 要素を抽出しています。
/* S-Function Block: <Root>/S-Function */ ex_sfcn_rowmajor_unset_Y.Out1 = ex_sfcn_rowmajor_unset_ConstP.Constant1_Value[5];
この処理は、列優先で配列の [1][0] 要素を抽出することと同等です。行優先の順序で配列から同じ要素を抽出するには、ex_sfcn_rowmajor.tlc 内の次の行を以下に更新します。
%assign u = LibBlockInputSignal(0, "", "", 1)
次に、コードを再生成します。
S-Function Builder を使用して S-Function を生成する場合、S-Function の優先方向を指定にはパラメーター [配列のレイアウト] を使用します。詳細については、Build S-Functions Automatically Using S-Function Builderを参照してください。レガシ コード ツールを使用した C 関数の統合では、legacy_codeの convertNDArrayToRowMajor オプションを使用します。S-Function Builder およびレガシ コード ツールは、ノーマル モードでのシミュレーション中に S-Function が行優先の配列レイアウトに設定される場合、それに先立って転置を適用します。