このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
ターゲット システムの言語標準の設定
コード ジェネレーターが数学演算に使用する標準ライブラリ拡張を指定します。新しいモデルまたは新しいコンフィギュレーション セット オブジェクトをもつモデルのコードを生成する場合、コード ジェネレーターは既定で ISO®/IEC 9899:1999 C (C99 (ISO)) ライブラリを使用します。既存のモデルおよび既存のコンフィギュレーション セット オブジェクトについては、コード ジェネレーターは [言語標準] パラメーターで指定されているライブラリを使用します。
コンパイラが ISO®/IEC 9899:1990 (C89/C90 (ANSI))、ISO/IEC 14882:2003(C++03 (ISO) または ISO/IEC 14882:2011(C++11 (ISO)) 数学ライブラリ拡張をサポートしている場合、言語標準設定を変更できます。C++03 (ISO) または C++11 (ISO) ライブラリは、プログラミング言語に C++ を選択する場合に使用できます。
C99 ライブラリは、コンパイラによって提供される標準の ANSI C を超えるパフォーマンスを活用します。C99 ライブラリを使用すると、コード ジェネレーターは可能な場合 ISO C 関数の呼び出しを生成します。たとえば、生成コードでは、sqrt()
の代わりに単精度データの演算を行う関数 sqrtf()
を呼び出します。
ライブラリ設定を変更するには、[コンフィギュレーション パラメーター]、[コード生成]、[言語標準] パラメーターを使用します。コマンド ラインの対応するコマンドは TargetLangStandard
です。
ANSI C コードの生成と検査
1. モデル例 CStandardMathLib
を開きます。
2. コードを生成します。
### Starting build procedure for: CStandardMathLib ### Successful completion of code generation for: CStandardMathLib Build Summary Top model targets built: Model Action Rebuild Reason ===================================================================================== CStandardMathLib Code generated. Code generation information file does not exist. 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 19.143s
3. 生成されたファイル CStandardMathLib.c
のコードを調べます。コードでは関数 sqrt
を呼び出していることに注意します。
if (rtb_Abs2 < 0.0F) { rtb_Abs2 = -(real32_T)sqrt((real32_T)fabs(rtb_Abs2)); } else { rtb_Abs2 = (real32_T)sqrt(rtb_Abs2); } /* Gain: '<Root>/Gain1' incorporates: * Constant: '<Root>/Constant' * Sqrt: '<Root>/get_hypot1' * Sum: '<Root>/Sum' * * About '<Root>/get_hypot1': * Operator: signedSqrt */ rtb_Abs2 = (rtb_Abs2 - 1.0F) * 343.0F; /* Rounding: '<Root>/fix1' */ if (rtb_Abs2 < 0.0F) { /* Outport: '<Root>/Out1' */ CStandardMathLib_Y.Out1 = (real32_T)ceil(rtb_Abs2); } else { /* Outport: '<Root>/Out1' */ CStandardMathLib_Y.Out1 = (real32_T)floor(rtb_Abs2); } /* End of Rounding: '<Root>/fix1' */ /* Abs: '<Root>/Abs2' incorporates: * Inport: '<Root>/In2' */ rtb_Abs2 = (real32_T)fabs(CStandardMathLib_U.In2); /* Outport: '<Root>/Out2' incorporates: * Constant: '<Root>/Constant1' * Gain: '<Root>/Gain2' * Math: '<Root>/get_hypot2' * Rounding: '<Root>/fix2' * Sum: '<Root>/Sum2' * Trigonometry: '<S1>/cos' * Trigonometry: '<S1>/sin' */ CStandardMathLib_Y.Out2 = (real32_T)floor((rt_hypotf_snf((real32_T)sin (rtb_Abs2), (real32_T)cos(rtb_Abs2)) - 1.0F) * 343.0F); } /* Model initialize function */ void CStandardMathLib_initialize(void) { /* Registration code */ /* initialize non-finites */ rt_InitInfAndNaN(sizeof(real_T)); /* initialize error status */ rtmSetErrorStatus(CStandardMathLib_M, (NULL)); /* external inputs */ (void)memset(&CStandardMathLib_U, 0, sizeof(ExtU_CStandardMathLib_T)); /* external outputs */ (void)memset(&CStandardMathLib_Y, 0, sizeof(ExtY_CStandardMathLib_T)); } /* Model terminate function */ void CStandardMathLib_terminate(void) { /* (no terminate code required) */ }
ISO C コードの生成と検査
1. [言語標準] の設定を C99 (ISO)
に変更します。または、コマンド ラインで、TargetLangStandard
を C99 (ISO)
に設定します。
2. コードを再度生成します。
### Starting build procedure for: CStandardMathLib ### Successful completion of code generation for: CStandardMathLib Build Summary Top model targets built: Model Action Rebuild Reason ===================================================================================== CStandardMathLib Code generated. Code generation information file does not exist. 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 17.329s
3. 生成されたファイル CStandardMathLib.c
のコードを再度調べます。生成されたコードでは sqrt
ではなく関数 sqrtf
を呼び出すようになりました。
if (rtb_Abs2 < 0.0F) { rtb_Abs2 = -sqrtf(fabsf(rtb_Abs2)); } else { rtb_Abs2 = sqrtf(rtb_Abs2); } /* Outport: '<Root>/Out1' incorporates: * Constant: '<Root>/Constant' * Gain: '<Root>/Gain1' * Rounding: '<Root>/fix1' * Sqrt: '<Root>/get_hypot1' * Sum: '<Root>/Sum' * * About '<Root>/get_hypot1': * Operator: signedSqrt */ CStandardMathLib_Y.Out1 = truncf((rtb_Abs2 - 1.0F) * 343.0F); /* Abs: '<Root>/Abs2' incorporates: * Inport: '<Root>/In2' */ rtb_Abs2 = fabsf(CStandardMathLib_U.In2); /* Outport: '<Root>/Out2' incorporates: * Constant: '<Root>/Constant1' * Gain: '<Root>/Gain2' * Math: '<Root>/get_hypot2' * Rounding: '<Root>/fix2' * Sum: '<Root>/Sum2' * Trigonometry: '<S1>/cos' * Trigonometry: '<S1>/sin' */ CStandardMathLib_Y.Out2 = floorf((rt_hypotf_snf(sinf(rtb_Abs2), cosf(rtb_Abs2)) - 1.0F) * 343.0F); } /* Model initialize function */ void CStandardMathLib_initialize(void) { /* Registration code */ /* initialize error status */ rtmSetErrorStatus(CStandardMathLib_M, (NULL)); /* external inputs */ (void)memset(&CStandardMathLib_U, 0, sizeof(ExtU_CStandardMathLib_T)); /* external outputs */ (void)memset(&CStandardMathLib_Y, 0, sizeof(ExtY_CStandardMathLib_T)); } /* Model terminate function */ void CStandardMathLib_terminate(void) { /* (no terminate code required) */ }