メインコンテンツ

C コードのスタイルの制御

このチュートリアルについて

学習目的

このチュートリアルでは以下の方法について説明します。

  • if-elseif-else 判定ロジックのコードを switch-case ステートメントとして生成する。

  • MATLAB® Coder™ アプリを使用して MATLAB コードから C コードを生成する。

  • MATLAB Coder プロジェクトで、コード生成の構成パラメーターを設定する。

  • 元の MATLAB コードと生成された C コードの間のトレースに使用できるコード生成レポートを生成する。

必要な製品

このチュートリアルを実施するには次の製品が必要です。

  • MATLAB

  • MATLAB Coder

  • C コンパイラ

    MATLAB Coder では、サポートされているインストール済みのコンパイラが検索されて使用されます。MathWorks® Web サイトのサポートされるコンパイラを参照してください。

    mex -setup を使用して、既定のコンパイラを変更できます。既定のコンパイラの変更を参照してください。

必要なファイル

タイプ名前説明
関数のコードtest_code_style.mif-elseif-else を使用する MATLAB の例

ローカルの作業フォルダーでのファイルの作成

  1. ローカル作業フォルダーを作成します。たとえば c:\ecoder\work のようにします。

  2. 次のコードを含むファイル test_code_style.m を作成します。

    function y = test_code_style(x) 
    %#codegen
    
    if (x == 1)
        y = 1;
    elseif (x == 2)
        y = 2;
    elseif (x == 3)    
        y = 3;
    else
        y = 4;
    end

MATLAB Coder アプリを開く

MATLAB ツールストリップの [アプリ] タブの [コード生成] の下で、MATLAB Coder アプリ アイコンをクリックします。アプリで、[MATLAB Coder プロジェクトの作成] ダイアログ ボックスが開きます。

プロジェクト ファイルの名前と、ファイルを保存するフォルダーを指定します。この例では、現在の作業フォルダーに code_style.coderprj という名前のファイルを作成します。

ソース ファイルの指定

  1. MATLAB Coder パネルの [入力] セクションにある [エントリ ポイントの追加] ボタン、またはツールストリップの [エントリ ポイント] ボタンのいずれかをクリックします。

  2. [エントリ ポイント] タブが開きます。エントリポイント関数の名前 test_code_style を入力します。

  3. エントリポイント関数について、アプリでコード生成の準備状態ツールが実行されます。このツールは、MATLAB コードをスクリーニングしてコード生成でサポートされない機能や関数がないかどうかを調べます。エントリポイント関数またはその依存関係のいずれかで問題が特定されると、[エントリ ポイント] タブに警告メッセージが表示されます。この例では、test_code_style 関数でコード生成の準備状態の問題は検出されません。

入力の型の定義

C では静的型付けが使用されるため、コード ジェネレーターは MATLAB ファイル内のすべての変数のプロパティをコンパイル時に判別しなければなりません。したがって、すべての関数入力のプロパティを指定しなければなりません。入力 x のプロパティを定義するには、[エントリ ポイント] タブで以下を行います。

  1. test_code_style ノードを展開します。

  2. x の右にあるフィールドをクリックします。オプションの一覧から [int16] を選択します。サイズの指定は既定値の 1 行 1 列のままにします。

MEX 関数の生成と実行

MEX 関数は MATLAB 内から呼び出すことができる生成コードです。スタンドアロン C/C++ コードを生成する前に、MEX 関数を生成して実行することをお勧めします。このステップで、生成されたスタンドアロン C/C++ コードでの診断が難しいランタイム エラーを検出して修正することができます。既定では、MEX 関数にはメモリ整合性チェックが含まれます。このチェックにより、配列の範囲と次元のチェックが実行されます。このチェックを実行することにより、MATLAB 関数に対して生成されたコード内のメモリ整合性の違反が検出されます。詳細については、実行時チェックの制御を参照してください。

  1. ツールストリップの [MATLAB Coder] タブの [準備] セクションで、[出力][C][ビルド タイプ][MEX] に設定します。それ以外のコード構成設定については既定値を使用します。

  2. ツールストリップの [生成] セクションで、[コード生成] ドロップダウン メニューを開き、[コードを生成してビルド] オプションを選択します。

コード生成パネルの [出力] セクションでコード生成に成功したことが示されます。

生成された MEX 関数 test_code_style_mex は現在の作業フォルダーにあります。コマンド ウィンドウで、サンプル入力を使用して MEX 関数を実行します。以下に例を示します。

test_code_style_mex(int16(4));
生成された MEX はエラーなしで実行されます。

コード生成パラメーターの設定

ツールストリップの [MATLAB Coder] タブの [準備] セクションで、以下を行います。

  1. [ビルド タイプ][スタティック ライブラリ (.lib)] に設定します。

  2. [設定] をクリックし、次のパラメーターを設定します。

    • [コード外観] タブで [if-elseif-else のパターンを switch-case ステートメントに変換する] チェック ボックスをオンにします。

    • [デバッグ] タブで [常にレポートを作成] が選択されていることを確認します。

    • [詳細設定] タブで [コードのトレーサビリティを有効にする] が選択されていることを確認します。

メモ

[if-elseif-else のパターンを switch-case ステートメントに変換する] の最適化は、入力のデータ型が整数と列挙の場合にのみ機能します。

スタンドアロン C コードの生成

ツールストリップの [生成] セクションで、[コード生成] ドロップダウン メニューを開き、[コードを生成してビルド] オプションを選択します。

コード生成が完了すると、コード ジェネレーターによって C スタティック ライブラリ test_code_style.lib と C コードが /codegen/lib/test_code_style サブフォルダーに生成されます。[MATLAB Coder] パネルの [出力] セクションでレポートへのリンクが提供されます。

生成されたコードの表示

  1. コード生成レポートを開くには、[コード生成レポート] リンクをクリックします。

    関数 test_code_style がコード ペインに表示されます。

  2. MATLAB コードと C コードを隣り合わせで表示するには、[コードのトレース] をクリックします。

  3. MATLAB コードのステートメント if (x == 1) にカーソルを合わせます。

    レポートで if (x == 1) から switch ステートメントにトレースされます。

参考

トピック