主要内容gydF4y2Ba

用类接口生成C++代码gydF4y2Ba

当你生成C代码时,软件会分析你的MATLABgydF4y2Ba®gydF4y2Ba代码并生成入口点C函数,对应于您的入口点MATLAB函数。当您生成c++代码时,您可以选择在c++类中生成入口点函数作为方法。使用这个选项:gydF4y2Ba

  • 您将获得更多面向对象的代码。gydF4y2Ba

  • 代码生成器生成一个类构造函数和析构函数,自动执行内存初始化和终止。gydF4y2Ba

  • 可以分别为每个类实例分配内存。每个类实例的方法都是线程安全和可重入的。gydF4y2Ba

  • 多个入口点函数成为单个C++类中的方法。gydF4y2Ba

可以从命令行或gydF4y2BaMATLAB编码器™gydF4y2Ba应用程序。在命令行中,使用gydF4y2Ba界面风格gydF4y2Ba和gydF4y2BaCppInterfaceClassNamegydF4y2Ba配置参数。从应用程序,在gydF4y2Ba生成代码gydF4y2Ba步骤,选择gydF4y2Ba语言gydF4y2Ba作为gydF4y2Bac++gydF4y2Ba中,选择gydF4y2Ba界面风格gydF4y2Ba作为gydF4y2Ba方法gydF4y2Ba,然后指定gydF4y2BaC++接口类名gydF4y2Ba.gydF4y2Ba

这些示例显示了命令行工作流。gydF4y2Ba

用类接口生成C++代码gydF4y2Ba

这个例子展示了生成的c++代码在使用类接口时的不同之处。gydF4y2Ba

MATLAB算法gydF4y2Ba

考虑一个简单的MATLAB函数,它对矩阵执行操作并输出结果。gydF4y2Ba

作用gydF4y2Ba出= fooggydF4y2Ba% # codegengydF4y2Ba我=眼(447);out = one (447)*I + 7;gydF4y2Ba

生成有无类接口的C++代码gydF4y2Ba

若要生成具有类接口的C++代码,请使用gydF4y2Ba界面风格gydF4y2Ba和gydF4y2BaCppInterfaceClassNamegydF4y2Ba参数。将输出存储在gydF4y2BawithClassgydF4y2Ba文件夹中。gydF4y2Ba

cfg = coder.config (gydF4y2Ba“自由”gydF4y2Ba); cfg.GenCodeOnly=true;cfg.TargetLang=gydF4y2Ba“c++”gydF4y2Ba; cfg.cpp接口样式=gydF4y2Ba“方法”gydF4y2Ba;cfg。CppInterfaceClassName =gydF4y2Ba“我的班级”gydF4y2Ba; 编码基因gydF4y2BafooggydF4y2Ba配置gydF4y2BacfggydF4y2Ba-报告gydF4y2Ba-dgydF4y2BawithClassgydF4y2Ba
代码生成成功:要查看报告,打开('withClass/html/report.mldatx')。gydF4y2Ba

接下来,创建一个新的配置对象并生成不使用类接口的c++代码。gydF4y2Ba

cfg = coder.config (gydF4y2Ba“自由”gydF4y2Ba); cfg.GenCodeOnly=true;cfg.TargetLang=gydF4y2Ba“C++”gydF4y2Ba; 编码基因gydF4y2BafooggydF4y2Ba配置gydF4y2BacfggydF4y2Ba-报告gydF4y2Ba-dgydF4y2Ba没有课gydF4y2Ba
代码生成成功:要查看报告,打开('withoutClass/html/report.mldatx')。gydF4y2Ba

检查生成的示例main函数。比较有和没有类接口的版本。使用类接口,main函数将入口点函数作为类方法调用。gydF4y2Ba

类型gydF4y2BawithClass/examples/main.cppgydF4y2Ba

生成代码中的类定义和实现gydF4y2Ba

