主要内容

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

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

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

使用编码器:数组类模板

当您为MATLAB函数生成c++代码时,代码生成器会生成一个头文件coder_array.h在build文件夹中。这个头文件包含类模板的定义数组在命名空间中编码器.的编码器:数组模板在生成的代码中实现动态分配的数组。这个模板的声明如下:

template 类数组
数组包含类型的元素T并已N维度。例如,声明一个二维动态数组myArray包含类型元素的int32_T在你的自定义c++代码中,使用:

编码器::array myArray

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

行动

指令

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

使用编码器:数组模板。指定元素类型和维度数。

编码器::array myArray

myArray.将第一个维度的大小设置为1第二个维度是One hundred.

使用set_size方法。

myArray。set_size(1, 100)

如果的维数myArray稍后在执行期间发生更改时,生成的代码将根据新的大小重新分配内存。

的大小向量myArray

访问大小数组的数据成员myArray.例如,访问二次元的大小myArray使用:

myArray.size (1)

索引到动态数组中myArray

使用标准的c++语法进行数组索引。例如,设置的第-元素myArray等于使用:

myArray[i] = i

也可以通过使用标准c++语法或使用方法。

myArray[i][j] = i*j;//你也可以使用'at'函数myArray.at(i,j) = i * j;

创建编码器:数组变量std:: string而且std::向量数组。

使用复制构造函数进行创建编码器:数组数组的std:: string而且std::向量数组。例如,创建一个编码器:数组本表格副本std::向量数组vec使用:

std::向量< int32_T >矢量;// Create coder::array copy coder::array copyArray(vec);

使用copyArray将生成的代码与项目连接。

例子

下面的例子展示了如何生成接受并返回可变大小的数字和字符数组的c++代码。要在自定义c++代码中使用动态分配的数组,请包含coder_array.h头文件在您的自定义. cpp文件。的编码器:数组类模板具有允许分配和释放数组内存的方法。

的数组也可以连接生成的代码std::向量std:: string作为动态大小数组。这些数组还可以用作生成函数的输入。看到生成接受并返回可变大小字符向量的c++代码

生成接受并返回可变大小数字数组的c++代码

此示例显示如何自定义生成的示例主函数以使用编码器:数组项目中的类模板。有关其相关方法的信息,请参见上表。

您的目标是生成一个c++可执行文件xTest1的数组,它可以接受并返回int32_T元素。你希望数组的第一个维度是单维度的,而第二个维度是无界的。

  1. 定义一个MATLAB函数xTest1接受数组X,添加标量一个赋给它的每个元素,并返回结果数组Y

    函数Y = xTest1(X, A) Y = X;i = 1: Y(i) = X(i) + A;结束
  2. 生成的初始源代码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)

    通过提供与上面所示的函数原型兼容的输入和输出数组来连接生成的代码。

  3. 在文件中定义一个c++ main函数xTest1_main.cpp在当前工作文件夹中。

    这个main函数包括头文件coder_array.h包含编码器:数组类模板定义。main函数使用前一节表格中描述的API来执行这些操作:

    • 声明myArray而且myResult的二维动态数组int32_T元素。

    • 动态设置两个维度的大小myArray1而且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; }
  4. 通过运行这个脚本生成代码:

    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::向量声明向量vecchar_T你传递给生成的c++函数的元素xStringTest

  1. 定义一个MATLAB函数xStringTest它接受一个字符向量str、插入str在特征向量之间“你好”而且“世界!”,并返回结果。您的目标是生成一个c++可执行文件xStringTest

    函数y = xStringTest(str) assert(isa(str,“字符”));Assert (size(str,1) == 1);Assert (size(str,2) >= 0);Y = [“你好”str“世界!”];
  2. 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)

    通过提供与上面所示的函数原型兼容的输入和输出数组来连接生成的代码。

  3. 在文件中定义一个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;}
  4. 通过运行此脚本生成代码。

    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数据结构,执行以下操作之一:

了解有关使用C风格实现的静态分配数组或动态分配数组的更多信息emxArray数据结构,见在生成的函数接口中使用C数组

另请参阅

|

相关的话题