本页对应的英文页面已更新,但尚未翻译。 若要查看最新内容,请点击此处访问英文页面。

为 C/C++ 代码生成定义变量的最佳做法

在使用变量之前通过赋值来定义变量

对于 C/C++ 代码生成,应显式且明确地定义变量的类、大小和复/实性,然后才能在运算中使用这些变量或将它们作为输出返回。通过赋值定义变量,但请注意,赋值不仅会复制值,还会将该值表示的大小、类和复/实性复制到新变量。例如:

Assignment 定义:
a = 14.7;a 定义为双精度实数标量。
b = a;使用 a(双精度实数标量)的属性定义 b
c = zeros(5,2);c 定义为由双精度实数值构成的 5×2 数组。
d = [1 2 3 4 5; 6 7 8 9 0];d 定义为由双精度实数值构成的 5×2 数组。
y = int16(3);y 定义为 16 位整数实数标量。

以这种方式定义属性,在 C/C++ 代码生成期间便会在所需的执行路径上定义该变量。

赋给变量的数据可以是标量、矩阵或结构体。如果您的变量是结构体,请显式定义每个字段的属性。

将新变量初始化为已分配数据的值有时会导致生成的代码中出现冗余副本。要避免冗余副本,可以使用 coder.nullcopy 构造来定义变量而不初始化其值,如Eliminate Redundant Copies of Variables in Generated Code中所述。

定义变量时,它们默认为局部变量;它们不会在函数调用之间持久存在。要使变量持久存在,请参阅 persistent

例 1. 为多个执行路径定义一个变量

以如下 MATLAB® 代码为例:

...
if c > 0
  x = 11;
end
% Later in your code ...
if c > 0
  use(x);
end
...
此处,x 仅在 c > 0 时赋值,且仅在 c > 0 时使用。此代码可在 MATLAB 中正常工作,但在代码生成期间会生成编译错误,因为它检测到 x 在某些执行路径上未定义(当 c <= 0 时)。

要使此代码适合代码生成,请在使用 x 前先对其进行定义:

x = 0;
...
if c > 0
  x = 11;
end
% Later in your code ...
if c > 0
  use(x);
end
...

例 2. 定义结构体中的字段

以如下 MATLAB 代码为例:

...
if c > 0 
  s.a = 11;
  disp(s);
else
  s.a = 12;
  s.b = 12;
end
% Try to use s
use(s);
...
此处,if 语句的第一部分仅使用字段 a,else 子句使用字段 a 和 b。此代码可在 MATLAB 中正常工作,但在 C/C++ 代码生成期间会生成编译错误,因为它检测到结构体类型不匹配。为了防止此错误,请不要在对某结构体执行某些操作后向该结构体添加字段。有关详细信息,请参阅用于代码生成的结构体定义

要使此代码适合 C/C++ 代码生成,请在使用 s 之前定义其所有字段。

...
% Define all fields in structure s
s = struct(‘a’,0, ‘b’, 0);
if c > 0 
  s.a = 11;
  disp(s);
else
  s.a = 12;
  s.b = 12;
end
% Use s
use(s);
...

对变量重新赋值时务必小心

通常,对于 C/C++ 代码生成,您应该遵循“一个变量/一个类型”规则;也就是说,每个变量必须具有特定的类、大小和复/实性。通常,如果在初始赋值后对变量属性重新赋值,则在代码生成期间会出现编译错误,但也有例外,如Reassignment of Variable Properties中所述。

在变量定义中使用类型转换运算符

默认情况下,常量的类型为 double。要定义其他类型的变量,可以在变量定义中使用类型转换运算符。例如,以下代码将变量 y 定义为整数:

...
x = 15; % x is of type double by default.
y = uint8(x); % y has the value of x, but cast to uint8.
...

在对索引变量赋值之前定义矩阵

从 MATLAB 生成 C/C++ 代码时,不能通过写入超出变量当前大小的元素来扩展变量。这种索引操作会产生运行时错误。必须先定义矩阵,然后再为矩阵的元素赋值。

例如,代码生成不允许以下初始赋值:

g(3,2) = 14.6; % Not allowed for creating g
               % OK for assigning value once created

有关索引矩阵的详细信息,请参阅在代码生成的矩阵索引操作方面与 MATLAB 的不兼容性

另请参阅

|

相关主题