クラス インターフェイスをもつ 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
fooBig
448^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