使用动态分配的c++数组生成的函数接口
在大多数情况下,当你为MATLAB生成代码®函数接受或返回一个数组,数组在接口生成的C / c++函数。数组大小,在编译时是未知的,或其绑定超出了预先定义的阈值,生成的数组的内存动态分配在堆上。否则,生成的数组的内存是静态分配在堆栈上。看到控制内存分配适应可变数组。
如果你选择c++作为代码生成目标语言,默认情况下,动态分配的数组被实现为一个类模板编码器:数组
在生成的代码。使用动态分配的数组在定制c++代码与生成的c++函数,集成学习使用编码器:数组
模板。
默认情况下,生成的c++代码使用编码器:数组
模板来实现动态分配的数组。相反,您可以选择生成c++代码,使用C风格emxArray
数据结构来实现动态分配的数组。生成C风格emxArray
数据结构,做以下之一:
在一个代码配置对象(
coder.MexCodeConfig
,coder.CodeConfig
,或coder.EmbeddedCodeConfig
),设置DynamicMemoryAllocationInterface
参数“C”
。在MATLAB编码器™应用程序,内存选项卡,设置动态内存分配界面来
使用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++代码。
行动 |
如何 |
---|---|
声明一个动态数组 |
使用 编码器::< int32_T 2 > myArray数组 |
分配内存 |
使用 myArray。set_size(1, 100) 如果尺寸 |
访问向量的大小 |
访问 myArray.size (1) |
动态数组的索引 |
使用普通的c++数组索引的语法。例如,设置 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::arraymyResult; 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来执行这些操作:
声明
myArray
和myResult
作为2
维的动态数组int32_T
元素。动态设置大小的两个维度
myArray
来1
和One 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::向量
要申报的向量vec
的char_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
在你当前的工作目录。