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