ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

チャート データでサポートされている演算

二項演算とビット演算

以下の表は、C チャートでのすべての二項演算子の解釈をまとめたものです。各演算子は、以下の優先順位 (0 = 最高、10 = 最低) に基づいて実行されます。同じ優先順位をもつ論理二項演算子は、左から右に評価を行います。その他の演算子の評価順序は規定されていません。たとえば、以下の代入では、foo()bar() が評価される順序は規定されていません。

A = foo() > bar();

結果を予測しやすくするために、評価順序に依存する式を複数のステートメントに分割してコードを書くことをお勧めします。

二項演算子 &^|&&、および || は、単一のチャートまたはモデル内の全チャートに対して Stateflow® によって生成された C コード内で、ビット単位演算子として解釈されるように指定できます。個別の 2 項演算子またはビット演算子の解釈については、以下の表の各演算子を参照してください。

優先順位

説明

a ^ b

0

オペランド ab の累乗

[チャート] プロパティ ダイアログ ボックスで [C 言語のビット演算が可能] が選択されていない場合に有効になります。チャートのプロパティの指定 を参照してください。

a * b

1

乗算

a / b

1

除算

a %% b

1

残余

a + b

2

加算

a - b

2

減算

a >> b

3

オペランド a を右に b ビット移動します。この演算子の非整数オペランドは、最初に整数にキャストされてから、ビット シフトされます。

a << b

3

オペランド a を左に b ビット移動します。この演算子の非整数オペランドは、最初に整数にキャストされてから、ビット シフトされます。

a > b

4

1 番目のオペランドが 2 番目のオペランドよりも大きいかを比較

a < b

4

1 番目のオペランドが 2 番目のオペランドよりも小さいかを比較

a >= b

4

1 番目のオペランドが 2 番目のオペランド以上であるかを比較

a <= b

4

1 番目のオペランドが 2 番目のオペランド以下であるかを比較

a == b

5

2 つのオペランドが等しいかを比較

a ~= b

5

2 つのオペランドが等しくないかを比較

a != b

5

2 つのオペランドが等しくないかを比較

a <> b

5

2 つのオペランドが等しくないかを比較

a & b

6

以下のいずれかに該当します。

  • 2 つのオペランドのビット単位 AND

    [チャート] プロパティ ダイアログ ボックスで [C 言語のビット演算が可能] が選択されている (既定値) 場合に有効となります。チャートのプロパティの指定を参照してください。

  • 2 つのオペランドの論理 AND

    [チャート] プロパティ ダイアログ ボックスで [C 言語のビット演算が可能] が選択されていない場合に有効になります。

a ^ b

7

2 つのオペランドのビット単位 XOR

[チャート] プロパティ ダイアログ ボックスで [C 言語のビット演算が可能] が選択されている (既定値) 場合に有効となります。チャートのプロパティの指定 を参照してください。

a | b

8

以下のいずれかに該当します。

  • 2 つのオペランドのビット単位 OR

    [チャート] プロパティ ダイアログ ボックスで [C 言語のビット演算が可能] が選択されている (既定値) 場合に有効となります。詳細は、チャートのプロパティの指定を参照してください。

  • 2 つのオペランドの論理 OR

    [チャート] プロパティ ダイアログ ボックスで [C 言語のビット演算が可能] が選択されていない場合に有効になります。

a && b

9

2 つのオペランドの論理 AND

a || b

10

2 つのオペランドの論理 OR

単項演算

C チャートでは、以下の単項演算子がサポートされています。べき乗演算子 a ^ b を除くと、単項演算子は二項演算子よりも優先度が高くなっています。最も優先度が高いのはべき乗演算子です。演算子は右から左の順序で評価されます (右結合)。

説明

~a

a の論理否定

a の補数 (bitops が有効な場合)

!a

a の論理否定

-a

a の負の数

単項アクション

C チャートでは、以下の単項アクションがサポートされています。

説明

a++

増分 a

a--

減分 a

代入演算

C チャートでは、以下の代入演算がサポートされています。

説明

a = expression

シンプルな代入

a := expression

主に固定小数点で利用されます。詳細については、代入 (=、:=) 演算 を参照してください。

a += expression

a = a + expression と同等

a -= expression

a = a - expression と同等

a *= expression

a = a * expression と同等

a /= expression

a = a / expression と同等

C チャートでは、チャートのプロパティ ダイアログ ボックスで [C 言語のビット演算が可能] が選択されている場合、以下の代入演算がサポートされています。チャートのプロパティの指定 を参照してください。

説明

a |= expression

a = a | expression と同等 (ビット演算)。二項演算とビット演算 の演算 a | b を参照してください。

a &= expression

a = a & expression (ビット演算) と同等。二項演算とビット演算 の演算 a & b を参照してください。

a ^= expression

a = a ^ expression (ビット演算) と同等。二項演算とビット演算 の演算 a ^ b を参照してください。

ポインター演算とアドレス演算

C チャートでは、アドレス演算子 (&) は、カスタム コード変数と Stateflow 変数の両方で使用できます。ポインター演算子 (*) は、カスタム コード変数でのみ使用できます。

メモ

パーサーでは一連の緩やかな制限が使用され、コンパイル時までは構文エラーは検出されません。

