stateflowに​記載した即値をオート​コードする際、符号な​しと認識させる方法は​ありますか

1 回表示 (過去 30 日間)
ryosuke nakatsuka
ryosuke nakatsuka 2020 年 10 月 21 日
編集済み: Toshinobu Shintai 2020 年 10 月 31 日
stateflowに以下のような記載をしました。
  a ++;
 ※変数は、uint8 a;で宣言。
この時、オートコード結果は、以下のようになりました。
  a = (uint8)(a + (int16)1);
 1を符号ありにキャストしてから、符号なしにキャストとなってしまいました。
無駄なキャストを辞めて、以下のようなオートコードを求めています。
a ++; のまま
 もしくは、
a = a + (uint8)1;
即値は全て符号なしと判断され、上記のキャストとなったことは理解できます。
そこで、Stateflow上で即値を"符号なし"と判断させる方法はありませんか。
 ※C言語の 1u というような記載方法
また、キャストモードは、”明示的”にしています。
"ノミナル"に設定すれば期待した結果となることは確認しましたが、
できれば"明示的"で即値の符号あり/なしをコントロールしたいと考えています。

採用された回答

ryosuke nakatsuka
ryosuke nakatsuka 2020 年 10 月 21 日
ご回答ありがとうございます。
そちらは既に試しました。
 a = a + uint8(1);
しかし、キャストに変化はありませんでした。
また、以下も試しました。
  a = a + 1.; // .を追加
すると、以下の出力になりました。
  a = uint8(a + (int16(uint8(1)));
以上、宜しくお願い致します。
  3 件のコメント
ryosuke nakatsuka
ryosuke nakatsuka 2020 年 10 月 27 日
※回答に書いてしまったので、コメントに移動します。
ご回答ありがとうございます。
こちらの環境では、先に書いた通りキャストモードを"明示的"にしています。
頂いたモデルも、キャストモードを"明示的"に変更すると、
以下のようなコードとなりました。
 a = (uint8)((uint32)(int32)a+1u);
単純な変数間の代入は明示的なキャストを求めています。
即値の謎符号付きキャストを抑制したいです。
以上、宜しくお願い致します。
Toshinobu Shintai
Toshinobu Shintai 2020 年 10 月 27 日
編集済み: Toshinobu Shintai 2020 年 10 月 31 日
返事が遅くなりまして、申し訳ありません。
以前、バグとお伝えしましたが、間違いでした。申し訳ありません。この挙動は、キャスティングモードを明示的にした際の正しい挙動となります。以下に説明を記載します。
The usual binary conversion(s) say that a signed int, will be cast to an unsigned int when the other operand of a binary operation is unsigned.
|
v
repro_Y.Out2 = (uint8_T)((uint32_T)(int32_T)repro_U.In3 + 1U);
^ ^
| |
The usual unary conversion(s) require any integer smaller than 'int' will be cast to 'int'
|
Finally, the result of the addition is converted to the type being assigned to so that it fits properly.
このような無駄なキャストを避けるには、その他のキャスティングモードを選択する必要があります。

サインインしてコメントする。

その他の回答 (1 件)

Toshinobu Shintai
Toshinobu Shintai 2020 年 10 月 21 日
MATLAB言語では、以下のように記述するとデータ型を明示できます。
uint8(1)
上記のuint8の部分は、int32やdoubleなど、標準のデータ型名を用いることができます。

カテゴリ

Help Center および File Exchange複雑なロジック についてさらに検索

製品


リリース

R2015a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!