Main Content

列挙型のコードの生成

列挙型は名前付きの値の固定セットを表します。 列挙型を使用すると、MATLAB® コードと生成される C/C++ コードが読みやすくなります。たとえば、strcmp を使用する代わりに、生成されたコードで if (x == Red) などのコードとの等価性をテストできます。

コード生成で列挙型を使用する場合、次の制限に従います。

  • 列挙型クラスのメソッドの呼び出しはサポートされません。

  • string または文字ベクトルを列挙型のコンストラクターに渡すことはサポートされません。

  • 列挙型クラスは int8uint8int16uint16 または int32 のいずれかの基本データ型から派生されなければなりません。コード生成用列挙型の定義を参照してください。

  • 列挙型に対しては限られた一連の操作のみを使用できます。列挙型で実行可能な演算を参照してください。

  • コード生成用に列挙型をサポートする関数で列挙型を使用します。列挙型をサポートする MATLAB ツールボックス関数を参照してください。

コード生成用列挙型の定義

コード生成では、列挙型クラスは int8uint8int16uint16 または int32 のいずれかの基本データ型から派生されなければなりません。以下に例を示します。

classdef PrimaryColors < int32
    enumeration
        Red(1),
        Blue(2),
        Yellow(4)
    end
end

生成される C/C++ コード内の列挙型のサイズを基本データ型を使用して制御できます。以下を行うことができます。

  • 列挙型を固定サイズの整数で表し、別のターゲットへの移植を可能にします。

  • メモリ使用量を削減します。

  • レガシ コードと連動させます。

  • 会社標準に一致させます。

生成されたコードにおける列挙型の表現

生成された C/C++ コード内の列挙型の表現は、以下によって決まります。

  • MATLAB 列挙型の基本データ型

  • ターゲット言語 (C または C++)

  • ターゲット言語が C++ の場合は、ターゲット言語標準 (C++03 または C++11)

基本データ型がネイティブ整数型の場合.  基本データ型がターゲット プラットフォームのネイティブ整数型 (int32 など) の場合、コード ジェネレーターは C/C++ の列挙型を生成します。この MATLAB 列挙型定義について考えます。

classdef LEDcolor < int32
    enumeration
        GREEN(1),
        RED(2)
    end
end

C コードまたは C++03 コードを生成する場合、生成される列挙型は次のようになります。

enum LEDcolor
{
    GREEN = 1,
    RED
};

C++11 コードを生成する場合、生成されるコードには、基となる型を明示的に定義する列挙クラスが含まれます (既定の設定)。

enum class LEDcolor : int
{
  GREEN = 1, 
  RED
};

基本データ型がネイティブ整数型とは異なる場合.  列挙型の組み込みの整数基本データ型がターゲット プラットフォームのネイティブ整数型とは異なるとします。たとえば、次の MATLAB 列挙型定義について考えます。

classdef LEDcolor < int16
    enumeration
        GREEN(1),
        RED(2)
    end    
end

  • C コードを生成する場合、コード ジェネレーターは列挙型に対して typedef ステートメントを生成し、列挙値に対して #define ステートメントを生成します。たとえば、列挙型定義 LEDcolor は次の C コードになります。

    typedef short LEDcolor;
    #define GREEN ((LEDcolor)1)
    #define RED ((LEDcolor)2)
    

  • C++03 コードを生成する場合、列挙型メンバーが定数に変換されます。それらの定数は、生成された C++ コードの列挙型定義を含む名前空間に属します。

    たとえば、列挙型定義 LEDcolor をパッケージ pkg 内に配置するとします。コード ジェネレーターの既定の動作では、MATLAB パッケージは C++ 名前空間に変換されます。生成された C++ コードは名前空間 pkg 内に配置されます。

    namespace pkg {
    typedef short LEDcolor;
    
    // enum pkg_LEDcolor
    const LEDcolor GREEN{1};
    const LEDcolor RED{2};
    
    }
  • C++11 では、MATLAB と同様に列挙型の基となる型を指定できます。C++11 コードを生成する場合、MATLAB 列挙クラスは、基となる型を明示的に定義する C++ 列挙クラスに変換されます (既定の設定)。

    たとえば、列挙型定義 LEDcolor をパッケージ pkg 内に配置するとします。コード ジェネレーターの既定の動作では、MATLAB パッケージは C++ 名前空間に変換されます。生成された C++11 コードは名前空間 pkg 内に配置されます。

    namespace pkg {
    enum class LEDcolor : short
    {
      GREEN = 1, // Default value
      RED
    };
    
    }

typedef ステートメントの C/C++ の型または C++11 列挙型の基となる型は以下に依存します。

通常の C の列挙を含む C++11 コードの生成.  コード ジェネレーターの既定の動作を変更して、生成された C++11 コード内で通常の C の列挙を生成できます。次のいずれかを行います。

  • コード生成構成オブジェクト内で CppGenerateEnumClass プロパティを false に設定する。

  • MATLAB Coder™ アプリの [生成] ステップの [コード外観] タブで、[MATLAB 列挙から C++ 列挙クラスを生成] チェック ボックスをオフにする。

コード ジェネレーターに、コード内の特定の MATLAB 列挙クラスに対応する通常の C の列挙を生成するよう指示するには、その MATLAB 列挙クラスの実装に false を返す静的メソッド generateEnumClass を含めます。生成されたコードにおける列挙型のカスタマイズを参照してください。

列挙型で実行可能な演算

コード生成では、次の表に示す列挙型の演算に制限されます。

演算メモ

代入演算子: =

xon = LEDcolor.GREEN
xoff = LEDcolor.RED

関係演算子: < > <= >= == ~=

xon == xoff

コード生成では、== または ~= を使用した列挙型メンバーと string 配列、文字配列または文字配列の cell 配列との間の等価性のテストはサポートされません。

キャスト演算

double(LEDcolor.RED)

文字配列または string への変換

y = char(LEDcolor.RED);
y1 = cast(LEDcolor.RED,'char');
y2 = string(LEDcolor.RED);

  • コンパイル時のスカラー値列挙のみ変換可能。たとえば、次のコードは MATLAB で実行されますが、コード生成ではエラーが発生します。

    y2 = string(repmat(LEDcolor.RED,1,2));
  • コード ジェネレーターは、変換入力が定数の場合のみ列挙名を維持する。たとえば、次の列挙型定義について考えます。

    classdef AnEnum < int32
        enumeration
            zero(0),
            two(2),
            otherTwo(2)
        end
    end

    生成されたコードは次に対して "two" を生成します。

    y = string(AnEnum.two)
    また次に対して"otherTwo" を生成します。
    y = string(AnEnum.otherTwo)

インデックス演算

m = [1 2]
n = LEDcolor(m)
p = n(LEDcolor.GREEN)

制御フロー ステートメント: if、switch、while

if state == sysMode.ON
    led = LEDcolor.GREEN;
else
    led = LEDcolor.RED;
end

列挙型をサポートする MATLAB ツールボックス関数

コード生成では、次の MATLAB ツールボックス関数で列挙型を使用できます。

関連するトピック