以下の例は、Stateflow 変数とカスタム コード変数の両方で有効な構文を示しています。接頭辞 cc_ は、カスタム コード変数のみを使用できる場所を示します。接頭辞 sfcc_ は、Stateflow 変数またはカスタム コード変数のいずれかを使用できる場所を示します。

cc_varPtr = &sfcc_var;
cc_ptr = &sfcc_varArray[<expression>];
cc_function(&sfcc_varA, &sfcc_varB, &sfcc_varC);
cc_function(&sfcc_sf.varArray[<expression>]);

以下の例は、カスタム コード変数でのみ有効な構文を示しています。

varStruct.field = <expression>;
(*varPtr) = <expression>;
varPtr->field = <expression>;
myVar = varPtr->field;
varPtrArray[index]->field = <expression>;
varPtrArray[expression]->field = <expression>;
myVar = varPtrArray[expression]->field;

型キャスト演算

ある型の値を、別の型で表すことができる値に変換するには、型キャスト演算子を使用します。Stateflow ソフトウェアは変数の代入に使用される型の間で相違があるかどうかをチェックし、生成されるコードにターゲット言語 (一般的に C) の必須型演算子を挿入して補正します。したがって、通常は、アクションで型キャスト演算子を使用する必要はありません。ただし、外部 (カスタム) コードでは、現在、使用可能な型と異なる型のデータが必要になる可能性があります。この場合は、Stateflow ソフトウェアは必要な型キャストを判別できないため、ユーザーが明示的に型キャスト演算子を使用して、生成するターゲット言語の型キャスト演算子を指定しなければなりません。

たとえばグラフィックス表示用に整数 RGB 値を必要とするカスタム コード関数があるとします。該当する値を Stateflow データで保持しているとします。ただし、データ型は double のみです。この関数を呼び出すには、元のデータをキャストして、その結果を整数に代入しなければなりません。この整数は、関数に対する引数として使用します。

Stateflow の型キャスト演算には次の 2 種類の型があります。MATLAB® 型キャスト型と、cast 演算子を使用する明示的な型です。これらの演算子と特殊な type 演算子 (明示的な cast 演算子で操作) については、以下のトピックで説明します。

MATLAB 型の型キャスト演算子

MATLAB 型の型キャストは、以下のような一般型で設定されます。

<type_op>(<expression>)

<type_op> は変換型演算子であり、doublesingleint32int16int8uint32uint16uint8、または boolean に該当します。<expression> は、変換対象の式です。たとえば、以下のように式 x+3 を 16 ビット符号なしの整数にキャストして、値をデータ y に代入できます。

y = uint16(x+3)

明示的な型キャスト演算子

以下の一般型が設定された明示的な cast 演算子を使用して、型キャストを設定することも可能です。

cast(<expression>,<type>)

前述の例では、ステートメント

y = cast(x+3,'uint16')

は式 x+3 を 16 ビット符号なしの整数にキャストして、y (任意の型) に代入しています。

type 演算子

type 演算子を明示的な型キャスト演算子 cast と組み合せて使用すると、他のデータの型に基づいて型をデータに割り当てることが可能になり、型キャストの利便性が向上します。

以下のような一般型に従って、type 演算子は既存の Stateflow データの型を返します。

type(<data>)

<data> は、型を返す対象のデータです。

type 演算の戻り値は、明示的な cast 演算でのみ使用できます。たとえば、データ y をデータ z と同じ型に変換するには、以下のステートメントを使用します。

cast(y,type(z))

この場合、データ z には、許容される任意の Stateflow 型が設定されます。

アプリケーション実装による演算子の置換

コード ジェネレーターを構成して、生成コードがアプリケーション要件を満たすよう、演算子に応じて変更されるようにできます。これを行うには、コードの生成時にコード置換ライブラリ (CRL) を適用するようにコード ジェネレーターを構成します。Embedded Coder® のライセンスをお持ちの場合は、カスタム コード置換ライブラリを開発して適用できます。

コード置換ライブラリの演算子エントリでは、整数/固定小数点オペランドと結果パターンを指定できます。演算子エントリには、以下の組み込み演算子を使用できます。

+
-
*
/

たとえば、y = u1 + u2 という式をターゲット固有の実装で置き換えることができます。ただし、u1u2 および y が、コード置換ライブラリの追加エントリと一致する型をもつことが前提となります。

C チャートのセマンティクスでは、演算式でターゲット整数のサイズが中間型として使用されるため、演算子エントリの整合性が制限される可能性があります。たとえば、以下の演算式を含む Stateflow アクションを考えます。

y = (u1 + u2) % 3

この式は、ターゲット整数への中間加算を計算します。ターゲット整数のサイズが 32 ビットである場合は、この式をコード置換ライブラリからの加算演算子で置き換えて桁落ちすることなく符号付き 16 ビット値を得ることはできません。

MathWorks® が提供するコード置換ライブラリを使用したコード置換の詳細については、コード置換とは (Simulink Coder)およびコード置換ライブラリ (Simulink Coder)を参照してください。カスタム コード置換ライブラリの開発の詳細については、What Is Code Replacement Customization? (Embedded Coder)およびCode You Can Replace From Simulink Models (Embedded Coder)を参照してください。