主要内容

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

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

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

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

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

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

此表列出了在生成C ++代码动态数组表示两种典型的情况。对于该定义编码器:数组模板实现在生成的代码的动态阵列,见使用编码器::数组类模板

算法描述和数组大小

MATLAB功能

生成的C ++函数接口

推到那些以30,000元件界定的可变大小行向量。

可变大小,阈值内不界定。

功能B = create_vec2% # codegenB =零(1,0);coder.varsize(“B”[30000], [0 1]);I = 1:500如果round(rand) B = [1 B];结尾结尾
空隙create_vec2(编码器::阵列<双,2U>&B)

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

未知在编译时。

功能Y = create_vec3(n)的% # codegenY = INT8(一(1,N));
空隙create_vec3(双N,译码器::阵列<符号的字符,2U>&y)的

使用编码器:数组类模板

当您为MATLAB函数生成c++代码时,代码生成器会生成一个头文件coder_array.hbuild文件夹中。这个头文件包含类模板的定义大批在命名空间编码器.这编码器:数组模板工具在所生成的代码中的动态分配数组。此模板的声明是:

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

编码器::阵列 myArray的

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

行动

指示

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

使用编码器:数组模板。指定元素的类型和尺寸的数量。

编码器::阵列 myArray的

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

使用set_size方法。

myArray。set_size(1, 100)

如果myArray在执行过程中,生成的代码会根据新的大小重新分配内存。

的大小向量myArray

访问大小阵列,这是一个数据成员myArray.例如,要访问的第二个维度的大小myArray使用:

myArray.size(1)

索引到动态数组myArray

使用标准的c++语法进行数组索引。例如,要设置的个元素myArray等于使用:

myArray[我]=我

例子

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

定义功能的MATLABxTest1它接受一个数组X,加标一个,并返回结果数组Y

功能Y = xTest1(X,A)Y = X;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; }

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

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

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

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

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

cfg = coder.config (exe”);cfg。TargetLang =“c++”;cfg.CustomSource ='xTest1_main.cpp';cfg。CustomInclude ='C:\工作';代码生成配置cfgarg游戏{code .typeof(int32(0), [1 inf]), int32(0)}xTest1_main.cppxTest1.m-报告

代码发生器产生的可执行文件xTest1.exe在当前工作文件夹中。

产生一种可以接受和返回字符的可变大小的矢量的C ++代码

定义功能的MATLABxStringTest接受字符向量str、插入str在字符向量之间'你好 '' 世界!',并返回结果。你的目标是产生一个C ++的可执行文件xStringTest

功能Y = xStringTest(STR)的断言(ISA(STR,“字符”));断言(大小(STR,1)== 1);断言(大小(STR,2)> = 0);Y = ['你好 'str' 世界!'];

在文件中定义一个c++ main函数xStringTest_main.cpp在当前工作文件夹中。该功能主要用途std::向量申报矢量VEC图表元素传递给所生成的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:\工作';代码生成配置cfgarg游戏{coder.typeof(炭( 'X'),[1个INF])}xStringTest_main.cppxStringTest.m-报告

代码发生器产生的可执行文件xStringTest.exe在当前工作文件夹中。

另请参阅

|

相关话题