Why a condition like If (~Input) changes to a complex condition with ternary operator ?

10 ビュー (過去 30 日間)
When I am trying to generate C code with Embedded Coder, the following condition
if (~Input)
is converted to the following ugly condition
if ((boolean_T)((int32_T)((Input ? ((int32_T)1) : ((int32_T)0)) ^ 1))) {
Is there any option to change in the setting to avoid this type of code being generated?
Is there a reason why this code would be generated instead of a simpler alternative?
The same code is generated if I change the condition to:
if (false == Input)
  4 件のコメント
Walter Roberson
Walter Roberson 2022 年 12 月 1 日
Bleh, that code is equivalent to
xor(1, Input ~= 0)
which is pretty ugly.
What happens if you change the condition to
if (Input == 0)
?
Miguel
Miguel 2022 年 12 月 1 日
I tried this different condition and the generated code was the same.

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

採用された回答

Miguel
Miguel 2022 年 12 月 1 日
Thanks everybody to take the time to review the question.
After reviewing all the possible options in the Code Generator and comparing one configuration that generated the ugly code vs a new one that didn't generate it, It was found that the parameter responsible for the ugly code is:
The ugly code is generated when it is set to "Bitwise operator"

その他の回答 (1 件)

Les Beckham
Les Beckham 2022 年 12 月 1 日
So, the original condition if (~Input) is C code and not Matlab code? If so, you should use the logical not operator which is ! in C instead of ~ (as it is in Matlab).
~false in C will be 0xFFFFFFFE (or similar) and the ugly ternary expression coerces that back to a 1.
BTW - please post comments as comments rather than answers.
  3 件のコメント
Les Beckham
Les Beckham 2022 年 12 月 1 日
I thought that too until OP said "The class of variable "Input" is "boolean_T". Perhaps he meant in the generated code. I meant in the original Matlab code when I asked that. Probably a misunderstanding.
@Miguel - can you tell us the class of Input in the Matlab code instead of in the generated C code?
Miguel
Miguel 2022 年 12 月 1 日
The original code was Matlab code. The "Input" variable type was inherited from simulink and it was of type boolean. The code is in a Matlab function inside of a simulink model.
In the generated C code, the "Input" variable was of type "boolean_T".

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

カテゴリ

Help Center および File ExchangeDeployment, Integration, and Supported Hardware についてさらに検索

製品


リリース

R2021b

Community Treasure Hunt

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

Start Hunting!

Translated by