主要内容

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

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

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

使用编码器:数组类模板

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

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

编码器::array myArray

要在您希望与生成的代码(例如,自定义主函数)集成的自定义c++代码中使用动态分配的数组,请包含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 >矢量;//创建coder::array复制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 = X (X, A) Y = X;i = 1:数值(X) 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在生成的代码中如下所示:

    (const coder::array &X, int A, coder::array &Y)

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

  3. 在文件中定义一个c++主函数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,)“字符”));断言(size(str,1) == 1);断言(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在生成的代码中。

    (const coder::array &str, coder::array &y)

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

  3. 在文件中定义一个c++主函数xStringTest_main.cpp在您当前的工作文件夹中。

    这个main函数将输入数组定义为std::向量的数组char_T。的循环初始化vec的字符值“一个”“J”。该数组是为生成的函数的输入xStringTest。函数的输出在编码器:数组变量结果

    #include #include #include int main(int, char *[]){//使用coder::array模板coder::array result;//实例化输入变量std::vector std::string vec;//调整输入的大小以包含所需的值vic . Resize (10);vec = "ABCDEFGHIJ";//将输入和结果数组传递给生成的函数接口xStringTest(vec, result);//将编码器::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数组

另请参阅

|

相关的话题

Baidu
map