Main Content

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

coder.cstructname

生成されたコードでの C 構造体に名前を付ける

説明

coder.cstructname は、生成されたコードで構造体として表される MATLAB® 変数に使用する生成されたまたは外部で定義された C 構造体型に名前を付けます。

coder.cstructname(var,structName) は、MATLAB 変数 var に対して生成された C 構造体型に名前を付けます。入力 var には、構造体または cell 配列を指定できます。コードを生成する関数でこの構文を使用します。var を定義した後、var を最初に使用する前に coder.cstructname を配置します。var がエントリポイント (最上位レベル) 関数入力引数の場合、関数の最初の、制御フロー ステートメントの前に coder.cstructname を配置します。

coder.cstructname(var,structName,'extern','HeaderFile',headerfile) は、var に使用する C 構造体型の名前が structName で、この型が外部ファイル headerfileName で定義されていることを指定します。

ヘッダー ファイルを指定せずに 'extern' オプションを使用できます。ただし、コード ジェネレーターで #include ステートメントが正しい位置に生成されるようにヘッダー ファイルを指定することをお勧めします。

coder.cstructname(var,structName,'extern','HeaderFile',headerfile,'Alignment',alignment) は、外部で定義された structName 構造体型に対する実行時のメモリ配置も指定します。Embedded Coder® があり、カスタムのコード置換ライブラリ (CRL) を使用している場合、コード ジェネレーターが構造体の配置を必要とする CRL 関数を一致させることができる配置を指定します。Data Alignment for Code Replacement (Embedded Coder)を参照してください。

outtype = coder.cstructname(intype,structName) は、生成する C 構造体型の名前を指定する構造体または cell 配列型のオブジェクト outtype を返します。coder.cstructname は、intype 入力型のプロパティを使用して outtype を作成します。次に、TypeName プロパティを structName に設定します。この構文を使用して、codegen -args オプションで使用する型オブジェクトを作成します。コードを生成する関数でこの構文を使用することはできません。

この構文は MATLAB Function ブロックで使用できません。

outtype = coder.cstructname(intype,structName,'extern','HeaderFile',headerfile) は、外部で定義されている C 構造体型の名前と場所を指定する型オブジェクト outtype を返します。コード ジェネレーターは、型が outtype の変数に外部で定義された構造体型を使用します。

この構文は MATLAB Function ブロックで使用できません。

outtype = coder.cstructname(intype,structName,'extern','HeaderFile',headerfile,'Alignment',alignment) は、C 構造体型の配置も指定する型オブジェクト outtype を作成します。

この構文は MATLAB Function ブロックで使用できません。

すべて折りたたむ

MATLAB 関数 myfun で、変数 v に対して生成された C 構造体型に名前 MyStruct を割り当てます。

function y = myfun()
%#codegen
v = struct('a',1,'b',2);
coder.cstructname(v, 'myStruct');
y = v;
end

スタンドアロン C コードを生成します。たとえば、スタティック ライブラリを生成します。

codegen -config:lib myfun -report

生成された構造体型を表示するには、codegen/lib/myfun/myfun_types.h を開くか、コード生成レポートの myfun_types.h を表示します。生成された C 構造体型は次のとおりです。

typedef struct {
  double a;
  double b;
} myStruct;

MATLAB 関数 myfun1 で、構造体 v の生成された C 構造体型に名前 MyStruct を割り当てます。サブ構造体 v.b に対して生成された構造体型に名前 mysubStruct を割り当てます。

function y = myfun()
%#codegen
v = struct('a',1,'b',struct('f',3));
coder.cstructname(v, 'myStruct');
coder.cstructname(v.b, 'mysubStruct');
y = v;
end

生成された C 構造体型 mysubStruct は次のとおりです。

typedef struct {
  double f;
} mysubStruct;

生成された C 構造体型 myStruct は次のとおりです。

typedef struct {
  double a;
  mysubStruct b;
} myStruct;

関数 MATLAB myfun2 で、cell 配列 c に対して生成された C 構造体型に名前 myStruct を割り当てます。

function z = myfun2()
c = {1 2 3};
coder.cstructname(c,'myStruct')
z = c;

c に対して生成された C 構造体型は次のとおりです。

typedef struct {
  double f1;
  double f2;
  double f3;
} myStruct;

C 関数に渡された構造体に C ヘッダー ファイルで定義された構造体型があることを指定します。

mycstruct 型のパラメーターを受け入れる関数 mycadd の C ヘッダー ファイル mycadd.h を作成します。ヘッダー ファイルで型 mycstruct を定義します。

#ifndef MYCADD_H
#define MYCADD_H

typedef struct {
    double f1;
    double f2;
} mycstruct;

double mycadd(mycstruct *s);
#endif

C 関数 mycadd.c を作成します。

#include <stdio.h>
#include <stdlib.h>

#include "mycadd.h"

double mycadd(mycstruct *s)
{
  return  s->f1 + s->f2;
}

mycadd への参照渡しにより構造体を渡す MATLAB 関数 mymAdd を作成します。coder.cstructname を使用して、生成されたコードで、構造体に mycadd.h で定義された C 型 mycstruct があることを指定します。

function y = mymAdd
%#codegen
s = struct('f1', 1, 'f2', 2);
coder.cstructname(s, 'mycstruct', 'extern', 'HeaderFile', 'mycadd.h');
y = 0;
y = coder.ceval('mycadd', coder.ref(s));

関数 mymAdd の C スタティック ライブラリを生成します。

codegen -config:lib mymAdd mycadd.c
mycstruct は外部の型であるため、生成されたヘッダー ファイル mymadd_types.h には構造体 mycstruct の定義が含まれていません。

