主要内容

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

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

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

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

学习更多的关于静态分配的数组或动态分配的数组实现通过使用C风格emxArray数据结构,请参阅使用C数组生成的函数接口

c++函数接口的例子与动态分配的数组

此表列出了两种典型情况下的动态数组表达生成c++代码。下一节解释的定义编码器:数组模板,实现了动态数组生成的代码。

算法描述和数组的大小

MATLAB函数

生成c++函数接口

推到适应的行向量有界30000个元素。

适应,而不是在阈值有界。

函数B = create_vec2% # codegenB = 0 (1,0);coder.varsize (“B”[30000],[0 1]);i = 1:50 0如果轮(rand) B = (1 B);结束结束
空白create_vec2(编码器:数组<双,2 u >乙)

创建一个数组的大小取决于一个无界的整数输入。

在编译时未知。

函数y = create_vec3 (n)% # codegeny = int8 ((1, n));
空白create_vec3(双n,编码器:数组< char签署2 u > y)

使用编码器:数组类模板

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

模板< typename T, int32_T N >类数组
该数组包含的元素类型T并已N维度。例如,宣布2维动态数组myArray包含的元素类型int32_T在定制c++代码中,使用:

编码器::< int32_T 2 > myArray数组

使用定制c++代码中动态分配的数组要集成生成的代码(例如,一个自定义的主要功能),包括coder_array.h在您的自定义头文件. cpp文件。这个表显示您所使用的API来创建和相互作用动态数组定制c++代码。

行动

如何

声明一个动态数组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 Y = X (X);i = 1:元素个数(X) Y (i) = X(我)+一个;结束

你的目标是生成一个c++执行xTest1能够接受和返回的数组int32_T元素。你想让数组的第一个维度是单例,第二个维度是无界的。

定义一个c++文件中的主要功能xTest1_main.cpp在你当前的工作目录。

# include < iostream > # include < coder_array。h > # include < xTest1。h > int主要(int命令行参数个数,char * argv []) {static_cast <空白>(命令行参数个数);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元素。

  • 动态设置大小的两个维度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游戏{coder.typeof (int32(0)[1正]),int32 (0)}xTest1_main.cppxTest1.m报告

代码生成器生成一个可执行文件xTest1.exe在你当前的工作目录。

生成c++代码,接受的字符,并返回一个适应可变向量

定义一个MATLAB函数xStringTest接受一个特征向量str、插入str之间的特征向量“你好”“世界!”,并返回结果。你的目标是生成一个c++执行xStringTest

函数y = xStringTest (str)断言(isa (str,“字符”));断言(大小(str, 1) = = 1);断言(大小(str, 2) > = 0);y = (“你好”str“世界!”];

定义一个c++文件中的主要功能xStringTest_main.cpp在你当前的工作目录。这个主要功能使用std::向量要申报的向量vecchar_T元素传递给生成c++函数xStringTest

# include < iostream > # include < coder_array。h > # include < xTest1。main (int、char * h > int[]){编码器:数组< char_T 2 >结果;std::向量< char_T >矢量;vec.resize (10);(size_t我= 0;我< 10;我+ +){vec[我]= static_cast < char_T > (A + i);}xStringTest(矢量,结果);std:: cout < <“结果”< < static_cast < std:: string >(结果)< < 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在你当前的工作目录。

另请参阅

|

相关的话题