当代码生成器为c++接口类生成代码时,它确保函数方法是可重入的。如果函数方法使用的变量可以超过本地堆栈内存限制(由配置参数设置)gydF4y2BaStackUsageMaxgydF4y2Ba,然后代码生成器为变量(由后缀标识)生成私有数据结构gydF4y2BaStackDatagydF4y2Ba),而不是声明变量为gydF4y2Ba静态gydF4y2Ba. 静态变量在函数调用之间保持不变,并且不可重入。有关生成可重入C代码的信息,请参见gydF4y2Ba生成和调用可重入代码gydF4y2Ba.gydF4y2Ba

要研究生成的类实现,请修改函数gydF4y2BafooggydF4y2Ba这样,它包含一个超过配置参数指定的最大堆栈使用量的变量gydF4y2BaStackUsageMaxgydF4y2Ba.gydF4y2Ba

作用gydF4y2Ba出= foogBiggydF4y2Ba% # codegengydF4y2Ba我=眼(448);out = one (448)*I + 7;gydF4y2Ba

的默认值gydF4y2BaStackUsageMaxgydF4y2Ba字节数为:gydF4y2Ba

cfg。StackUsageMaxgydF4y2Ba
ans=32 200000荷兰盾gydF4y2Ba

因为gydF4y2BafooBiggydF4y2Ba使用448^2(200704)个元素的变量,代码生成器生成一个8位整数数组来表示该变量,默认堆栈使用限制超出704字节。为生成代码gydF4y2Ba福比格gydF4y2Ba.gydF4y2Ba

cfg = coder.config (gydF4y2Ba“自由”gydF4y2Ba,gydF4y2Ba“是”gydF4y2Ba、假);cfg。GenCodeOnly = true;cfg。TargetLang =gydF4y2Ba“c++”gydF4y2Ba; cfg.cpp接口样式=gydF4y2Ba“方法”gydF4y2Ba;cfg。CppInterfaceClassName =gydF4y2Ba“myBigClass”gydF4y2Ba; 编码基因gydF4y2Ba福比格gydF4y2Ba配置gydF4y2BacfggydF4y2Ba-报告gydF4y2Ba-dgydF4y2Ba大类gydF4y2Ba
代码生成成功:要查看报告,请打开('withBigClass/html/report.mldatx')。gydF4y2Ba

检查生成的接口类定义gydF4y2Ba

检查类定义中的gydF4y2Ba福比格gydF4y2Ba项目和gydF4y2BafooggydF4y2Ba这个gydF4y2Ba福比格gydF4y2Ba类在私有类属性中存储可以超过最大堆栈使用量的变量,而gydF4y2BafooggydF4y2Ba类仅在堆栈上创建局部变量。gydF4y2Ba

当您使用包含gydF4y2BaStackDatagydF4y2Ba结构,指示类需要超过本地堆栈使用限制的数据,然后使用gydF4y2Ba刚出现的gydF4y2Ba. 请参阅生成的示例主文件,以获取生成的代码。gydF4y2Ba

生成的c++类中的全局变量和持久变量gydF4y2Ba

当您生成带有类接口的c++代码时,您可以将全局变量和持久化变量作为类的成员访问。这个例子展示了如何与类中的全局变量和持久化变量进行交互。gydF4y2Ba

MATLAB算法gydF4y2Ba

考虑一个Matlab函数,用一个全局变量和持久变量来计数它的次数。gydF4y2Ba

作用gydF4y2Ba(po,) = countCallsgydF4y2Ba% # codegengydF4y2Ba%增量持久&全局变量gydF4y2Ba持续的gydF4y2BapgydF4y2Ba全球gydF4y2BaggydF4y2Ba如果gydF4y2Baisempty(p)p=0;gydF4y2Ba结束gydF4y2Bap = p + 1;g = g + 1;gydF4y2Ba%设置输出变量gydF4y2Bapo=双(p);go=双倍(g);gydF4y2Ba

用类接口生成C++代码gydF4y2Ba

对于代码生成,在工作区中初始化全局变量。gydF4y2Ba