エントリポイント関数 myFunction は構造体引数を取るものとします。コマンド ラインで入力引数の型を指定するには、次の手順を実行します。

  1. 例の構造体 S を定義します。

  2. coder.typeof を使用して S から T 型を作成します。

  3. coder.cstructname を使用して、次のような T1 型を作成します。

    • T のプロパティをもつ。

    • 生成された C 構造体型 myStruct に名前を付ける。

  4. -args オプションを使用して、型を codegen に渡します。

以下に例を示します。

S = struct('a',double(0),'b',single(0));
T = coder.typeof(S);
T1 = coder.cstructname(T,'myStruct');
codegen -config:lib myFunction -args T1 

または、例の構造体から直接構造体型を作成できます。

S = struct('a',double(0),'b',single(0));
T1 = coder.cstructname(S,'myStruct');
codegen -config:lib myFunction -args T1 

入力引数

すべて折りたたむ

生成されたコードで構造体として表される MATLAB 構造体または cell 配列変数。

生成されたまたは外部で定義された C 構造体型の名前。文字ベクトルまたは string スカラーとして指定します。

C 構造体型の定義を含むヘッダー ファイルの名前。文字ベクトルまたは string スカラーとして指定します。

ファイルへのパスを指定するには、次を実行します。

  • codegen -I オプションまたは MATLAB Coder™ アプリ設定 [カスタム コード] タブの [追加インクルード ディレクトリ] パラメーターを使用します。

  • MATLAB Function ブロックの場合は、[シミュレーション ターゲット] ペインおよび[コード生成][カスタム コード] ペインで、[追加のビルド情報][インクルード ディレクトリ] パラメーターを設定します。

または、'addIncludePaths' オプションを指定して coder.updateBuildInfo を使用します。

例: 'mystruct.h'

生成されたまたは外部で定義された構造体に対する実行時のメモリ配置。

型オブジェクトを作成する基になる構造体型オブジェクト、cell 配列型オブジェクト、構造体変数または cell 配列変数。

制限

  • coder.cstructname はグローバル変数に直接適用できません。グローバル変数で使用する構造体型に名前を付けるには、coder.cstructname を使用して、構造体型に名前を付ける型オブジェクトを作成します。次に、codegen を実行するときに、グローバル変数にその型があることを指定します。グローバル構造体変数と共に使用するための C 構造体型の命名 (MATLAB Coder)を参照してください。

  • cell 配列入力の場合、外部で定義された構造体のフィールド名は f1f2 などでなければなりません。

  • coder.cstructname はクラス プロパティに直接適用できません。

ヒント

  • コード ジェネレーターで構造体フィールドの C/C++ 型を判断する方法の詳細については、生成コードの型への MATLAB 型のマッピング (MATLAB Coder)を参照してください。

  • 構造体配列で coder.cstructname を使用すると、配列の名前でなく、基本要素の構造体型の名前が設定されます。したがって、coder.cstructname は構造体配列に適用できず、異なる C 構造体型の名前で配列に適用します。たとえば、次のコードは許可されません。2 番目の coder.cstructname は基本データ型の名前を myStructArrayName に設定しようとするため、これが前に指定した名前 myStructName と競合します。

    % Define scalar structure with field a 
    myStruct = struct('a', 0); 
    coder.cstructname(myStruct,'myStructName'); 
    % Define array of structure with field a 
    myStructArray = repmat(myStruct,4,6); 
    coder.cstructname(myStructArray,'myStructArrayName'); 
    

  • coder.cstructname を構造体配列の要素に適用すると、coder.cstructname を構造体配列全体に適用した場合と同じ結果になります。coder.cstructname を構造体配列の要素に適用する場合は、単一の添字を使用して要素を参照しなければなりません。たとえば、var(1) は使用できますが、var(1,1) は使用できません。coder.cstructnamevar(:) に適用すると、coder.cstructnamevar または var(n) に適用した結果と同じ結果になります。

  • 異種混合 cell 配列は生成されたコード内で構造体として表されます。ここでは、cell 配列での coder.cstructname の使用について取り上げます。

    • コードを生成する関数では、cell 配列変数で coder.cstructname を使用すると cell 配列は異種混合になります。したがって、cell 配列がエントリポイント関数入力で、その型が永続的に同種の場合、cell 配列で coder.cstructname は使用できません。

    • coder.cstructname を同種 coder.CellType オブジェクト intype で使用する場合、返されたオブジェクトは異種混合になります。したがって、coder.cstructname は永続的に同種の coder.CellType オブジェクトと一緒に使用できません。cell 配列が永続的に同種の場合の詳細については、コマンド ラインでの cell 配列入力の指定 (MATLAB Coder)を参照してください。

    • coder.CellType オブジェクトで使用すると、coder.cstructname は永続的に異種混合の coder.CellType オブジェクトを作成します。

  • 行優先および列優先の配列レイアウトのプロジェクトで coder.cstructname という名前の構造体を使用すると、特定の状況において、コード ジェネレーターはこの構造体名の先頭に row_ または col_ を追加して、構造体の名前を変更します。この名前変更により、両方の配列レイアウトで使用される型に固有の型定義が提供されます。

  • これらのヒントは MATLAB Function ブロックにのみ適用されます。

    • MATLAB Function ブロックの入力構造体と出力構造体はバス信号に関連付けられます。構造体型に対して生成された名前は、バス信号名に由来します。coder.cstructname を使用して、入力信号と出力信号の構造体型に名前を付けないでください。MATLAB Function ブロック内での構造体の作成を参照してください。

    • コード ジェネレーターは、coder.cstructname で構造体型に名前を付けた場合でも、識別子の命名規則に従って構造体型の名前を生成します。Embedded Coder がある場合は、命名規則をカスタマイズできます。生成される識別子の構成 (Embedded Coder)を参照してください。

R2011a で導入