コード生成のためのスカラー構造体の定義
代入によりスカラー構造体を定義する際の制限事項
既存の構造体に変数を代入してスカラー構造体を定義する場合、その変数を代入の前に定義する必要はありません。ただし、既にその変数を定義してある場合は、代入する構造体と、クラス、サイズ、実数/複素数が同じでなければなりません。次の例では、p
が、事前に定義されている構造体 S
と同じプロパティをもつ構造体として定義されています。
... S = struct('a', 0, 'b', 1, 'c', 2); p = S; ...
各制御フロー パスに対して一定の順序でフィールドを追加する
構造体を作成する際は、各制御フロー パスにおいて、同じ順序でフィールドを追加しなければなりません。たとえば、次のコードでは if
ステートメントの各節で構造体 x
のフィールドを異なる順番で追加しているため、コンパイラ エラーが発生します。
function y = fcn(u) %#codegen if u > 0 x.a = 10; x.b = 20; else x.b = 30; % Generates an error (on variable x) x.a = 40; end y = x.a + x.b;
この例では、最初の if
ステートメントの節では x.a
の代入が x.b
の前にあり、else
句では代入順序が逆になっています。以下は、修正したコードです。
function y = fcn(u) %#codegen if u > 0 x.a = 10; x.b = 20; else x.a = 40; x.b = 30; end y = x.a + x.b;
最初に使用した後での新規フィールドの追加に対する制限事項
構造体に以下の操作を行った後は、その構造体に対してフィールドを追加することができません。
構造体からの読み取り
構造体配列内へのインデックス付け
構造体を関数に渡す
たとえば、以下のコードについて考えます。
... x.c = 10; % Defines structure and creates field c y = x; % Reads from structure x.d = 20; % Generates an error ...
この例では、構造体 x
から読み取りをした後に、新規フィールド d
を追加しようとしているため、エラーが発生します。
この制限事項は、構造体の階層すべてに適用されます。たとえば、この例に示されるように、ある構造体の 1 つのフィールドまたはその入れ子構造体に対して操作をした後に、その構造体にフィールドを追加することはできません。
function y = fcn(u) %#codegen x.c = 10; y = x.c; x.d = 20; % Generates an error
この例では、構造体 x
のフィールド c
から読み取りをした後に、新規フィールド d
を追加しようとしているため、エラーが発生します。