主要内容

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

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

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

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

要了解有关静态分配的数组或通过使用C样式实现的动态分配数组的更多信息emxarray数据结构,见在生成的函数接口中使用C阵列

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

此表列出了生成的C ++代码中的动态阵列表示的两个典型案例。为了定义编码器:: Array.在生成的代码中实现动态阵列的模板,请参阅使用编码器:: Array类模板

算法描述和数组大小

Matlab功能

生成的C ++功能界面

将介绍在30,000元素的可变大小行向量上。

可变大小,不受限制在阈值内。

功能b = create_vec2.%#codegen.b =零(1,0);编码器.Varsize('B',[1 30000],[0 1]);为了我= 1:500如果圆形(兰特)b = [1 b];结尾结尾
void create_vec2(编码器:: array &b)

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

在编译时未知。

功能y = create_vec3(n)%#codegen.Y = INT8(1,N));
void create_vec3(Double N,编码器:: Array <签名Char,2U>&Y)

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

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

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

编码器:: Array  MyArray

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

行动

指示

声明一个动态数组myArray.包含类型的元素INT32_T.。设置尺寸的数量myArray.2

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

编码器:: Array  MyArray

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

使用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)y = x;为了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; }

该主要功能包括标题文件coder_array.h.那个包含编码器:: Array.类模板定义。主函数使用上一节中表中描述的API来执行以下操作:

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

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

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

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

cfg = coder.config('EXE文件');cfg.targetlang ='c ++';cfg.cusomsource ='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)断言(ISA(str,'char'));断言(大小(str,1)== 1);断言(大小(str,2)> = 0);y = ['你好 'str.' 世界!'];

在文件中定义C ++主要函数xstringtest_main.cpp.在您当前的工作文件夹中。这个主要功能使用std ::声明矢量v图表您传递给生成的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('EXE文件');cfg.targetlang ='c ++';cfg.cusomsource ='xstringtest_main.cpp';cfg.custominclude ='C:\工作';Codegen.-Config.CFG.-  args.{coder.typeof(char('x'),[1 inf])}xstringtest_main.cpp.Xstringtest.m.-报告

代码生成器生成可执行文件xstringtest.exe.在您当前的工作文件夹中。

也可以看看

|

相关话题