値クラス オブジェクトを入力として指定
MATLAB® Coder™ アプリを使用するか、コマンド ラインで codegen
コマンドを使用して、値クラスのインスタンスを入力変数として指定できます。場合によっては、入力変数がプロパティ検証を含むユーザー記述の MATLAB クラスである場合、関数の引数の検証を使用して入力の型を指定できます。Use User-Written MATLAB Classes in arguments Blocksを参照してください。エントリポイント関数に対するハンドル クラスの入力はコード生成でサポートされていません。
値クラスを入力の型として指定するには、クラス定義が作業ディレクトリまたは MATLAB パス上になければなりません。
MATLAB Coder を使用してコードを生成する場合、値クラスの入力を自動または手動で定義できます。値クラスの入力を手動で定義する場合は、値クラスのインスタンスを生成する MATLAB コマンドを入力するように求めるプロンプトが表示されます。
コマンド ラインで
codegen
コマンドを使用してコードを生成する場合、値クラスのインスタンスを作成し、-args
オプションを使用してこのオブジェクトをcodegen
に渡します。
別の方法として、コマンド ラインで coder.typeof
を使用するか、対話形式でコード生成の型エディターを使用すると、値クラスのオブジェクトの型を作成できます。コード生成の型エディターを使用した入力の型の作成と編集を参照してください。
例: 値クラスの入力を受け取るエントリポイント関数のコードの生成
エントリポイント関数 calcArea
について考えます。この関数は、値クラス MyRectangle
のインスタンスを受け取り、MyRectangle
オブジェクトの length
プロパティと width
プロパティを乗算します。
function out = calcArea(r) %#codegen out = r.length*r.width; end
値クラス MyRectangle
は作業ディレクトリで定義されているか MATLAB パス上にあるものとします。
classdef MyRectangle properties length (1,1) double width (1,1) double end end
MATLAB Coder アプリを使用したコードの生成
calcArea
をエントリポイント関数として定義します。[エントリ ポイント] ペインを開き、入力変数 r
の横にある [クリックしてデータ型を定義してください] をクリックします。クラス定義のボックスに「MyRectangle
」と入力します。MyRectangle
オブジェクトを生成する MATLAB コードを入力するように求めるプロンプトが表示されます。このプロンプトで「MyRectangle
」と入力します。length
プロパティと width
プロパティの型がクラス定義に基づいて決定されます。
コードを生成するには、MATLAB Coder ツールストリップまたはコード生成サイドバーの [出力] セクションで [コード生成] をクリックします。
codegen
コマンドを使用したコードの生成
コマンド ラインで MyRectangle
クラスのインスタンスを作成し、このインスタンスを codegen
コマンドに渡します。
myObj = MyRectangle
myObj = MyRectangle with properties: length: 0 width: 0
codegen calcArea -args {myObj} -report
Code generation successful: View report
レポートを開いて [変数] タブをクリックします。入力引数 r
のプロパティが myObj
オブジェクトと同じになっています。
型定義とクラス定義との整合性
コードを生成するとき、アプリで定義するプロパティや codegen
に渡すオブジェクトのプロパティは、クラス定義ファイルのプロパティと一致していなければなりません。ただし、コードで使用しないプロパティがクラス定義ファイルにある場合、それらのプロパティを型定義に含める必要はありません。コード ジェネレーターは、使用されていないプロパティを削除します。
オブジェクトをエントリポイント関数の入力として使用する場合の制限事項
オブジェクトであるエントリポイント関数の入力には次のような制限事項があります。
エントリポイント関数の入力であるオブジェクトは、値クラスのオブジェクトでなければなりません。ハンドル クラスのオブジェクトをエントリポイント関数の入力にすることはできません。そのため、ハンドル クラスを含む値クラスをエントリポイント関数の入力にすることはできません。
オブジェクトをグローバル変数にすることはできません。
オブジェクトに重複するプロパティ名がある場合は、そのオブジェクトを
coder.Constant
で使用できません。次の場合、サブクラスのオブジェクトでプロパティ名が重複します。サブクラスに、スーパークラスのプロパティと同じ名前のプロパティがある。
サブクラスが、プロパティに同じ名前を使用する複数のスーパークラスから派生している。
MATLAB で重複するプロパティ名が許可される場合の詳細については、複数のクラスからのサブクラスの作成を参照してください。