为代码生成定义标量结构体
通过赋值定义标量结构体时的限制
当通过将一个变量赋给预先存在的结构体来定义标量结构体时,不需要在赋值之前定义该变量。但是,如果您已定义该变量,它必须具有与您赋给它的结构体相同的类、大小和复/实性。在以下示例中,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
会生成错误。
这种限制适用于整个结构体层次结构。例如,在对结构体的字段或嵌套结构体之一进行操作后,无法将字段添加到该结构体中,如此示例中所示:
function y = fcn(u) %#codegen x.c = 10; y = x.c; x.d = 20; % Generates an error
在此示例中,在读取结构体 x
的字段 c
后,尝试向该结构体添加新字段 d
会生成错误。