このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。
カスタム 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