主要内容

为C/ c++代码生成定义变量的最佳实践

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

对于C/ c++代码生成,您应该明确地定义变量的类、大小和复杂性,然后再在操作中使用它们或将它们作为输出返回。通过赋值来定义变量,但是请注意,赋值不仅将值复制到新变量中,还将该值表示的大小、类和复杂性复制到新变量中。例如:

任务: 定义:
一个= 14.7; 一个作为一个实双标量。
b =一个; b的属性一个(真正的双标量)。
c = 0 (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结构如消除生成代码中变量的冗余副本

当你定义变量时,它们默认是局部的;它们不会在函数调用之间持久存在。要使变量持久,请参见持续的

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

考虑下面的MATLAB®代码:

...如果c > 0 x = 11;在你的代码后面…如果c > 0使用(x);结束……
在这里,x仅当c> 0仅在c> 0.这段代码在MATLAB中工作,但在代码生成过程中生成编译错误,因为它检测到这一点x在某些执行路径上未定义(何时c < = 0).

要使此代码适合于代码生成,请定义x使用前:

x = 0;...如果c > 0 x = 11;在你的代码后面…如果c > 0使用(x);结束……

例2。在结构中定义字段

考虑以下MATLAB代码:

...如果c > 0 s.a = 11;disp(年代);Else s.a = 12;mit获得= 12;尝试使用s的用途;...
这里,第一部分如果语句只使用该字段一个,其他的条款使用字段一个b.这段代码在MATLAB中工作,但在C/ c++代码生成期间产生编译错误,因为它检测到结构类型不匹配。为防止此错误,请在对结构执行某些操作后,不要再向结构中添加字段。有关更多信息,请参见代码生成的结构定义

为了使此代码适合于C/ c++代码生成,定义的所有字段年代之前使用它。

...定义结构中所有的字段S = struct(' a ',0, ' b ',0);如果c > 0 s.a = 11;disp(年代);Else s.a = 12;mit获得= 12;end % Use s用途;...

重分配变量时要小心

一般来说,你应该坚持C/ c++代码生成的“一个变量/一种类型”规则;也就是说,每个变量必须有特定的类、大小和复杂性。通常,如果在初始赋值之后重新赋值变量属性,则会在代码生成期间出现编译错误,但也有例外,如中所述重新赋值变量属性

在变量定义中使用类型转换操作符

默认情况下,常量是一种类型.要定义其他类型的变量,可以在变量定义中使用类型强制转换操作符。例如,下面的代码定义了变量y作为一个整数:

...x = 15;% x默认为double类型。y = uint8 (x);% y的值为x,但被转换为uint8. ...

在分配索引变量之前定义矩阵

当从MATLAB生成C/ c++代码时,您不能通过向元素中写入超出其当前大小的内容来增加变量。这样的索引操作会产生运行时错误。在为其元素赋值之前,必须先定义矩阵。

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

g (2) = 14.6;%不允许创建g %可以在创建后分配值

有关索引矩阵的更多信息,请参见代码生成中矩阵索引操作与MATLAB的不兼容性

使用常值向量的索引数组

最好的做法是使用常量值向量作为数组的索引,而不是使用包含非常量对象的范围。

在某些情况下,代码生成器无法确定表达式是否包含结肠操作符是固定大小或可变大小。使用常值向量来索引数组,以防止在生成的代码中不必要地将它们创建为可变大小的数组。

例如,数组通过使用变量创建的通过随机行向量进行索引一个

...%提取元素i到i+5处理A = rand(1,10);=一个(我+ 5);%如果i在编译时是未知的,out是变量-size…

如果是编译时常量值,代码生成器生成一个固定大小的对象.如果在编译时未知,代码生成器为?生成大小可变的数组在生成的代码中。

为了防止代码生成器创建可变大小的数组,前面的代码片段以以下模式重写:

...%提取元素i到i+5处理A = rand(1,10);输出= A (i+(0:5));% out是固定大小的,即使我在编译时是未知的…

此模式使您能够生成固定大小的数组,这些数组在编译时具有未知的迭代器值。另一个建议重写的例子是:

宽度= 25;一个= (j-width: j +宽度);% A是可变大小,如果j在编译时是未知的fsA = A(j+(-width:width));这使得A的大小固定,即使j在编译时是未知的…

另请参阅

|

相关的话题