全球gydF4y2BaGg=0;gydF4y2Ba

在名为gydF4y2Ba伯爵阶级gydF4y2Ba.gydF4y2Ba

cfg = coder.config (gydF4y2Ba“自由”gydF4y2Ba); cfg.GenCodeOnly=true;cfg.TargetLang=gydF4y2Ba“c++”gydF4y2Ba; cfg.cpp接口样式=gydF4y2Ba“方法”gydF4y2Ba;cfg。CppInterfaceClassName =gydF4y2Ba“countClass”gydF4y2Ba; 编码基因gydF4y2BacountCallsgydF4y2Ba配置gydF4y2BacfggydF4y2Ba-报告gydF4y2Ba
代码生成成功:要查看报告,打开('codegen/lib/countCalls/html/report.mldatx')。gydF4y2Ba

检查类定义gydF4y2Ba

在生成的c++代码中,初始化函数将全局变量设置为您在工作空间中指定的值。属性也可以指定初始全局值gydF4y2Bacodegen-全局gydF4y2Ba语法。gydF4y2Ba

检查头文件中类定义的代码gydF4y2BacountClass.hgydF4y2Ba.gydF4y2Ba

类型gydF4y2Bacodegen/lib/countCalls/countClass.hgydF4y2Ba

全局变量是类的公共成员。根据需要从主函数访问此变量。持久变量存储在私有类数据结构中。gydF4y2Ba

将多个入口点函数放在同一个类中gydF4y2Ba

当您为多个入口点函数生成c++代码并使用类接口设置时,那么每个函数都将成为同一个类的公共方法。您可以使用这种技术为您的多个入口点函数项目创建一个更简单的接口。gydF4y2Ba

MATLAB入口点函数gydF4y2Ba

中断功能gydF4y2BacountCallsgydF4y2Ba在上一个示例中,将调用分为两个,这样一个函数使用持久变量对调用进行计数,另一个函数使用全局变量对调用进行计数。检查这两个功能。gydF4y2Ba

作用gydF4y2Bapo=持续计数gydF4y2Ba% # codegengydF4y2Ba增量持久化变量gydF4y2Ba持续的gydF4y2BapgydF4y2Ba如果gydF4y2Baisempty(p)p=0;gydF4y2Ba结束gydF4y2Bap = p + 1;gydF4y2Ba设置输出变量gydF4y2Bapo=双(p);gydF4y2Ba
作用gydF4y2Ba去= countGlobalgydF4y2Ba% # codegengydF4y2Ba%增量全局变量gydF4y2Ba全球gydF4y2Bag=g+1;gydF4y2Ba设置输出变量gydF4y2Ba去=双(g);gydF4y2Ba

生成C++代码gydF4y2Ba

使用gydF4y2BacodegengydF4y2Ba命令并指定初始全局变量值作为输入。gydF4y2Ba

cfg = coder.config (gydF4y2Ba“自由”gydF4y2Ba); cfg.GenCodeOnly=true;cfg.TargetLang=gydF4y2Ba“c++”gydF4y2Ba; cfg.cpp接口样式=gydF4y2Ba“方法”gydF4y2Ba;cfg。CppInterfaceClassName =gydF4y2Ba“countClassMulti”gydF4y2Ba; 编码基因gydF4y2BacountGlobalgydF4y2Ba持续计数gydF4y2Ba配置gydF4y2BacfggydF4y2Ba-报告gydF4y2Ba-全球的gydF4y2Ba{'g',0}gydF4y2Ba
代码生成成功:要查看报告,打开('codegen/lib/countGlobal/html/report.mldatx')。gydF4y2Ba

检查生成的代码gydF4y2Ba

要查看生成的类定义,请打开gydF4y2BacountClassMulti.hgydF4y2Ba.每个入口点函数都是类的一个公共方法。gydF4y2Ba

类型gydF4y2Bacodegen/lib/countGlobal/countClassMulti.hgydF4y2Ba

另请参阅gydF4y2Ba

相关话题gydF4y2Ba