主要内容

このペ,ジの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。

生成されたコ,ドにおける構造体へのデ,タの整理

Cコ,ドでは,構造体(结构体)を使用してデ,タをメモリの連続した位置に格納します。信号や状態などのデ,タを意味のある名前を使用して整理できます。各構造体は名前空間として機能するため,複数のデ,タ項目を指定するために名前を再利用できます。配列と同様に,構造体を利用すれば,ポインターの使用によって効率的に大量のデータを転送,操作するコードを記述できます。

既定では,コ,ドジェネレ,タ,はデ,タを標準の構造体に集約します(生成されたコ,ドによる内部信号,状態,パラメ,タ,デ,タの保存方法を参照)。これらの構造体の特性を制御したり,異なる構造体を作成してこの既定の動作を上書きしたりする場合は,次の表の情報を使用してください。

目的 手法

標準のデ,タ構造体の特性を制御する。たとえば,構造体型の名前、構造体変数、フィールド名を指定します。

嵌入式编码器®を使用する場合,在生成的代码中控制数据类型名称(嵌入式编码)を参照してください。

たとえば,プラグマまたはその他のコ,ド装飾を挿入して,メモリ内の構造体の配置を制御する。

嵌入式编码器を使用する場合,通过插入Pragmas控制数据和函数在内存中的位置(嵌入式编码)を参照してください。

名前および他の基本特性が制御可能な構造体にデ,タを集約する。ブロックおよび信号をモデルに追加すると、結果の新しいデータがこれらの構造体に既定で表示される。

嵌入式编码器を使用する場合,コードマッピングエディターを使用して,構造化されたストレージクラスをデータのカテゴリに適用します。

  • モデルコンフィギュレ,ションパラメ,タ,の[コドンタフェスのパッケジ化][再利用できない関数]に設定して再利用できない単一ンスタンスのコドを生成する場合,組み込みストレジクラス结构体を適用して,フラットなグロ,バル構造体変数を作成します。または、クジクラスの例ParamStructSignalStructを使用するか,独自の構造化されたストレ,ジクラスを適用します。

  • たとえば,[コドンタフェスのパッケジ化][再利用できない関数]以外の値に設定して,モデルまたはコンポーネントからマルチインスタンス(再呼び出し可能な)コードを生成する場合,コードマッピングエディターでは,組み込みストレージクラス结构体またはパッケ,ジで作成する構造化されたストレ,ジクラスを使用することはできません。代わりに、嵌入式编码器ディクショナリを使用して独自の構造化されたストレージクラスを作成します。嵌入式编码器クイックスタートツールを使用してコード生成用のモデルを準備する場合(クドの生成(嵌入式编码)を参照),ストレ,ジクラスの例ParamStructSignalStructを使用できます。

  • この手法を使用してグローバルデータストアまたはグローバルパラメーターを集約することはできません(ベースワークスペースまたはデータディクショナリに保存するパラメーターオブジェクトも含む)。これらの種類のデタにいては,他の手法を使用して構造体を作成してください。

コドマッピングエディタの詳細にいては,为数据元素和函数类别配置默认的C代码生成(嵌入式编码)を参照してください。独自のストレ,ジクラスを作成するには,为软件架构定义存储类、内存段和功能模板(嵌入式编码)を参照してください。

細かく制御できる特性をもつカスタム構造体に個々のデータ項目を整理して,生成されたコードの可読性を向上する。

必要な構造体型を表す金宝app仿真软件。公共汽车オブジェクトを作成します。バスオブジェクトを使用して,非バーチャルバス信号のデータ型およびパラメーター構造体をモデルで設定します。

構造体の配列を作成するには,構造体の配列を参照してください。

生成されたコードと外部コード間で構造化されたデータを交換する(たとえば,外部コードで既にカスタム構造体型と対応するグローバル変数を定義している場合など)。

必要な構造体型を表す金宝app仿真软件。公共汽车オブジェクトを作成します。外部コ,ドで既に型を定義している場合,関数金宝appSimulink.importExternalCTypesを使用してバスオブジェクトを生成します。バスオブジェクトを使用して,非バーチャルバス信号のデータ型およびパラメーター構造体をモデルで設定します。例にいては,在生成的代码和外部代码之间交换结构化和枚举数据(嵌入式编码)を参照してください。

