主要内容

结构体和数组中常量的代码生成

R2026b

在以下情况下,代码生成器不能识别常量结构体字段或数组元素:

在以下代码中,代码生成器将结构体字段 s.as.b 识别为常量。

function y = mystruct()
s.a = 3;
s.b = 5;
y = zeros(s.a,s.b);

如果在控制构造中对任一结构体字段赋值,则代码生成器不会识别常量字段。此限制也适用于包含常量元素的数组。以如下代码为例:

function y = mystruct(x)
s.a = 3;
if x > 1
    s.b = 4;
else
    s.b = 5;
end
y = zeros(s.a,s.b);

代码生成器不会将 s.as.b 识别为常量。如果启用可变大小,则 y 被视为可变大小数组。如果禁用可变大小,则代码生成器将报告错误。

在以下代码中,代码生成器将 a(1) 识别为常量。

function y = myarray()
a = zeros(1,3);
a(1) = 20;
y = coder.const(a(1));

在以下代码中,由于 a(1) 是使用非标量索引赋值的,因此代码生成器不会将 a(1) 识别为常量。

function y = myarray()
a = zeros(1,3);
a(1:2) = 20;
y = coder.const(a(1));

对于既包含常量字段又包含非常量字段的输出结构体,代码生成器不会识别常量字段。此限制也适用于同时包含常量和非常量元素的数组。以如下代码为例:

function y = mystruct_out(x)
s = create_structure(x);
y = coder.const(s.a);

function s = create_structure(x)
s.a = 10;
s.b = x;

由于 create_structure 返回的结构体 s 包含一个常量字段和一个非常量字段,因此代码生成器不将 s.a 识别为常量。coder.const 调用失败,因为 s.a 不是常量。