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++ コード内の列挙型の表現を決定します。

基本データ型が int32 の場合、コード ジェネレーターは C の列挙型を生成します。この MATLAB 列挙型定義について考えます。

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

この列挙型の定義は次の C コードになります。

enum LEDcolor
{
    GREEN = 1,
    RED
};

typedef enum LEDcolor LEDcolor;

int32 以外の組み込みの整数基本データ型の場合、コード ジェネレーターは列挙型に対して typedef ステートメントを生成し、列挙値に対して #define ステートメントを生成します。この MATLAB 列挙型定義について考えます。

classdef LEDcolor < int16
    enumeration
        GREEN(1),
        RED(2)
    end
    
end
列挙型定義は、結果的に次の C コードになります。
typedef short LEDcolor;
#define GREEN ((LEDcolor)1)
#define RED ((LEDcolor)2)

typedef ステートメントの C の型は以下に依存します。

列挙型で実行可能な演算

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

演算メモ

代入演算子: =

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 ツールボックス関数で列挙型を使用できます。

関連するトピック