Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

カスタム C コードとの string データの共有

この例では、Stateflow® チャートとカスタム C コードの間で string データを共有する方法を説明します。str2ascii 演算子を使用すると、string データを Stateflow チャートから C 関数にエクスポートできます。ascii2str 演算子を使用すると、C コードの出力を string データとして Stateflow チャートにインポートできます。データをカスタム コードと共有することにより、Stateflow の機能を拡張し、ソフトウェアを活用して既存のコードを利用することができます。詳細については、Stateflow チャートでのカスタム コードの再利用を参照してください。

このモデルには、カスタム C コードから 2 つの関数を呼び出す Stateflow チャートが含まれています。シミュレーション中に、チャートは、浮動小数点数を指数形式で表現するテキストを含む string を入力として取ります。チャートは次を行う 3 つのステートで構成されています。

  • 入力 string で先頭のゼロ、小数点、e を検索。

  • string を、入力の仮数部と指数部を表す倍精度の数値に解析。

  • 入力を科学表記で表現する出力 string に数値情報をマージ。

たとえば、入力 string が "0123.456e789" の場合、チャートは string "0123.456e789 means 1.23456 times ten to the 791th power" を出力します。

Stateflow から C への string データのエクスポート

str2ascii 演算子を使用すると、string データを、Stateflow チャートからカスタム C コード関数へのエクスポートが可能な配列に変換できます。

  1. カスタム コード関数で、入力変数が char* 型をもっていることを宣言します。

  2. Stateflow チャートで、str2ascii 演算子を呼び出すことにより、string を uint8 型の配列に変換します。

  3. uint8 配列を入力として渡すことにより、カスタム コード関数を呼び出します。

たとえば、前述のチャートでは、Search ステートが、入力 string struint8 配列 Asrt に変換します。Search ステートは、この配列を入力としてカスタム コード関数 searchfun に渡します。

extern void searchfun(int* nout, char* strin)
{
   nout[0] = strspn(strin,"0");
   nout[1] = strcspn(strin,".e");
   nout[2] = strcspn(strin,"e");
   nout[3] = strlen(strin);
}

Search ステートは、コマンド searchfun(n,Astr) を使用して、この関数を呼び出します。この関数により、整数配列 n に以下の値が入力されます。

  • n[0] には、入力 string str の先頭のゼロの数が含まれます。

  • n[1] には、小数点または e の最初のインスタンスより前の文字数が含まれます。この結果は、str 内の小数点より前の文字数を提供します。

  • n[2] には、e の最初のインスタンスより前の文字数が含まれます。この結果は、str 内の仮数に含まれる文字数を提供します。

  • n[3] には、入力 string str の長さが含まれます。

Parse ステートは、これらの結果を使用して、入力の仮数部と指数部の値を抽出します。

C から Stateflow への string データのインポート

string データを Stateflow チャートにインポートするには、uint8 型の配列へのポインターを、カスタム C 関数に入力として渡します。

  1. カスタム コード関数で、ポインターを含む入力変数が char* 型をもっていることを宣言します。

  2. カスタム コード関数からの出力 string データを、ポインターで示されている場所に保存します。

  3. Stateflow チャートで、演算子 ascii2str を呼び出すことにより、uint8 配列を string に変換します。

たとえば、前述のチャートでは、Merge ステートは、カスタム コード関数 mergefun を呼び出すことにより、Parse ステートによって取得された数値情報を出力 string に統合します。

extern void mergefun(char* strout, char* strin, int in0, double in1, double in2)
{
   sprintf(strout, "%s means %1.*f times ten to the %dth power", strin, in0, in1, (int) in2);
}

Merge ステートは、コマンド mergefun(Asout,Astr,y0,y1,y2) を使用して、関数 mergefun を呼び出します。

  • Asout は、カスタム関数の出力をポイントする uint8 型の配列です。

  • Astr は、チャートへの入力 string に対応する uint8 型の配列です。

  • y0 は、仮数の小数点以下の桁数を含む整数です。

  • y1 および y2 は、入力の仮数部と指数部を表す倍精度数です。

関数 mergefun は、C ライブラリ関数 sprintf を呼び出し、Astry1 および y2 の内容をマージして、Aout で示されているメモリの場所に結果を保存します。チャートは演算子 ascii2str を使用してこの出力を string sout に変換します。この方法により、モデルは、カスタム コード関数によって作成された string を Stateflow にインポートします。

参考

| | | |

関連するトピック