生成された関数の引数(仮パラメ,タ,)の数を減らす。

  • 模型_stepなど,コ,ドを生成するモデルのエントリポ,構造体を使用した引数の数の削減を参照してください。

  • 参照モデルのエントリポesc escント関数に対する引数の数を減らす場合は,参照モデルで次のようにします。

    • 構造体フィ,ルドとしてコ,ドに表示されるようにル,トレベルの轮廓尺寸ブロックと外港ブロックを設定します。これらの複数のブロックを,非バ,チャルバス信号として設定する単一のブロックで置き換えます。この手法では,構造体の特性を最大限に制御できます。モデルにブロックを追加する場合,バス定義を手動で変更しなければなりません。非バ,チャルバスとパラメ,タ,構造体を参照してください。

    • モデル引数をカスタム構造体に整理します(再利用可能な参照モデルへのンスタンス固有パラメタ値の指定を参照)。

  • 再呼び出し可能なマスクサブシステムのエントリポイント関数の引数の数を減らすには,マスクパラメーターをカスタム構造体に集約します。

ルックアップテ,ブルデ,タを構造体に整理する。

金宝app仿真软件。LookupTableオブジェクトと金宝app仿真软件。断点オブジェクトを使用します。金宝app仿真软件。LookupTableを参照してください。
ビットフィ,ルドを生成する。 (嵌入式编码)および通过将布尔数据打包到位字段中优化生成的代码(嵌入式编码)を参照してください。

構造体を作成する手法

生成されたコ,ドで構造体を作成するには,次の手法を使用します。

  • コードマッピングエディターを使用して,構造化されたストレージクラスをデータのカテゴリに適用します。ブロックと信号をモデルに追加すると,既定の設定で新しいデータ要素がこのストレージクラスを取得します。

  • モデルデ,タエディタ,を使用して,組み込みストレ,ジクラス结构体などの構造化されたストレ,ジクラスを個々のデ,タ項目に直接適用します。

  • カスタム非バ,チャルバスおよびパラメ,タ,構造体を作成します。

使用する手法を決定するには,次の表の情報を使用してください。

機能 構造化されたストレ,ジクラスの既定の適用 構造化されたストレ,ジクラスの直接適用 非バ,チャルバスとパラメ,タ,構造体
既定の設定で新しいデ,タ項目を構造体に集約

あり

なし なし
最適化でタ、ゲットデ、タの削除を回避(生成されたコ、ドにデ、タが表示されるように指定)

なし

あり ExportedGlobalなどのストレ,ジクラスをバスまたは構造体に直接適用する場合のみ
ブロック線図の外観を変更せずにデ,タを構造体に集約

あり

あり なし
信号,状態,パラメ,タ,デ,タを同じ構造体に配置 なし あり なし
構造体に状態のデ,タを含める あり あり なし
入れ子にされた構造体に構造体を整理 なし なし あり
構造体の配列に構造体を整理 なし なし あり
構造体型の名前を制御

あり

あり。ただし,型名は指定した変数名から派生する あり
生成された関数で引数の数を減らす構造体を作成

あり。ただし、嵌入式编码器ディクショナリを使用して独自のストレージクラスを作成しなければならない

なし あり
嵌入式编码器が必要 あり あり なし

構造化されたストレ,ジクラスの既定の適用

既定のストレ,ジクラスをモデルデ,タのカテゴリに適用できます。モデルにブロックおよび信号を適用すると,関連付けられたデータは指定する既定のストレージクラスを取得します。既定の設定で新しいデ,タを構造体に集約するには,構造化されたストレ,ジクラスを適用します。クジクラスの例ParamStructSignalStructを使用するか、嵌入式编码器ディクショナリを使用して独自のストレージクラスを作成しなければなりません。

既定の適用を使用してグローバルデータストアまたはグローバルパラメーター(ベースワークスペースまたはデータディクショナリに保存するパラメーターオブジェクト)を集約することはできません。

