Main Content

コマンド ラインでの入力としてのオブジェクトの指定

codegen を使用してコードを生成する場合、値クラス オブジェクトである入力の型を指定するために、-args オプションを使用してオブジェクト例を指定できます。

  1. 値クラスを定義します。たとえば、クラス myRectangle を定義します。

    classdef myRectangle
        properties
            length;
            width;
        end
        methods
            function obj = myRectangle(l,w)
                if nargin > 0
                    obj.length = l;
                    obj.width = w;
                end
            end
            function area = calcarea(obj)
                area = obj.length * obj.width;
            end
        end
    end

  2. 値クラスのオブジェクトを入力として取得する関数を定義します。次に例を示します。

    function z = getarea(r)
    %#codegen
    z = calcarea(r);
    end

  3. クラスのオブジェクトを作成します。

    rect_obj = myRectangle(4,5)
    

    rect_obj = 
    
      myRectangle with properties:
    
        length: 4
         width: 5
  4. -args オプションを使用して、オブジェクト例を codegen に渡します。

    codegen getarea -args {rect_obj} -report

    コード生成レポートで、r にオブジェクト例 rect_object と同じプロパティ length および width があることがわかります。プロパティのサイズと型は、オブジェクト例 rect_object と同じです。

    Code generation report window, showing properties length and width of myRectangle object r

オブジェクト例を指定する代わりに、値クラスのオブジェクトの型を作成し、-args オプションを使用してその型を指定することができます。

  1. クラスのオブジェクトを作成します。

    rect_obj = myRectangle(4,5)
    
    rect_obj = 
    
      myRectangle with properties:
    
        length: 4
         width: 5

  2. プロパティの型が rect_obj と同じ myRectangle のオブジェクトに対する型を作成するには、coder.typeof を使用します。

    coder.typeof は、クラスに対する型を定義する coder.ClassType オブジェクトを作成します。

    t= coder.typeof(rect_obj)
    
    t = 
    
    coder.ClassType
       1×1 myRectangle   
          length: 1×1 double
          width : 1×1 double

  3. -args オプションを使用して、型を codegen に渡します。

    codegen getarea -args {t} -report

値クラスの型を作成した後、プロパティの型を変更できます。たとえば、t のプロパティを 16 ビット整数にするには、次を行います。

t.Properties.length = coder.typeof(int16(1))
t.Properties.width = coder.typeof(int16(1))

プロパティを追加または削除することもできます。たとえば、newprop プロパティを追加する方法は以下のとおりです。

t.Properties.newprop = coder.typeof(int16(1))

coder.ClassType オブジェクトとクラス定義ファイル間の整合性

コードを生成するとき、codegen に渡される coder.ClassType オブジェクトのプロパティはクラス定義ファイル内のプロパティと一致していなければなりません。コードで使用されていないプロパティがクラス定義ファイルに存在する場合、coder.ClassType オブジェクトはこれらのプロパティを含める必要はありません。コード ジェネレーターは、使用されていないプロパティを削除します。

オブジェクトをエントリポイント関数の入力として使用する場合の制限事項

オブジェクトであるエントリポイント関数の入力には次のような制限事項があります。

  • エントリポイント関数の入力であるオブジェクトは、値クラスのオブジェクトでなければなりません。ハンドル クラスのオブジェクトをエントリポイント関数の入力にすることはできません。そのため、ハンドル クラスを含む値クラスをエントリポイント関数の入力にすることはできません。

  • オブジェクトをグローバル変数にすることはできません。

  • オブジェクトに重複するプロパティ名がある場合は、そのオブジェクトを coder.Constant で使用できません。次の場合、サブクラスのオブジェクトでプロパティ名が重複します。

    • サブクラスに、スーパークラスのプロパティと同じ名前のプロパティがある。

    • サブクラスが、プロパティに同じ名前を使用する複数のスーパークラスから派生している。

    MATLAB® で重複するプロパティ名が許可される場合の詳細については、複数のクラスからのサブクラスの作成を参照してください。

参考

関連するトピック