主要内容

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

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

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

默认情况下,生成的C++代码使用编码器::数组实现动态分配数组的模板。相反,您可以选择生成使用C样式的C++代码。埃姆沙雷实现动态分配数组的数据结构。生成C样式埃姆沙雷对于数据结构,请执行以下操作之一:

了解有关使用C样式实现的静态分配数组或动态分配数组的更多信息埃姆沙雷数据结构,请参见在生成的函数接口中使用C数组.

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

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

算法描述和数组大小

MATLAB函数

生成的C++函数接口

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

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

功能B=创建向量2%#编码基因B=零(1,0);编码器.varsize(“B”,[1 30000],[0 1]);对于i=1:500如果圆(rand)B=[1 B];结束结束
void create_vec2(编码器::数组&B)

创建大小由无界整数输入决定的数组。

编译时未知。

功能y=创建向量3(n)%#编码基因y=int8(一(1,n));
void create_vec3(双n,coder::array&y)

使用编码器::数组类模板

当生成用于Matlab函数的C++代码时,代码生成器生成头文件。编码器数组.h在生成文件夹中。此头文件包含类模板的定义数组在命名空间中编码器. 这个编码器::数组模板在生成的代码中实现动态分配的数组。此模板的声明为:

模板类数组
数组包含类型为的元素T而且已经N尺寸。例如,声明一个二维动态数组我的数组包含类型为国际32\T在您的自定义C++代码中,使用:

编码器::数组myArray

要在您想与生成代码集成的自定义C++代码中使用动态分配的数组(例如,自定义main函数),请将编码器数组.h自定义文件中的头文件.cpp文件文件夹。此表显示了您在自定义C++代码中使用的API,用于创建和与动态数组交互。

行动

说明

声明动态数组我的数组包含类型为国际32\T. 设置的维度数我的数组2..

使用编码器::数组模板。指定图元类型和标注数。

编码器::数组myArray

为分配内存我的数组. 将第一个维度的大小设置为1.第二个维度是100.

使用设置\u大小方法。

myArray.set\u大小(1100)

如果我的数组稍后在执行过程中发生更改时,生成的代码将根据新的大小重新分配内存。

访问的大小向量我的数组.

访问大小数组,它是我的数组. 例如,要访问我的数组,使用:

myArray.size(1)

索引到动态数组中我的数组.

使用标准的C++语法来进行数组索引。例如,设置-的th元素我的数组等于,使用:

我的数组[i]=i

示例

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

定义MATLAB函数xTest1型接受数组的,添加标量A.并返回结果数组Y.

功能Y=xTest1(X,A)Y=X;对于i=1:numel(X)Y(i)=X(i)+A;结束

您的目标是生成C++可执行文件xTest1型可以接受并返回国际32\T元素。您希望数组的第一个维度是singleton,第二个维度是unbounded。

在文件中定义C++主函数xTest1\u主.cpp在当前工作文件夹中。

#include#include#includeint main(int argc,char*argv[]){static_cast(argc);静态铸造(argv);编码器::数组myArray;myArray.set\ u size(1100);对于(int i=0;imyResult;xTest1(myArray,1000,myResult);对于(int i=0;i0)std::cout<<“”;标准::cout<
             

此主要功能包括头文件编码器数组.h包含编码器::数组类模板定义。main函数使用上一节表格中描述的API执行以下操作:

  • 声明我的数组我的结果作为二维动态数组国际32\T元素。

  • 动态设置图形的两个维度的大小我的数组1.100通过使用设置\u大小方法。

  • 访问的大小向量我的结果通过使用myResult.size文件.

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

cfg=编码器配置('执行'); cfg.TargetLang公司='C++'; cfg.CustomSource文件='xTest1\u main.cpp'; cfg.CustomInclude包括='C:\工作'; 编码基因-配置cfg公司-参数{coder.typeof(int32(0),[1 inf]),int32(0)}xTest1\u主.cppxTest1.m公司-报告

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

生成接受并返回字符大小可变的向量的C++代码

定义MATLAB函数xStringTest公司接受字符向量的str公司,插入str公司在字符向量之间'你好'“世界!”,并返回结果。您的目标是从C++中生成C++可执行文件。xStringTest公司.

功能y=xStringTest(str)断言(isa(str,'字符')); 断言(大小(str,1)==1);断言(大小(str,2)>=0);y=['你好'str公司“世界!”];

在文件中定义C++主函数xStringTest\u main.cpp在当前工作文件夹中。此主要功能使用标准::向量声明向量向量属于字符传递给生成的C++函数的元素xStringTest公司.

#include#include#includeint main(int,char*[]){coder::array结果;标准::向量vec;矢量调整(10);对于(尺寸i=0;i<10;i++){vec[i]=static\u cast('A'+i);}xStringTest(vec,结果);std::cout<<“结果是”<(结果)<
             

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

cfg=编码器配置('执行'); cfg.TargetLang公司='C++'; cfg.CustomSource文件='xStringTest\u main.cpp'; cfg.CustomInclude包括='C:\工作'; 编码基因-配置cfg公司-参数{coder.typeof(char('X'),[1 inf])}xStringTest\u main.cppxStringTest.m公司-报告

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

另请参见

|

相关主题