既定のストレ,ジクラスを適用にするには,コ,ドマッピングエディタ,を使用します。モデルウィンドウのアプリギャラリ,で,(嵌入式编码)をクリックします。次に,[コ,ドマッピング](数据默认值)で,(存储类)列を使用してストレ,ジクラスを適用します。

コドマッピングエディタの詳細にいては,为数据元素和函数类别配置默认的C代码生成(嵌入式编码)を参照してください。嵌入式编码器ディクショナリを使用して独自のストレ,ジクラスを作成する場合は,创建代码定义以在代码映射编辑器中使用(嵌入式编码)を参照してください。

構造化されたストレ,ジクラスの直接適用

構造化されたストレ,ジクラスを個々のデ,タ項目に適用できます。直接適用では,[既定のパラメ,タ,動作][信号ストレ,ジの再利用]などのコ,ド生成最適化によって生成されたコ,ドから各デ,タ項目が削除されなくなります。また,直接適用では,[コ,ドマッピング](数据默认值)で指定する既定のストレ,ジクラスを上書きします。

ストレ,ジクラスを直接適用するには,モデルデ,タエディタ,([モデル化]タブで[モデルデ,タエディタ,]をクリック)を使用します。[ビュ,の変更][コ,ド]に設定し,(存储类)列を使用してストレ,ジクラスを適用します。

结构体の使用方法を示す例にいては,Cコ,ド生成のパラメ,タ,の構成(嵌入式编码)を参照してください。ストレジクラスの適用の詳細にいては,Structストレ,ジクラスを使用してパラメ,タ,デ,タを構造体に整理する(嵌入式编码)を参照してください。

非バ,チャルバスとパラメ,タ,構造体

  • 非バ,チャルバス信号を作成するには,总线的创造者ブロックを使用して複数の信号線を単一のバスに整理するか,轮廓尺寸ブロックまたは外港ブロックを非バ,チャルバスとして設定します。構造体型を表す金宝app仿真软件。公共汽车オブジェクトを作成しなければなりません。例にいては,信号の構造体を参照してください。非バチャルバスの一般情報にいては,バ,チャルバスへの信号線のグル,プ化を参照してください。

  • パラメ,タ,構造体を作成するには,matlab®コマンドまたは変数エディターを使用して複数のブロックパラメーター値をMATLAB構造体に整理します。オプションで,金宝app仿真软件。公共汽车オブジェクトを作成して構造体型の名前および各フィールドのデータ型と次元などの他の特性を制御できるようにします。例にいては,パラメ,タ,の構造体を参照してください。パラメタ構造体の一般情報にいては,関連するブロックパラメ,タ,定義を構造体に整理を参照してください。

パラメ,タ,の構造体

生成されたコ,ドで構造体を作成します。構造体は、パラメーター データを格納します。

Cコンストラクタ

typedef struct{双G1;双G2;} myStructType;myStructType myStruct = {2.0, -2.0};

手順

1.モデル例rtwdemo_paraminlineを開きます。

2.[モデル化]タブで[モデルデ,タエディタ,]をクリックします。モデルデ,タエディタ,で,[パラメ,タ,]タブを選択します。

3.モデルで,G1というラベルの付いた增益ブロックをクリックします。モデルデ,タエディタ,で,[値]列を使用して,[ゲ电子邮箱ン]パラメ,タ,の値をmyStruct。G1に設定します。

4.G2ブロックの[ゲ电子邮箱ン]パラメ,タ,の値をmyStruct。G2に設定します。

5.myStruct。G2の横にあるアクションボタン(3の縦向きのドット)をクリックし,[作成]を選択します。

6.[新規デ,タの作成]ダ,[値]金宝appSimulink.Parameter(结构)に設定して[作成]をクリックします。myStructという名前の金宝app仿真软件。参数オブジェクトがベ,スワ,クスペ,スに表示されます。

7.金宝app仿真软件。参数プロパティのダイアログ ボックスで、[値]プロパティの横にあるアクションボタンをクリックし,[変数エディタ,を開く]を選択します。

8.[フィ,ルド]列の下にある空白を右クリックして[新規作成]を選択します。新しい構造体フィ,ルドにG1という名前を付けます。[値]列を使用して,そのフィ,ルドの値を2に設定します。

