カスタム 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 コード関数へのエクスポートが可能な配列に変換できます。
カスタム コード関数で、入力変数が
char*型をもっていることを宣言します。Stateflow チャートで、
str2ascii演算子を呼び出すことにより、string をuint8型の配列に変換します。uint8配列を入力として渡すことにより、カスタム コード関数を呼び出します。
たとえば、前述のチャートでは、Search ステートが、入力 string str を uint8 配列 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]には、入力 stringstrの先頭のゼロの数が含まれます。n[1]には、小数点またはeの最初のインスタンスより前の文字数が含まれます。この結果は、str内の小数点より前の文字数を提供します。n[2]には、eの最初のインスタンスより前の文字数が含まれます。この結果は、str内の仮数に含まれる文字数を提供します。n[3]には、入力 stringstrの長さが含まれます。
Parse ステートは、これらの結果を使用して、入力の仮数部と指数部の値を抽出します。
C から Stateflow への string データのインポート
string データを Stateflow チャートにインポートするには、uint8 型の配列へのポインターを、カスタム C 関数に入力として渡します。
カスタム コード関数で、ポインターを含む入力変数が
char*型をもっていることを宣言します。カスタム コード関数からの出力 string データを、ポインターで示されている場所に保存します。
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 を呼び出し、Astr、y1 および y2 の内容をマージして、Aout で示されているメモリの場所に結果を保存します。チャートは演算子 ascii2str を使用してこの出力を string sout に変換します。この方法により、モデルは、カスタム コード関数によって作成された string を Stateflow にインポートします。
参考
ascii2str | str2ascii | str2double | strcat | substr