主要内容

クラス インターフェイスをもつ C++ コードの生成

C コードを生成する場合、ソフトウェアは MATLAB®matlab关数エントリててエントリ关数关数にエントリエントリエントリポイントポイントを生成生成しします。。。。ますますますますますますますますますますますますますますますコードコードコードコードコードコードコード,,,,,,,,,,,,,クラスクラスクラスクラスクラスを使用とのようになり。。

  • よりオブジェクト指向のコードが得られる。

  • コード ジェネレーターは、メモリの初期化と終了を自動的に実行するクラス コンストラクターとクラス デストラクターを作成する。

  • それぞれのクラス インスタンスに個別にメモリを割り当てる。各クラス インスタンスのメソッドはスレッドセーフで再呼び出し可能である。

  • 複数のエントリポイント関数が単一の C++ クラスのメソッドになる。

コマンド ラインから、またはMATLAB Coder™アプリから、クラス インターフェイスをもつコードを生成できます。コマンド ラインからは、CPPINTFACESTYLE构成パラメーターおよびCppInterfaceClassName構成パラメーターを使用します。アプリからは、[コード生成]のステップで[言語][C ++]を,[インターフェイス スタイル][メソッド]を選択し、[C++ インターフェイス クラス名]を指定します。

これらのでコマンドのワークフロー说明します。

クラス インターフェイスをもつ C++ コードの生成

この例では、生成された C++ コードがクラス インターフェイスを使用する場合の相違点を説明します。

MATLAB アルゴリズム

行列に対する演算を行い結果を出力する単純な MATLAB 関数について考えます。

功能out = foog%#codegenI = eye(447); out = ones(447)*I + 7;

クラス インターフェイスをもつ C++ コードとクラス インターフェイスをもたない C++ コードの生成

クラス インターフェイスをもつ C++ コードを生成するには、CPPINTFACESTYLEパラメーターとCppInterfaceClassNameパラメーターを使用します。出力をwithClassフォルダーに格納します。

cfg = coder.config('lib'); cfg.GenCodeOnly = true; cfg.TargetLang ='C++'; cfg.CppInterfaceStyle ='Methods'; cfg.CppInterfaceClassName ='myClass'; codegenfoog-configcfg-report-dwithClass
代码生成成功:要查看报告,打开('with class/html/report.mldatx')

次に构成オブジェクト作成し,クラスインターフェイス使用C ++コードコードを生成し。。。。。

cfg = coder.config('lib'); cfg.GenCodeOnly = true; cfg.TargetLang ="C++"; codegenfoog-configcfg-report-d没有班级
Code generation successful: To view the report, open('withoutClass/html/report.mldatx')

生成された main 関数の例を調べます。クラス インターフェイスをもつバージョンと、もたないバージョンを比較します。クラス インターフェイスがある場合、main 関数はエントリポイント関数をクラス メソッドとして呼び出します。

typewithClass/examples/main.cpp

生成さたでのクラス定义実装実装

コード ジェネレーターが C++ インターフェイス クラス向けのコードを生成すると、関数メソッドが再呼び出し可能であることが確保されます。関数メソッドが構成パラメーターStackusagemaxで設定されるローカル スタック メモリの制限を超える可能性のある変数を使用する場合、コード ジェネレーターは変数 (接尾辞StackDataで識別可能) に対してプライベートなデータ構造体を作成します。変数をstaticとして宣言することはありません。静的変数は複数の関数の呼び出し間で保持され、再呼び出し可能となりません。再呼び出し可能な C コードの生成の詳細については、再呼び出し可能なコードの生成と呼び出しを参照してください。

生成されたクラス実装を調べるには、関数foogを,构成パラメーターStackusagemaxで指定された最大スタック使用量を超える変数を含むように変更します。

功能out = foogBig%#codegenI = eye(448); out = ones(448)*I + 7;

Stackusagemaxの既定値 (バイト) は次のようになります。

cfg.StackUsageMax
ANS = INT32 200000

fooBig448^2(200704)个个要素の使用しジェネレータージェネレータージェネレータージェネレータージェネレータージェネレータージェネレータージェネレータービットビットのののをを作成作成作成ししして変数変数表す表す表すためためのコードを生成します。