9.フィ,ルドG2を追加してから(フィ,ルドの値は-2),変数エディタ,を閉じます。

10.金宝app仿真软件。参数プロパティのダイアログ ボックスの[コ,ド生成]タブで,[ストレ,ジクラス]ExportedGlobalに設定します。構造体myStructはグロ,バル変数として生成されたコ,ドに表示されます。

11.モデルからコドを生成します。

結果

生成されたヘッダファルrtwdemo_paraminline_types.hは,ランダムな名前の構造体型を定義します。

typedef struct {real_T G1;real_T G2;} struct_6h72eH5WFuEIyQr5YrdGuB;

ソスファルrtwdemo_paraminline.cは,構造体変数myStructを定義および初期化します。

/*导出块参数*/ struct_6h72eH5WFuEIyQr5YrdGuB myStruct = {2.0, -2.0};/*变量:myStruct *引用对象:* '/G1' * '/G2' */

構造体型の名前の指定

1.オプションで、構造体型定義(结构体)を使用するために名前を指定します。コマンドプロンプトで,関数金宝appSimulink.Bus.createObjectを使用して構造体型を表す金宝app仿真软件。公共汽车オブジェクトを作成します。

2.オブジェクトの既定の名前はslBus1です。オブジェクトを新しいmatlab変数にコピ,して名前を変更します。

3.モデルデ,タエディタ,で[追加情報を表示/更新します]ボタンをクリックします。

4.デ,タテ,ブルでmyStructに対応する行を見けます。[デ,タ型]列を使用して,myStructのデ,タ型を总线:myStructTypeに設定します。

5.モデルからコ,ドを生成します。

コ,ドは構造体型myStructTypeの定義を生成し,この型を使用してグロ,バル変数myStructを定義します。

myStructType myStruct = {2.0, -2.0};/*变量:myStruct

信号の構造体

この例では,生成されたコ,ドで信号デ,タの構造体を作成する方法を示します。

Cコンストラクタ

Typedef结构{双信号1;双signal2;双signal3;} my_signals_type;

手順

モデルで構造体型を表すには,金宝app仿真软件。公共汽车オブジェクトを作成します。このオブジェクトをモデル内のバス信号のデ,タ型として使用します。

1.ex_signal_structモデルを获得ブロック,总线创造者ブロック,单位延迟ブロックを使用して作成します。获得ブロックと单位延迟ブロックによって,生成されたコードで構造体がより識別しやすくなります。

2.3つの入力を受け入れるように总线创造者ブロックを設定するには,ブロックダイアロブボックスで[入力数]3.に設定します。

3.ルストリップの[モデル化]タブの[設計]で,[バスエディタ]をクリックします。

4.バスエディタ,で,[ファ电子邮箱ル][巴士を追加]をクリックして金宝app仿真软件。公共汽车オブジェクトを作成し,my_signals_typeと名前を付けます。[ファ电子邮箱ル][BusElementを追加/挿入]をクリックして3の信号要素signal1signal2,およびsignal3を作成します。詳細にいては,金宝app仿真软件。公共汽车オブジェクトの作成と指定を参照してください。

5.バスオブジェクトを現在のフォルダ,にex_signal_struct_data.matとして保存します。

このバスオブジェクトは,生成されたコ,ドで使用する構造体型を表します。

6.总线创建者ブロックのダepアログボックスで,[出力デ,タ型]总线:my_signals_typeに設定します。

7.[非バ,チャルバスとして出力]を選択します。(好的)をクリックします。非バ,チャルバスが生成されたコ,ドに構造体として表示されます。

8.金宝app仿真软件编码器アプリを開きます。[cコ,ド]タブで,[コ,ド,ンタ,フェ,ス][個々の要素コ,ドのマッピング]を選択します。

9.[信号/状態]タブを開きます。モデルで总线创建者ブロックの出力信号を選択し,コ,ドマッピングエディタ,で[選択した信号をコ,ドマッピングに追加]ボタンをクリックします。

11.追加された信号にいて[ストレ,ジクラス]ExportedGlobalに設定します。

12.プロパティ▪▪ンスペクタ▪▪で[コ,ド](标识符)プロパティをsig_struct_varに設定します。公共汽车Creator ブロックの出力は生成されたコードにsig_struct_varという名前の個別のグロ,バル構造体変数として表示されます。

13.モデルからコドを生成します。

結果

生成されたヘッダファルex_signal_struct_types.hは構造体型my_signals_typeを定義します。

typedef struct {real_T signal1;real_T signal2;real_T signal3;} my_signals_type;

ソスファルex_signal_struct.cは,总线创建器ブロックの出力を表すグロ,バル変数sig_struct_varにメモリを割り当てます。

/*输出块信号*/ my_signals_type sig_struct_var;/* '<根>/总线创建器' */

