C コード生成のパラメーターの構成
コード生成用にモデルを構成するときに、キャリブレーションなどの調整可能性のパラメーターを特定して構成できます。構成できるパラメーターのタイプを次の表に示します。
パラメーターのタイプ | 説明 |
---|---|
モデル パラメーター引数 | モデル引数として構成するモデル ワークスペース内のブロック パラメーター。モデル パラメーター引数を含むモデルの各インスタンスは一意の値に設定される引数をもつことができます。 |
モデル パラメーター | モデル ワークスペース内のパラメーターなど、モデル内で定義されたパラメーター。 |
外部パラメーター | ベース ワークスペース内またはデータ ディクショナリ内でオブジェクトとして定義されたパラメーター。 |
定数 | 定数パラメーター。 |
コード生成用にパラメーターを構成するには、そのパラメーターをデータ オブジェクトと関連付けなければなりません。たとえば、コード生成用に MATLAB 変数を構成する前に、モデル エクスプローラーでその変数をパラメーター オブジェクトに変換します。
Embedded Coder アプリでモデルを開くと、データ オブジェクトに関連付けられているモデル パラメーター、モデル パラメーター引数、および定数がコード マッピング エディターに表示されます。エディターで、コード生成用にパラメーターを構成できます。モデルが外部パラメーターを使用する場合、パラメーター名の右にある Refresh
リンクをクリックしてそれらをコード マッピング エディターに追加できます。このリンクにより、ブロック線図の更新が開始され、エディター ビューに、モデルによって使用される外部パラメーターが追加されます。
以下を実行するようにパラメーター データを構成します。
生成コードの実行中に操作するためにデータをアクセス可能にする。
メモリに格納されるデータの量を最小限に抑える。
コード ジェネレーターがパラメーター データをメモリ内に配置する場所を制御する。
パラメーター データをモデル インターフェイスにプロモートし、その他のコンポーネントおよびシステムがそのデータにアクセスできるようにする。
生成されたコードの可読性およびトレーサビリティを向上させる。
モデル全体のパラメーターが調整可能かどうかを制御するために、コード マッピング エディターの [Data Defaults] タブで 'Auto' will be tunable/inline
リンクを使用し、モデル コンフィギュレーション パラメーター [既定のパラメーター動作] にアクセスできます。たとえば、以下のような場合、このリンクを使用してパラメーターを調整可能にすることができます。
ラピッド プロトタイピング時にパラメーター設定を調整する
パラメーターをキャリブレーションする
量産コード用にパラメーターを最適化する
コード生成用に、例はモデル rtwdemo_configinterface
のモデル パラメーターおよびモデル パラメーター引数の構成方法を説明します。コード マッピング エディター – C またはコード マッピング プログラミング インターフェイス (coder.mapping.api.CodeMapping
) を使用してコード マッピングを構成できます。
パラメーターのカスタマイズ オプションの選択
既定の設定では、モデル内のパラメーターは以下の名前のグローバル データ構造体のフィールドとして生成されたコードに表示されます。
モデル パラメーターの
model
_Pモデル パラメーター引数の
model
_InstP定数パラメーターの
model
_ConstP
コード インターフェイスの要件に基づいて、パラメーター データの生成をカスタマイズするかどうかを決定します。カスタマイズを構成しない場合、コード ジェネレーターは生成されたコード内のパラメーターの表現を最適化目的で削除するか変更するかを判断します。カスタマイズを構成する場合は、以下を決定します。
既定の構成を設定するかどうか
調整可能にしなければならないカテゴリのパラメーターがモデルに多数含まれる場合 (たとえば、10 個以上)、特殊なケースについてその設定をオーバーライドするより、既定の設定を使用してそのカテゴリのパラメーターを構成する方が効率的です。一意のソース、命名規則、または配置要件をもつ指定されたカテゴリのパラメーターがモデルに少数含まれる場合は、個々のパラメーターを構成することを検討してください。
生成されたコード内でモデル パラメーター データを宣言して処理する方法
個別のグローバル変数として
外部コードで定義されたグローバル変数からモデル パラメーター データを読み取るため
アクセス関数への呼び出しとして。Embedded Coder® が必要
これらのオプションの詳細については、生成コードでのデータと関数インターフェイスの制御を参照してください。
モデル パラメーターのその他の考慮事項には、次を実行するかどうかが含まれます。
生成されたコード内のパラメーターに、モデル内のパラメーター名または一意のコード識別子を使用して名前を付ける。
コンパイラ フラグまたはオプションで定義されるプリプロセッサの条件をサポートする。Embedded Coder が必要です。バリアント モデルを使用して C のプリプロセッサ条件を使用するコードを生成するを参照してください。
グローバル変数定義と宣言に
static
型修飾子を含めて、たとえば、名前の衝突を防ぐ。Embedded Coder が必要です。Prevent Name Clashes by Configuring Data Item as staticを参照してください。グローバル変数定義と宣言に
const
、volatile
、const
およびvolatile
型修飾子を含める。Embedded Coder が必要です。型修飾子 const と volatile を使用したグローバル データの保護を参照してください。マクロ (
#define
) または外部ヘッダー ファイルに定義されたマクロを使用するコードを生成する。Embedded Coder が必要です。マクロ定義 (#define)を参照してください。指定する名前をもつグローバル データ構造体を生成する。Embedded Coder が必要です。生成されたコードにおける構造体へのデータの整理を参照してください。
特定のメモリ領域にパラメーター データを配置する。Embedded Coder が必要です。Control Data and Function Placement in Memory by Inserting Pragmasを参照してください。
対応するストレージ クラスおよびストレージ クラスのプロパティをもつパラメーターに関連するインターフェイスの要件のリストについては、Choose Storage Class and Storage Class Properties for Data Storesを参照してください。
モデル例 rtwdemo_configinterface
のパラメーターの要件は次のとおりです。
既定の設定では、調整用に生成されたコードにモデル パラメーターを保持します。パラメーターをインライン化してコードを最適化しないでください。
const
およびvolatile
型修飾子で定義および宣言された個別のグローバル変数としてモデル パラメーターを表します。接頭辞
mp_
をモデル パラメーターを表す変数の名前に適用します。定数パラメーター
UPPER
およびLOWER
がモデルの各インスタンスに対して異なる値を使用できるようにします。モデル パラメーター引数の各インスタンスに対して、既定の設定で、エクスポートされた構造体内に一意に名前が付けられたフィールドとして表されるメモリ領域を割り当てます。
モデル パラメーター引数は生成されたコード内で個々のモデル関数引数として表示されます。コード ジェネレーターで、モデル内のブロックで使用されていないモデル パラメーター引数を最適化できるようにします。
この例では、これらのコード生成要件を満たすように、rtwdemo_configinterface
でモデルパラメーターおよびモデル パラメーター引数を構成します。
パラメーターに対する既定のコード生成設定の構成
パラメーターに対する既定のコード生成設定により、生成コードの実行中に操作しなければならないパラメーターが多数あるモデルの場合は特に、コード生成用にモデルを準備する作業を軽減できます。構成設定を 1 度選択すると、コード ジェネレーターによってこれらの設定がモデル全体のパラメーターに適用されます。Simulink® は既定の構成をモデルの一部として保存します。
一意の要件をもたない同じカテゴリに対して、モデルで複数のパラメーターを使用する場合、または共有 Embedded Coder ディクショナリを使用する場合は、モデル パラメーターに対して既定のコード生成設定を構成することを検討してください。
この例では、コード マッピング エディター – C を使用して、モデル rtwdemo_configinterface
に対するモデル パラメーターおよびモデル パラメーター引数に既定の設定を構成する方法を示します。調整可能であり、生成コードで型修飾子 const
および volatile
をもつ 個別のグローバル変数として定義および宣言されるように、モデル パラメーターを構成します。既定の設定を使用するモデル パラメーター引数を構成します。この設定では、コード ジェネレーターは、引数インスタンスごとにエクスポートされた構造体内で一意に名前が付けられるフィールドとして表されるメモリ領域を割り当てます。
モデル
rtwdemo_configinterface
を開きます。書き込み可能な場所にモデルのコピーを保存します。Embedded Coder アプリを開きます。
[C コード] タブで、[コード インターフェイス] 、 [既定のコード マッピング] を選択します。
コード マッピング エディターで、[Model parameter arguments] を選択します。ストレージ クラスを
[Default]
に設定したままにします。コード ジェネレーターは引数インスタンスごとに個別のメモリ領域を割り当てます。コード マッピング エディターの [パラメーター] で、カテゴリ [Model parameters] を選択します。リンク テキスト
'Auto' will be inlined
は、コード ジェネレーターが既定の設定でモデル パラメーターをインライン化するように構成されていることを示します。この例では、モデル パラメーターが調整可能であることが要件です。'Auto' will be inlined
をクリックします。[モデル コンフィギュレーション パラメーター] ダイアログ ボックスで、モデル コンフィギュレーション パラメーター [既定のパラメーター動作] を
[調整可能]
に設定します。変更を保存し、ダイアログ ボックスを閉じます。コード マッピング エディターで、リンク テキストが'Auto' will be tunable
に変更されます。コード マッピングで、[Model parameters] カテゴリがまだ選択された状態で、ストレージ クラスを
[ConstVolatile]
に設定します。モデルを保存します。
個々のパラメーターに対するコード生成の構成
コード生成に対する個々のパラメーターを構成できます。たとえば、一意のコード生成要件がある同じカテゴリのパラメーターがモデルに 2 つある場合、これらのパラメーターを個別に構成します。または、パラメーターのカテゴリに対して既定の設定を構成する場合、特定のパラメーターに対してこれらの設定をオーバーライドできます。
モデルが以下の条件のうち少なくとも 1 つを満たす場合、パラメーターに対して個別にコード生成設定を構成することを検討してください。
一意のソース、命名規則、または配置要件をもつカテゴリが同じ複数のパラメーターを使用する。
カテゴリが同じパラメーターを少数使用する。
複数のパラメーターのカテゴリに対する既定の構成があり、いくつかの特定のパラメーターに対してオーバーライドしなければならない。
この例では、コード マッピング エディターを使用して、モデル パラメーターの既定のストレージ クラス設定をモデル rtwdemo_configinterface
内のパラメーター K1
、Table1
および Table2
に適用する方法を示します。これらのパラメーターおよびモデル パラメーター引数 LOWER
および UPPER
に対してコード識別子を構成します。コード生成識別子は、たとえば統合用に、モデル設計の変更を伴わずに指定できます。
まだ実行していない場合は、パラメーターに対する既定のコード生成設定の構成の手順を完了します。
コード マッピング エディターで、[パラメーター] タブをクリックします。[Model Parameter Arguments] を展開します。既定の設定では、各モデル パラメーターのストレージ クラスは
Auto
に設定されます。つまり、コード ジェネレーターは最適化目的で関連するコードの表現を削除または変更する可能性があります。最適化が不可能な場合、コード ジェネレーターはモデルの既定の構成を適用します。この例では、ストレージ クラスをAuto
に設定したままにします。[Model parameters] を展開します。既定では、各パラメーターのストレージ クラスは
Auto
に設定されます。ストレージ クラスをConstVolatile
に指定するモデルの既定の構成を使用します。最適化を回避し、コード ジェネレーターで既定の構成が強制的に使われるようにするには、ストレージ クラスを
[Model default]
に設定します。既定の構成をオーバーライドするには、そのパラメーターのコード生成に関する要件を満たすストレージ クラスを指定します。
コード マッピング エディターの [Model parameters] で、パラメーター
K1
、Table1
、Table2
を選択します。ストレージ クラスを[Model default: ConstVolatile]
に設定します。モデル パラメーターのコード識別子を接頭辞
mp_
を含む名前で構成します。コード マッピング エディターで、モデル パラメーターK1
を選択します。アイコンをクリックして、ストレージ クラス プロパティ [識別子] を
mp_K1
に設定します。パラメーターTable1
およびTable2
について、[Identifier] をmp_Table1
およびmp_Table2
に設定します。モデルを保存します。
コードを生成して表示します。たとえば、
rtwdemo_configinterface.c
でモデル パラメーターmp_K1
のデータ定義を見つけます。const volatile int8_T mp_K1 = 2;
ステップ エントリポイント関数内でパラメーターが使用されている場所を見つけます。
if (mode) { output = (real_T)mp_K1 * dout_Table1; } else { output = dstate_X; }
Struct
ストレージ クラスを使用してパラメーター データを構造体に整理する
この例では、Struct
ストレージ クラスを使用して、ブロック パラメーター値を生成コード内の構造体に整理する方法を示します。ストレージ クラスをモデル内の個々のデータ項目に直接適用します。
生成コード内にパラメーター データのカスタム構造体を作成する場合は、Simulink で対応する構造体を作成することを検討してください。生成されたコードにおける構造体へのデータの整理を参照してください。
モデル例の作成
このモデル例を 3 つの Constant ブロックと 3 つの Outport ブロックで作成します。モデルに ex_struct_param
という名前を付けます。
定数パラメーターの設定
モデル データ エディターを開きます。[モデル化] タブで [モデル データ エディター] をクリックします。
モデル データ エディターで、[パラメーター] タブを選択します。
モデルで上の Constant ブロックを選択します。
モデル データ エディターで、[値] 列を使用して定数値を
p1
に設定します。p1
の横にあるアクション ボタンをクリックし、[作成] を選択します。
[新規データの作成] ダイアログ ボックスで、[値] を
Simulink.Parameter(1.0)
に設定して [作成] をクリックします。Simulink は
p1
という名前のSimulink.Parameter
オブジェクトをモデル ワークスペースに追加します。p1
のプロパティ ダイアログ ボックスで、[OK] をクリックします。その他のパラメーターを設定する必要がない場合は、[コード生成] タブをクリックできます。次に、[Coder アプリでの構成] ボタンをクリックすると、Embedded Coder アプリとコード マッピング エディターが開きます。
モデル データ エディターを使用して、
p2
(値2.0
) およびp3
(値3.0
) という名前のパラメーター オブジェクトを使用してその他の定数値を設定します。
コード生成用の定数パラメーターの構成
Embedded Coder アプリを開きます。
[C コード] タブで、[コード インターフェイス] 、 [個々の要素コードのマッピング] を選択します。
コード マッピング エディターで、[パラメーター] タブをクリックします。
[Model parameters] を展開します。
パラメーター
p1
、p2
、p3
のストレージ クラスをStruct
に設定します。パラメーター
p1
を選択します。アイコンをクリックして、[StructName] プロパティを
my_struct
に設定します。パラメーターp2
およびp3
の場合、[StructName] をmy_struct
に設定します。モデルを保存します。
コードの生成と検査
コードを生成して検査します。
ファイル ex_struct_param.h
は構造体型 my_struct_type
を定義します。
/* Type definition for custom storage class: Struct */ typedef struct my_struct_tag { real_T p1; real_T p2; real_T p3; } my_struct_type;
ファイル ex_struct_param.c
はグローバル変数 my_struct
を定義します。
/* Definition for custom storage class: Struct */ my_struct_type my_struct = { /* p1 */ 1.0, /* p2 */ 2.0, /* p3 */ 3.0 };
パラメーターに対するコード生成設定のプログラムによる構成
コード生成用にパラメーターの構成を自動化するには、コード マッピングのプログラミング インターフェイスを使用します。たとえば、カスタム ブロック ライブラリまたはアプリケーション テスト環境の一部を作成する場合は、プログラミング インターフェイスを使用してデータの構成を自動化します。
この例では、モデル rtwdemo_configinterface に対するモデル パラメーターおよびモデル パラメーター引数に既定の設定を構成する方法を示します。調整可能であり、生成コードで型修飾子 const
および volatile
をもつ 個別のグローバル変数として定義および宣言されるように、モデル パラメーターを構成します。既定の設定を使用するモデル パラメーター引数を構成します。この設定では、コード ジェネレーターは、引数インスタンスごとにエクスポートされた構造体内で一意に名前が付けられるフィールドとして表されるメモリ領域を割り当てます。モデル パラメーターの既定のストレージ クラス設定をパラメーター K1
、Table1
および Table2
に適用します。これらのパラメーターのコード識別子を構成します。
モデル例を開きます。
open_system('rtwdemo_configinterface');
モデル コンフィギュレーション パラメーター [既定のパラメーター動作] を
[調整可能]
に設定します。model='rtwdemo_configinterface';
set_param(model,'DefaultParameterBehavior','Tunable');
関数
coder.mapping.api.get
を呼び出してオブジェクトcm
を作成します。オブジェクトはデータ要素および関数に対するコード生成の構成をモデルrtwdemo_configdefaults
に保存します。cm = coder.mapping.api.get('rtwdemo_configinterface');
関数
setDataDefault
を呼び出してモデル パラメーターの既定の設定を構成します。引数には、次の値を指定します。coder.mapping.api.get
で返されるオブジェクト既定のカテゴリの
ModelParameters
プロパティ値
ConstVolatile
をもつプロパティ名StorageClass
setDataDefault(cm,'ModelParameters','StorageClass','ConstVolatile');
モデル パラメーター引数に対する既定の設定を構成します。
setDataDefault
への呼び出しで、以下の値を指定します。coder.mapping.api.get
で返されるオブジェクト。既定のカテゴリの
ModelParameterArguments
。プロパティ値
Default
をもつプロパティ名StorageClass
。
setDataDefault(cm,'ModelParameterArguments','StorageClass','Default');
モデル パラメーターおよびモデル パラメーター引数の既定の構成を確認します。
coder.mapping.api.get
で返されるオブジェクト、カテゴリModelParameters
またはModelParameterArguments
、およびStorageClass
を指定するgetDataDefault
への呼び出しを発行します。getDataDefault(cm, 'ModelParameters', 'StorageClass') ans = 'ConstVolatile'
getDataDefault(cm, 'ModelParameterArguments', 'StorageClass') ans = 'Default'
モデル パラメーターの既定の構成をパラメーター
K1
、Table1
およびTable2
に適用します。既定の設定では、Simulink は個々のパラメーターのストレージ クラスを
Auto
に設定します。ストレージ クラスがAuto
の場合、コード ジェネレーターは次を行います。最適化目的で生成されたコードからデータを削除するかどうかを決定する。
データを保持する場合、既定の構成設定を考慮して、生成されたコード内でデータを効率的に表す方法を決定する。
コード ジェネレーターを構成して、既定のモデル パラメーター設定をパラメーター
K1
、Table1
、およびTable2
に適用します。パラメーターごとに関数setModelParameter
を呼び出します。coder.mapping.api.get
から返されるオブジェクト、パラメーター名、プロパティ名StorageClass
、およびプロパティ値Model default
を指定します。setModelParameter(cm,'K1','StorageClass','Model default'); setModelParameter(cm,'Table1','StorageClass','Model default'); setModelParameter(cm,'Table2','StorageClass','Model default');
関数
getModelParameter
への呼び出しを使用して、パラメーターK1
、Table1
およびTable2
の構成の変更を確認します。getModelParameter(cm,'K1','StorageClass') ans = 'Model default' getModelParameter(cm,'Table1','StorageClass') ans = 'Model default' getModelParameter(cm,'Table2','StorageClass') ans = 'Model default'
モデル パラメーターのコード識別子を構成します。パラメーターごとに関数
setModelParameter
を呼び出します。coder.mapping.api.get
から返されるオブジェクト、パラメーター名、プロパティ名Identifier
、および次のいずれかのプロパティ値を指定します。モデル パラメーター コード識別子 K1
mp_K1
Table1
mp_Table1
Table2
mp_Table2
setModelParameter(cm,'K1','Identifier','mp_K1'); setModelParameter(cm,'Table1','Identifier','mp_Table1'); setModelParameter(cm,'Table2','Identifier','mp_Table2');
関数
getModelParameter
への呼び出しを使用して、モデル パラメーターの構成の変更を確認します。getModelParameter(cm,'K1','Identifier') ans = 'mp_K1' getModelParameter(cm,'Table1','Identifier') ans = 'mp_Table1' getModelParameter(cm, 'Table2', 'Identifier') ans = 'mp_Table2'
モデルを保存します。
コードを生成して表示します。たとえば、
rtwdemo_configinterface.c
でモデル パラメーターmp_K1
のデータ定義を見つけます。const volatile int8_T mp_K1 = 2;
ステップ エントリポイント関数内でパラメーターが使用されている場所を見つけます。
if (mode) { output = (real_T)mp_K1 * dout_Table1; } else { output = dstate_X; }
モデル パラメーターに対するストレージ クラスおよびストレージ クラスのプロパティの選択
コード生成の要件に応じて、モデル パラメーターに対してコード生成を構成するストレージ クラスを以下より選択します。定数の場合、[Default]
のみが適用されます。モデル パラメーター引数の場合、[Auto]
、[Default]
、および [Model default]
のみが適用されます。
要件 | ストレージ クラス |
---|---|
より効率的なコードを生成するように、最適化を有効にします。 | Auto (個別のマッピングのみ) |
最適化できないデータ要素の場合、データを標準のデータ構造体のフィールドとして表します。 | 既定値 (既定のマッピングのみ) |
最適化によってデータ要素のストレージが削除されるのを防ぎ、データ要素のカテゴリに対して既定のマッピングを使用します。 | Model Default (個別のマッピングのみ)、Dictionary Default (個別のマッピングのみ) |
boolean データを名前付きビット フィールドに保存する構造体を生成します。 | ビットフィールド (個別のマッピングのみ) |
コンパイラ フラグまたはオプションを使用して定義されるプリプロセッサの条件をサポートします。 | CompilerFlag |
const 、volatile 、または const および volatile 型修飾子をもつグローバル変数の定義と宣言を生成します。 | Const、Volatile、および ConstVolatile |
マクロ (#define 命令) または外部コードのヘッダー ファイルで定義されるマクロを使用するコードを使用するコードを生成します。 | Define、ImportedDefine |
グローバル変数の定義と宣言を生成します。 | ExportedGlobal |
グローバル変数の定義と宣言を指定したファイルに生成します。 | ExportToFile |
static 型修飾子をもつグローバル変数の定義と宣言を生成します。 | FileScope (ローカルおよび共有ローカル データ ストア マッピングのみ) |
カスタムのアクセサー関数を呼び出して、データを処理するコードを生成します。 | GetSet |
外部コードで定義されたグローバル変数またはグローバル変数のポインターに対して読み取りと書き込みを実行するコードを生成します。 | ImportedExtern、ImportedExternPointer |
外部ヘッダー ファイルで定義されたグローバル変数に対して読み取りと書き込みを実行するコードを生成します。 | ImportFromFile |
指定可能な名前をもつグローバル構造体を生成します。 | struct (個別のマッピングのみ) |
使用可能なストレージ クラスのリストには、Embedded Coder ディクショナリで定義された他のプロジェクト固有のストレージ クラスが含まれている可能性があります。リストされているストレージ クラスでは満たされない特別な要件がある場合、Embedded Coder ソフトウェアをお持ちであれば、ストレージ クラスを定義できます。Define Service Interfaces, Storage Classes, Memory Sections, and Function Templates for Software Architectureを参照してください。
個々のモデル パラメーターに対して、[Identifier] ストレージ クラス プロパティを使用して生成されたコード内のパラメーターを表す変数の名前を構成します。Embedded Coder を使用して、選択するストレージ クラスに応じて以下のプロパティを構成することもできます。
プロパティ | 説明 | ストレージ クラス |
---|---|---|
DefinitionFile | パラメーターおよび外部コードで読み取られるグローバル データの定義を含むソース定義ファイル | ExportToFile および Volatile |
GetFunction | パラメーターは指定した関数 get への呼び出しとして生成されたコードに表示されます。 | GetSet |
HeaderFile | パラメーターおよび外部コードで読み取られるグローバル データの宣言を含むソース ヘッダー ファイル | ExportToFile 、GetSet 、ImportFromFile 、および Volatile |
Memory Section (既定のパラメーター コンフィギュレーションのみ) | パラメーターで読み取られるデータを含むメモリ セクション | Default |
Owner | コード ジェネレーターは、定義を共有するモデルの階層構造内の複数のモデルのいずれか 1 つに生成されたコード内にパラメーターの定義を配置します。モデル コンフィギュレーション パラメーター [データ定義の配置にデータ オブジェクトからオーナーを使用する] を選択しなければなりません。Control Placement of Global Data Definitions and Declarations in Generated Filesを参照してください。 | ExportToFile および Volatile |
PreserveDimensions | コード ジェネレーターは生成されたコードで多次元配列として表されるパラメーター データの次元を保持します。モデル コンフィギュレーション パラメーター [配列のレイアウト] を [行優先] に設定しなければなりません。Preserve Dimensions of Multidimensional Arrays in Generated Codeを参照してください。 | ExportToFile 、FileScope 、GetSet 、ImportFromFile 、Localizable 、および Volatile |
SetFunction | パラメーターは指定した関数 set への呼び出しとして生成されたコードに表示されます。 | GetSet |
StructName | パラメーター用に生成されたコード内の構造体の名前。 | BitField および Struct |
参考
コード マッピング エディター – C | coder.mapping.api.CodeMapping