Main Content

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

コード生成のためのスカラー構造体の定義

代入によりスカラー構造体を定義する際の制限事項

既存の構造体に変数を代入してスカラー構造体を定義する場合、その変数を代入の前に定義する必要はありません。ただし、既にその変数を定義してある場合は、代入する構造体と、クラス、サイズ、実数/複素数が同じでなければなりません。次の例では、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 を追加しようとしているため、エラーが発生します。