对于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
结构如消除生成代码中变量的冗余副本.
当你定义变量时,它们默认是局部的;它们不会在函数调用之间持久存在。要使变量持久,请参见持续的
.
考虑下面的MATLAB®代码:
...如果c > 0 x = 11;在你的代码后面…如果c > 0使用(x);结束……
c> 0
仅在c> 0
.这段代码在MATLAB中工作,但在代码生成过程中生成编译错误,因为它检测到这一点x在某些执行路径上未定义(何时c < = 0
).
要使此代码适合于代码生成,请定义x使用前:
x = 0;...如果c > 0 x = 11;在你的代码后面…如果c > 0使用(x);结束……
考虑以下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在编译时是未知的…