同じファ@ @ル内のモデルの関数一步で,アルゴリズムはsig_struct_varsig_struct_varのフィ,ルドにアクセスします。

信号の入れ子にされた構造体

生成されたコ,ドで信号デ,タの入れ子にされた構造体を作成できます。

Cコンストラクタ

Typedef结构{双信号1;双signal2;双signal3;} B_struct_type;Typedef结构{双信号1;双signal2;} C_struct_type;typedef struct {B_struct_type subStruct_B;C_struct_type subStruct_C;} A_struct_type;

手順

モデルで構造体型を表すには,金宝app仿真软件。公共汽车オブジェクトを作成します。このオブジェクトをモデル内のバス信号のデ,タ型として使用します。

別の構造体内に構造体を入れ子にするには,別のバスオブジェクト内でバスオブジェクトを信号要素のデータ型として使用します。

1.ex_signal_nested_structモデルを获得ブロック,总线创造者ブロック,单位延迟ブロックで作成します。获得ブロックと单位延迟ブロックによって,生成されたコードで構造体がより識別しやすくなります。

2.3つの入力を受け入れるように总线创造者ブロックを設定するには,ブロックダイアロブボックスで[入力数]3.に設定します。

3.ルストリップの[モデル化]タブの[設計]で,[バスエディタ]をクリックします。

バスエディタ,で,[ファ电子邮箱ル][巴士を追加]をクリックして金宝app仿真软件。公共汽车オブジェクトを作成し,A_struct_typeと名前を付けます。[ファ电子邮箱ル][BusElementを追加/挿入]をクリックして2の信号要素subStruct_BおよびsubStruct_Cを追加します。詳細にいては,金宝app仿真软件。公共汽车オブジェクトの作成と指定を参照してください。このバスオブジェクトは,生成されたコ,ドで使用する最上位構造体型を表します。

4.同様に,金宝app仿真软件。公共汽车オブジェクトB_struct_type(3)C_struct_type(2)。

5.A_struct_typeオブジェクトで,subStruct_B要素にいて,[デ,タ型]总线:B_struct_typeに,subStruct_C总线:C_struct_typeに設定します。

A_struct_typeの各信号要素は別のバスオブジェクトをデ,タ型として使用します。ここで,これらの要素はサブ構造体を表します。

6.3の增益信号を収集する总线创建器ブロックのダアログボックスで,[出力デ,タ型]总线:B_struct_typeに設定します。[適用]をクリックします。

7.[非バ,チャルバスとして出力]を選択し,(好的)をクリックします。

8.他の下位の总线创建器ブロックダescアログボックスで,[出力デ,タ型]总线:C_struct_typeに設定し,[非バ,チャルバスとして出力]を選択します。(好的)をクリックします。

9.最後の总线创建器ブロックダescアログボックスで,[出力デ,タ型]总线:A_struct_typeに設定し,[非バ,チャルバスとして出力]を選択します。(好的)をクリックします。

10.金宝app仿真软件编码器アプリを開きます。[cコ,ド]タブで,[コ,ド,ンタ,フェ,ス][個々の要素コ,ドのマッピング]を選択します。

11.[信号/状態]タブを開きます。モデルで,Unit Delay ブロックに接続するA_struct_type总线创建者ブロックの出力信号を選択します。コ,ドマッピングエディタ,で,[選択した信号をコ,ドマッピングに追加]ボタンをクリックします。

12.追加された信号にいて[ストレ,ジクラス]ExportedGlobalに設定します。

