主要内容

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

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

如果您选择c++作为代码生成的目标语言,默认情况下,动态分配的数组将作为一个名为编码器:数组在生成的代码中。要在与生成的c++函数集成的定制c++代码中使用动态分配的数组,请学习使用编码器:数组模板。

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

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

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

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

算法描述和数组大小

MATLAB函数

生成c++函数接口

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

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

函数B = create_vec2% # codegenB = 0 (1,0);coder.varsize (“B”[30000], [0 1]);i = 1:50 0如果round(rand) B = [1 B];结束结束
void create_vec2(coder::array &B)

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

编译时未知。

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

使用编码器:数组类模板

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

模板类数组
数组包含类型元素T并已N维度。例如,声明一个二维动态数组myArray包含类型元素的int32_T在你的自定义c++代码中,使用:

编码器:数组< int32_T 2 > myArray

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

行动

指令

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

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

编码器:数组< 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[我]=我

例子

生成接受并返回可变大小数值数组的c++代码

定义MATLAB函数xTest1它接受一个数组X,加上标量一个,并返回结果数组Y

函数Y = xTest1(X, A);i = 1:numel(X) Y(i) = X(i) + A;结束

您的目标是生成一个c++可执行文件xTest1可以接受并返回的数组int32_T元素。您希望数组的第一个维度是单元素,第二个维度是无界的。

在文件中定义一个c++ main函数xTest1_main.cpp在当前工作文件夹中。

#include #include #include int main(int argc, char *argv[]) {static_cast(argc);static_cast <空白> (argv);编码器:数组< int32_T 2 > myArray;myArray。set_size(1, 100); for (int i = 0; i < myArray.size(1); i++) { myArray[i] = i; } coder::array myResult; xTest1(myArray, 1000, myResult); for (int i = 0; i < myResult.size(1); i++) { if (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包含编码器:数组类模板定义。main函数使用上一节表中描述的API来执行以下操作:

  • 声明myArraymyResult的二维动态数组int32_T元素。

  • 的两个维度的大小myArray1One hundred.通过使用set_size方法。

  • 的大小向量myResult通过使用myResult.size

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

cfg = coder.config (exe”);cfg。TargetLang =“c++”;cfg。CustomSource =“xTest1_main.cpp”;cfg。CustomInclude =“C: \工作”;codegen配置cfgarg游戏{code .typeof(int32(0), [1 inf]), int32(0)}xTest1_main.cppxTest1.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++ main函数xStringTest_main.cpp在当前工作文件夹中。此主要功能使用std::向量声明向量vecchar_T元素,传递给生成的c++函数xStringTest

#include #include #include int main(int, char *[]) {coder::array result;std::向量< char_T >矢量;vec.resize (10);For (size_t I = 0;我< 10;i++) {vec[i] = static_cast('A' + i);} xStringTest(矢量,结果);std::cout << "Result is " << static_cast(Result) << std::endl;返回0;}

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

cfg = coder.config (exe”);cfg。TargetLang =“c++”;cfg。CustomSource =“xStringTest_main.cpp”;cfg。CustomInclude =“C: \工作”;codegen配置cfgarg游戏{coder.typeof (char(“X”),[1正])}xStringTest_main.cppxStringTest.m报告

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

另请参阅

|

相关的话题