主要内容

在生成的函数接口中使用动态分配的C ++数组

在大多数情况下,当您为MATLAB生成代码时®函数接受或返回数组时,生成的C/ c++函数的接口上有一个数组。对于在编译时未知的数组大小,或其边界超过预定义阈值的数组,生成的数组的内存将在堆上动态分配。否则,生成的数组的内存将在堆栈上静态分配。看到可变大小阵列的控制内存分配

如果选择C ++作为用于代码生成的目标语言,默认情况下,动态分配的数组将实现为调用的类模板编码器:: Array.在生成的代码中。要在您的自定义C ++代码中使用动态分配的数组,您将与生成的C ++函数集成,学会使用编码器:: Array.模板。

默认情况下,生成的c++代码使用编码器:: Array.模板实现动态分配的数组。相反,您可以选择生成使用C样式的C ++代码emxArray数据结构实现动态分配的数组。生成C风格emxArray数据结构,执行下列操作之一:

了解更多关于使用C风格实现的静态分配数组或动态分配数组的信息emxArray数据结构,见在生成的函数接口中使用C数组

使用动态分配的数组的C ++功能接口的示例

该表列出了生成的c++代码中动态数组表示的两种典型情况。的定义编码器:: Array.在生成的代码中实现动态数组的模板,参见使用coder::array类模板

算法描述和数组大小

MATLAB函数

生成c++函数接口

将1推到以30000个元素为边界的可变大小行向量上。

可变大小,不在阈值范围内。

函数B = create_vec2%#codegen.B = 0 (1,0);coder.varsize ('B',[1 30000],[0 1]);为了i = 1:50 0如果圆形(兰特)b = [1 b];结尾结尾
void create_vec2(coder::array &B)

创建一个由无界整数输入确定的大小的数组。

编译时未知。

函数y = create_vec3 (n)%#codegen.y = int8 ((1, n));
void create_vec3(double n, coder::array &y)

使用编码器:: Array.类模板

为MATLAB函数生成C ++代码时,代码生成器会产生标题文件coder_array.h在构建文件夹中。这个头文件包含类模板的定义数组在命名空间中编码器.的编码器:: Array.模板在生成的代码中实现动态分配的数组。该模板的声明如下:

模板类数组
数组包含类型元素T.并有N方面。例如,要声明二维动态数组myArray.包含类型元素的INT32_T.在你的自定义c++代码中,使用:

编码器:数组< int32_T 2 > myArray

要在您想要与生成的代码集成的自定义C ++代码中使用动态分配的数组(例如,自定义主函数),请包括coder_array.h您的自定义中的标题文件.cpp.文件。该表显示了在定制c++代码中用于创建动态数组并与之交互的API。

行动

指令

声明一个动态数组myArray.包含类型元素的INT32_T..设置的维度数myArray.2

使用编码器:: Array.模板。指定元素类型和维数。

编码器:数组< int32_T 2 > myArray

分配内存myArray..将第一个维度的大小设置为1和第二个维度One hundred.

使用set_size方法。

myarray.set_size(1,100)

如果是尺寸myArray.在执行期间稍后更改,生成的代码基于新大小重新启用内存。

访问大小向量myArray.

访问尺寸的数据成员myArray..例如,访问第二维度的大小myArray., 用:

myArray.size (1)

索引到动态数组中myArray.

使用标准C ++语法进行数组索引。例如,设置一世th元素myArray.等于一世, 用:

myArray [i] =我

例子

生成接受和返回可变大小数字数组的C ++代码

定义MATLAB函数xTest1接受数组X,加上标量一种对其每个元素,并返回生成的数组y

函数Y = xTest1(X, A);为了i = 1:numel(x)y(i)= x(i)+ a;结尾

您的目标是生成一个c++可执行文件xTest1可以接受并返回的数组INT32_T.元素。您希望阵列的第一个维度是单例和第二维度要无限制。

在文件中定义C ++主要函数xtest1_main.cpp.在当前工作文件夹中。

#include  #include  #include  int main(int argc,char * argv []){static_cast (argc);static_cast (argv);编码器:: array  myArray;myarray.set_size(1,100);for(int i = 0; i  MyResult;xtest1(MyArray,1000,MyResult);for(int i = 0; i  0)std :: cout <<“”;std :: cout << myResult [i];if((((i + 1)%10)== 0)std :: cout << std :: endl; } std::cout << std::endl; return 0; }

这个main函数包括头文件coder_array.h包含编码器:: Array.类模板定义。main函数使用上一节表中描述的API来执行以下操作:

  • 宣布myArray.myResult作为二维动态阵列INT32_T.元素。

  • 动态设置两个维度的大小myArray.1One hundred.通过使用set_size方法。

  • 访问大小向量myResult通过使用myresult.size.

通过运行此脚本生成代码。代替“C: \工作”使用到当前工作文件夹的路径。

cfg = coder.config('可执行程序');cfg.targetlang =.'c ++';cfg。CustomSource =“xTest1_main.cpp”;cfg.custominclude =“C: \工作”;codegen-Config.CFG.-  args.{coder.typeof(int32(0),[1 inf]),Int32(0)}xtest1_main.cpp.xTest1.m报告

代码生成器生成一个可执行文件xTest1.exe在当前工作文件夹中。

生成c++代码,接受并返回一个可变大小的字符向量

定义MATLAB函数xstringtest.它接受一个字符向量str.,插入str.字符向量之间“你好”“世界!”,并返回结果。您的目标是生成一个c++可执行文件xstringtest.

函数y = xStringTest(str) assert(isa(str,“字符”));断言(大小(str, 1) = = 1);断言(大小(str, 2) > = 0);y = (“你好”str.“世界!”];

在文件中定义C ++主要函数xstringtest_main.cpp.在当前工作文件夹中。此主要功能使用std ::声明向量vecchar_T元素,传递给生成的c++函数xstringtest.

#include  #include  #include  int main(int,char * []){coder :: array 结果;STD :: Vector  vec;vec.resize(10);for(size_t i = 0; i <10; i ++){vec [i] = static_cast ('a'+ i);xstringtest(VEC,结果);std :: cout <<“结果是”<< static_cast (结果)<< std :: endl;返回0;}

通过运行此脚本生成代码。代替“C: \工作”使用当前工作文件夹。

cfg = coder.config('可执行程序');cfg.targetlang =.'c ++';cfg。CustomSource ='xstringtest_main.cpp';cfg.custominclude =“C: \工作”;codegen-Config.CFG.-  args.{coder.typeof (char(“X”),[1正])}xstringtest_main.cpp.xStringTest.m报告

代码生成器生成一个可执行文件xStringTest.exe在当前工作文件夹中。

也可以看看

|

相关的话题