在生成的函数接口中使用动态分配的c++数组
在大多数情况下,当你为MATLAB生成代码时®函数接受或返回数组,在生成的C/ c++函数的接口上有一个数组。对于编译时未知的数组大小,或其界限超过预定义阈值的数组,生成的数组的内存将在堆上动态分配。否则,生成的数组的内存将在堆栈上静态分配。看到控制可变大小数组的内存分配.
如果选择c++作为代码生成的目标语言,默认情况下,动态分配的数组被实现为类模板编码器:数组
在生成的代码中。要在与生成的c++函数集成的自定义c++代码中使用动态分配的数组,请学习使用编码器:数组
模板。
使用编码器:数组
类模板
当您为MATLAB函数生成c++代码时,代码生成器会生成一个头文件coder_array.h
在build文件夹中。这个头文件包含类模板的定义数组
在命名空间中编码器
.的编码器:数组
模板在生成的代码中实现动态分配的数组。这个模板的声明如下:
template类数组
T
并已N
维度。例如,声明一个二维动态数组myArray
包含类型元素的int32_T
在你的自定义c++代码中,使用:
编码器::arraymyArray
要在希望与生成的代码集成的自定义c++代码(例如,自定义main函数)中使用动态分配的数组,请包含coder_array.h
头文件在您的自定义. cpp
文件。下表显示了在自定义c++代码中创建动态数组并与之交互的API。
行动 |
指令 |
---|---|
声明一个动态数组 |
使用 编码器::array |
为 |
使用 myArray。set_size(1, 100) 如果的维数 |
的大小向量 |
访问 myArray.size (1) |
索引到动态数组中 |
使用标准的c++语法进行数组索引。例如,设置 myArray[i] = i 也可以通过使用标准c++语法或使用 myArray[i][j] = i*j;//你也可以使用'at'函数myArray.at(i,j) = i * j; |
创建 |
使用复制构造函数进行创建 std::向量< int32_T >矢量;// Create coder::array copy coder::array 使用 |
例子
下面的例子展示了如何生成接受并返回可变大小的数字和字符数组的c++代码。要在自定义c++代码中使用动态分配的数组,请包含coder_array.h
头文件在您的自定义. cpp
文件。的编码器:数组
类模板具有允许分配和释放数组内存的方法。
的数组也可以连接生成的代码std::向量
或std:: string
作为动态大小数组。这些数组还可以用作生成函数的输入。看到生成接受并返回可变大小字符向量的c++代码.
生成接受并返回可变大小数字数组的c++代码
此示例显示如何自定义生成的示例主函数以使用编码器:数组
项目中的类模板。有关其相关方法的信息,请参见上表。
您的目标是生成一个c++可执行文件xTest1
的数组,它可以接受并返回int32_T
元素。你希望数组的第一个维度是单维度的,而第二个维度是无界的。
定义一个MATLAB函数
xTest1
接受数组X
,添加标量一个
赋给它的每个元素,并返回结果数组Y
.函数Y = xTest1(X, A) Y = X;为i = 1: Y(i) = X(i) + A;结束
生成的初始源代码
xStringTest
和移动xTest1.h
从代码生成文件夹到当前文件夹。使用以下命令:CFG = code .config(“自由”);cfg。TargetLang =“c++”;codegen配置cfgarg游戏{code .typeof(int32(0), [1 inf]), int32(0)}xTest1.m报告
的函数原型
xTest1
在生成的代码中如下所示:void xTest1(const coder::array
&X, int A, coder::array &Y) 通过提供与上面所示的函数原型兼容的输入和输出数组来连接生成的代码。
在文件中定义一个c++ main函数
xTest1_main.cpp
在当前工作文件夹中。这个main函数包括头文件
coder_array.h
包含编码器:数组
类模板定义。main函数使用前一节表格中描述的API来执行这些操作:声明
myArray
而且myResult
的二维动态数组int32_T
元素。动态设置两个维度的大小
myArray
来1
而且One hundred.
通过使用set_size
方法。的大小向量
myResult
通过使用myResult.size
.
#include
#include #include int main(int argc, char *argv[]) {static_cast (argc);static_cast <空白> (argv);//使用coder::array模板coder::array myArray实例化输入变量;//为数组myArray分配初始内存。set_size (100);//具有标准c++索引的访问数组(int i = 0;i < myArray.size(1);myArray[i] = i;} //使用coder::array模板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; } 通过运行这个脚本生成代码:
CFG = code .config(exe”);cfg。TargetLang =“c++”;cfg。CustomSource =“xTest1_main.cpp”;cfg。CustomInclude =“。”;%当前工作目录codegen配置cfgarg游戏{code .typeof(int32(0), [1 inf]), int32(0)}xTest1_main.cppxTest1.m报告
代码生成器生成一个可执行文件xTest1.exe
在当前工作文件夹中。
生成接受并返回可变大小字符向量的c++代码
方法将生成的示例主文件自定义为与生成的代码相接口的字符串数组编码器:数组
类方法。
本例中的main函数使用std::向量
声明向量vec
的char_T
你传递给生成的c++函数的元素xStringTest
.
定义一个MATLAB函数
xStringTest
它接受一个字符向量str
、插入str
在特征向量之间“你好”
而且“世界!”
,并返回结果。您的目标是生成一个c++可执行文件xStringTest
.函数y = xStringTest(str) assert(isa(str,“字符”));Assert (size(str,1) == 1);Assert (size(str,2) >= 0);Y = [“你好”str“世界!”];
为
xStringTest
和移动xStringTest.h
从代码生成文件夹到当前工作文件夹。使用以下命令:CFG = code .config(“自由”);cfg。TargetLang =“c++”;codegen配置cfgarg游戏{code .typeof(char('X'), [1 inf])}xStringTest.m报告
在报告中,检查函数原型
xStringTest
在生成的代码中。void xStringTest(const coder::array
&y, coder::array &y) 通过提供与上面所示的函数原型兼容的输入和输出数组来连接生成的代码。
在文件中定义一个c++ main函数
xStringTest_main.cpp
在当前工作文件夹中。这个main函数将输入数组定义为
std::向量
的数组char_T
.的为
循环初始化vec
字符值从“一个”
来“J”
.该数组是生成的for函数的输入xStringTest
.函数的输出在编码器:数组
变量结果
.#include
#include #include int main(int, char *[]){//使用coder::array模板coder::array result实例化结果变量;//实例化输入变量std::vector std::string vec;//调整输入的大小以包含所需的值vvector . Resize (10);vec = "ABCDEFGHIJ";//将输入和结果数组传递给生成的函数接口xStringTest(vec, result);//将coder::array 'result'变量转换为std::string以显示std::cout << " result is ";Std::cout << static_cast< Std::string>(result) << Std::endl;返回0;} 通过运行此脚本生成代码。
CFG = code .config(exe”);cfg。TargetLang =“c++”;cfg。CustomSource =“xStringTest_main.cpp”;cfg。CustomInclude =“。”;%当前工作目录codegen配置cfgarg游戏{code .typeof(char('X'), [1 inf])}xStringTest_main.cppxStringTest.m报告
代码生成器生成一个可执行文件xStringTest.exe
在当前工作文件夹中。
更改接口生成
默认情况下,生成的c++代码使用编码器:数组
模板来实现动态分配的数组。相反,您可以选择生成使用C风格的c++代码emxArray
实现动态分配数组的数据结构。生成C样式emxArray
数据结构,执行以下操作之一:
在代码配置对象(
编码器。MexCodeConfig
,编码器。CodeConfig
,或编码器。EmbeddedCodeConfig
),设置DynamicMemoryAllocationInterface
参数“C”
.在MATLAB编码器™应用,在内存选项卡,设置动态内存分配接口来
使用C风格的EmxArray
.
了解有关使用C风格实现的静态分配数组或动态分配数组的更多信息emxArray
数据结构,见在生成的函数接口中使用C数组.