cfg = coder.config('lib','ecoder',足总lse); cfg.GenCodeOnly = true; cfg.TargetLang ='C++'; cfg.CppInterfaceStyle ='Methods'; cfg.CppInterfaceClassName =“ mybigclass”; codegen-configcfg-report-d与杀伤力
Code generation successful: To view the report, open('withBigClass/html/report.mldatx')

生成されたインターフェイス クラス定義の検証

プロジェクトのクラス定義、およびfoogのクラス定義を検証します。クラスは使用を超过可能のある変数プライベートなクラスプロパティプロパティに格纳格纳しますfoogクラスはスタックにローカル変数を作成するだけです。

このクラススタックの量制限をするを必要とすることを示すStackData構造体を含むクラス定義について作業する場合、新的を使用してクラス インスタンスにヒープ メモリを割り当てます。例については、生成されたコードの生成された main ファイルの例を参照してください。

生成された C++ クラスのグローバルと永続

クラス インターフェイスをもつ C++ を生成する場合、クラスのメンバーとしてグローバルと永続にアクセスします。この例では、クラスのグローバルと永続について作業する方法を示します。

MATLAB アルゴリズム

グローバル変数と永続変数を使用して呼び出した回数のカウントを保持する MATLAB 関数について考えます。

功能[po,go] = countCalls%#codegen% increment persistent & global variablepersistentpglobalgifisempty(p) p = 0;endp = p+1;g = g+1;% set output variablespo = double(p);go = double(g);

クラス インターフェイスをもつ C++ コードの生成

コード生成のため、ワークスペースのグローバル変数を初期化します。

globalg; g = 0;

countClassというでコード生成します。

cfg = coder.config('lib'); cfg.GenCodeOnly = true; cfg.TargetLang ='C++'; cfg.CppInterfaceStyle ='Methods'; cfg.CppInterfaceClassName ="countClass"; codegencountCalls-configcfg-report
Code generation successful: To view the report, open('codegen/lib/countCalls/html/report.mldatx')

クラス定義の検証

生成された C++ コードで、初期化関数がグローバル変数をワークスペースで指定する値に設定します。グローバル変数の初期値はCodeGen -Globals構文で指定することもできます。

コードをヘッダー ファイルcountClass.hのクラス定義について検証します。

typecodegen/lib/countcalls/countclass.h

グローバル変数はクラスのパブリック メンバーです。必要に応じて main 関数からこの変数にアクセスします。永続変数はプライベートなクラス データ構造体に格納されます。

複数のエントリポイント関数の同一クラスへの配置

複数のエントリポイント関数の C++ コードを生成してクラス インターフェイス設定を使用すると、各関数が同じクラスのパブリック メソッドになります。この手法を使用して、複数のエントリポイント関数プロジェクトに、より単純なインターフェイスを作成できます。

MATLAB エントリポイント関数

前の例の関数countCallsを 2 つに分割して、1 つの関数が永続変数を使用して呼び出しをカウントし、もう 1 つの関数がグローバル変数を使用して呼び出しをカウントするようにします。2 つの関数を検証します。

功能po = countpersistent%#codegen% increment persistent variablepersistentpifisempty(p) p = 0;endp = p+1;% set output variablepo = double(p);
功能go = countGlobal%#codegen%增量全局变量globalg g = g+1;% set output variablego = double(g);

C ++コードの生成

codegenコマンドを使用して、グローバル変数の初期値を入力として指定します。

cfg = coder.config('lib'); cfg.GenCodeOnly = true; cfg.TargetLang ='C++'; cfg.CppInterfaceStyle ='Methods'; cfg.CppInterfaceClassName ='countclassmulti'; codegencountGlobalcountPersistent-configcfg-report- 全球{'g',0}
Code generation successful: To view the report, open('codegen/lib/countGlobal/html/report.mldatx')

生成されたコードの確認

生成されたクラス定義を確認するにはcountClassMulti.hを開きます。各エントリポイント関数はクラスのパブリック メソッドです。

typecodegen/lib/countglobal/countclassmulti.h

参考

関連するトピック