13.プロパティ▪▪ンスペクタ▪▪で[コ,ド](标识符)プロパティをsig_struct_varに設定します。公共汽车Creator ブロックの出力は生成されたコードにsig_struct_varという名前の個別のグロ,バル構造体変数として表示されます。

14.モデルからコドを生成します。

結果

生成されたヘッダファルex_signal_nested_struct_types.hは構造体型を定義します。各構造体型は金宝app仿真软件。公共汽车オブジェクトに対応します。

typedef struct {real_T signal1;real_T signal2;real_T signal3;} B_struct_type;typedef struct {real_T signal1;real_T signal2;} C_struct_type;typedef struct {B_struct_type subStruct_B;C_struct_type subStruct_C;} A_struct_type;

生成されたソスファルex_signal_nested_struct.cはグロ,バル構造体変数sig_struct_varにメモリを割り当てます。既定では,A_struct_type总线创建者ブロックの名前は总线Creator2です。

/*输出块信号*/ A_struct_type sig_struct_var;/* '<根>/Bus Creator2' */

同じファ@ @ル内のモデルの関数一步で,アルゴリズムはsig_struct_varsig_struct_varのフィ,ルドにアクセスします。

制限を回避する手法の組み合わせ

各手法の制限を回避するために,構造化されたストレージクラスを非バーチャルバスおよびパラメーター構造体と組み合わせることができます。たとえば,次のようなことができます。

  • 信号デ,タの構造体とパラメ,タ,デ,タの構造体を同じ親構造体に含める。

  • 既定の設定で新しいデ,タの集約し,さらに構造体を入れ子にする。

生成されたコードでは,構造化されたストレージクラスに対応するフラットな親構造体に,各バスとパラメーター構造体に対応するサブ構造体が含まれています。次のいずれかの手法の組み合わせを選択します。

  • 構造化されたストレ,ジクラスを各バスとパラメ,タ,構造体に直接適用します。たとえば2つの非バーチャルバス信号のストレージクラスを结构体に設定します。各バスは生成されたコ,ドで単一の構造体のフィ,ルド(サブ構造体)として表示されます。

  • 各バスとパラメ,タ,構造体のストレ,ジクラスを既定の設定(汽车)または(默认模式)のままにし,コ,ド生成最適化によってバスまたはパラメ,タ,構造体が削除されないようにします。次に,信号データとパラメーター データが構造化されたストレージ クラスを既定で使用するように、既定のストレージ クラスを設定します。

構造体の配列

複数の一貫性のあるバス信号またはパラメ,タ,構造体を配列にさらにパッケ,ジ化できます。バス配列またはパラメ,タ,構造体は構造体の配列として生成されたコ,ドに表示されます。バス配列を作成するには,非バ,チャルバスのバス配列へのグル,プ化を参照してください。パラメ,タ,構造体の配列を作成する場合は,複数のパラメ,タ,構造体を配列にグル,プ化を参照してください。

構造体のパディング

既定では,コードジェネレーターは構造体型にパディングフィールドを明示的に追加することはありません。構造体型は,たとえば,標準のデ,タ構造体(生成代码中的数据结构を参照),金宝app仿真软件。公共汽车オブジェクトおよびモデルで使用するパラメーター構造体を介して生成されたコードに表示されることがあります。

ただし、嵌入式编码器でコード置換ライブラリを使用する場合,データ配置(構造体のパディングを含む)を置換ライブラリの一部として指定できます。詳細にいては,为编译器提供数据对齐规范(嵌入式编码)を参照してください。

制限

  • 組み込みの金宝app®编码器™機能と嵌入式编码器機能では,値がポインターのフィールドが含まれるカスタム構造体を生成または使用することはできません。これは,高度なストレージクラスを作成し,付随するTLCコードを書き込むことによって手動で行うことができます(ストレジクラスのTLCコドの記述によるデタ表現の詳細な制御(嵌入式编码)を参照)。

  • 組み込みストレ,ジクラス结构体またはカスタムストレージクラスデザイナーで作成する構造化されたストレージクラスを使用して(ストレージクラスプロパティ[種類](FlatStructure)に設定),コ,ドマッピングエディタ,でデ,タの既定を設定することはできません。

参考

関連するトピック