在生成的函数接口中使用动态分配的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尺寸。例如,声明一个2维动态数组myArray包含类型的元素int32_T在自定义的C ++代码,使用:

编码器:数组< int32_T 2 > myArray

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

行动

如何

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

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

编码器:数组< int32_T 2 > myArray

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

使用set_size方法。

myArray。set_size(1, 100)

如果myArray改变以后的执行,根据新的大小生成的代码重新分配存储器。

的大小向量myArray

访问大小阵列,这是一个数据成员myArray。例如,访问的第2维的大小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++主函数xTest1_main.cpp在当前工作文件夹中。

# include < iostream > # include < coder_array。h > # include < xTest1。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作为2的维动态数组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++主函数xStringTest_main.cpp在当前工作文件夹中。该功能主要用途std::向量申报矢量VEC图表元素传递给所生成的C ++函数xStringTest

# include < iostream > # include < coder_array。h > # include < xTest1。h bb1 int main(int, char *[]) {coder::array result;std::向量< char_T >矢量;vec.resize (10);(size_t我= 0;我< 10;{vec[i] = static_cast('A' + i);} xStringTest(矢量,结果);std::cout << "Result is " << std::string>(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在当前工作文件夹中。

另请参阅

|

相关话题