Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

列挙型のコードの生成

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

MATLAB Function ブロックで列挙を使用する場合は、次の制限に従います。

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

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

  • uint32 列挙型のメンバーについて、コード生成では intmax("int32") 以下の値がサポートされます。

  • MATLAB Function ブロックの場合、Simulink.defineIntEnumType を使用して外部で定義された型をインポートしたり、列挙型クラスを定義したりできます。列挙クラスは Simulink.IntEnumTypeint8uint8int16uint16int32uint32 のいずれかの基本データ型から派生しなければなりません。MATLAB Function ブロックの列挙型の定義を参照してください。

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

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

MATLAB Function ブロックの列挙型の定義

MATLAB Function ブロックの列挙型は次の 2 つの方法で定義できます。

  • 外部で定義された列挙型をインポートするには、関数 Simulink.defineIntEnumType を使用します。MATLAB の外部で定義された列挙型のインポートを参照してください。

  • クラス定義ファイルで、列挙型を定義します。以下に例を示します。

    classdef PrimaryColors < Simulink.IntEnumType
        enumeration
            Red(1),
            Blue(2),
            Yellow(4)
        end
    end

クラス定義ファイルで列挙型を定義する場合、クラスは基本データ型、Simulink.IntEnumTypeint8uint8int16uint16 または int32 のいずれかから派生しなければなりません。次に、モデル内の MATLAB Function ブロックと他の Simulink ブロック間で列挙型データを交換できます。

Simulink Coder を使用して C/C++ コードを生成する場合、列挙型クラスの基本データ型を使用して、生成される C/C++ コード内の列挙型のサイズを制御できます。以下が可能です。

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

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

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

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

基本データ型は、生成された C/C++ コード内の列挙型の表現を決定します。

基本データ型が Simulink.IntEnumType の場合、コード ジェネレーターは C の列挙型を生成します。次の MATLAB における列挙型の定義について検討します。

classdef LEDcolor < Simulink.IntEnumType
    enumeration
        GREEN(1),
        RED(2)
    end
end

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

typedef enum {
  GREEN = 1,                          
  RED
} LEDcolor;
組み込みの整数基本データ型の場合、コード ジェネレーターは列挙型に対して typedef ステートメントを生成し、列挙値に対して #define ステートメントを生成します。次の MATLAB における列挙型の定義について検討します。
classdef LEDcolor < int16
    enumeration
        GREEN(1),
        RED(2)
    end
 end
この列挙型の定義は次の C コードになります。
typedef int16_T LEDcolor;

#define GREEN                          ((LEDcolor)1)             
#define RED                            ((LEDcolor)2)

列挙型用に生成されたコードをカスタマイズするには、Simulink 列挙型のカスタマイズを参照してください。

列挙型で実行可能な演算

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

演算メモ

代入演算子: =

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

参考

関連するトピック