主要内容gydF4y2Ba

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

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

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

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

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

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

可以从命令行或gydF4y2BaMATLAB编码器™gydF4y2Ba在命令行中,使用gydF4y2BaCppInterfaceStylegydF4y2Ba和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++代码,请使用gydF4y2BaCppInterfaceStylegydF4y2Ba和gydF4y2BaCppInterfaceClassNamegydF4y2Ba参数。将输出存储在gydF4y2BawithClassgydF4y2Ba文件夹中。gydF4y2Ba

cfg = coder.config (gydF4y2Ba“自由”gydF4y2Ba);cfg。GenCodeOnly = true;cfg。TargetLang =gydF4y2Ba“c++”gydF4y2Ba;cfg。CppInterfaceStyle =gydF4y2Ba“方法”gydF4y2Ba;cfg。CppInterfaceClassName =gydF4y2Ba“myClass”gydF4y2Ba;codegengydF4y2BafooggydF4y2Ba配置gydF4y2BacfggydF4y2Ba报告gydF4y2Ba- dgydF4y2BawithClassgydF4y2Ba
代码生成成功:要查看报告,打开('withClass/html/report.mldatx')gydF4y2Ba

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

cfg = coder.config (gydF4y2Ba“自由”gydF4y2Ba);cfg。GenCodeOnly = true;cfg。TargetLang =gydF4y2Ba“c++”gydF4y2Ba;codegengydF4y2BafooggydF4y2Ba配置gydF4y2BacfggydF4y2Ba报告gydF4y2Ba- dgydF4y2BawithoutClassgydF4y2Ba
代码生成成功:要查看报告,打开('withoutClass/html/report.mldatx')gydF4y2Ba

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

类型gydF4y2BawithClass / / main.cpp例子gydF4y2Ba

生成代码中的类定义和实现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 = int32 200000gydF4y2Ba

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

cfg = coder.config (gydF4y2Ba“自由”gydF4y2Ba,gydF4y2Ba“是”gydF4y2Ba、假);cfg。GenCodeOnly = true;cfg。TargetLang =gydF4y2Ba“c++”gydF4y2Ba;cfg。CppInterfaceStyle =gydF4y2Ba“方法”gydF4y2Ba;cfg。CppInterfaceClassName =gydF4y2Ba“myBigClass”gydF4y2Ba;codegengydF4y2BafoogBiggydF4y2Ba配置gydF4y2BacfggydF4y2Ba报告gydF4y2Ba- dgydF4y2BawithBigClassgydF4y2Ba
代码生成成功:要查看报告,打开('withBigClass/html/report.mldatx')gydF4y2Ba

检查生成的接口类定义gydF4y2Ba

检查类的定义gydF4y2BafoogBiggydF4y2Ba项目和gydF4y2BafooggydF4y2Ba.的gydF4y2BafoogBiggydF4y2Ba类在私有类属性中存储可以超过最大堆栈使用量的变量,而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设置输出变量gydF4y2Ba阿宝=双(p);去=双(g);gydF4y2Ba

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

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

全球gydF4y2Bag;g = 0;gydF4y2Ba

在被调用的类中生成代码gydF4y2BacountClassgydF4y2Ba.gydF4y2Ba

cfg = coder.config (gydF4y2Ba“自由”gydF4y2Ba);cfg。GenCodeOnly = true;cfg。TargetLang =gydF4y2Ba“c++”gydF4y2Ba;cfg。CppInterfaceStyle =gydF4y2Ba“方法”gydF4y2Ba;cfg。CppInterfaceClassName =gydF4y2Ba“countClass”gydF4y2Ba;codegengydF4y2BacountCallsgydF4y2Ba配置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

函数gydF4y2Ba阿宝= countPersistentgydF4y2Ba% # codegengydF4y2Ba增量持久化变量gydF4y2Ba持续的gydF4y2BapgydF4y2Ba如果gydF4y2BaIsempty (p) p = 0;gydF4y2Ba结束gydF4y2Bap = p + 1;gydF4y2Ba设置输出变量gydF4y2Ba阿宝=双(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。CppInterfaceStyle =gydF4y2Ba“方法”gydF4y2Ba;cfg。CppInterfaceClassName =gydF4y2Ba“countClassMulti”gydF4y2Ba;codegengydF4y2BacountGlobalgydF4y2BacountPersistentgydF4y2Ba配置gydF4y2BacfggydF4y2Ba报告gydF4y2Ba全局变量gydF4y2Ba{' g ', 0}gydF4y2Ba
代码生成成功:要查看报告,打开('codegen/lib/countGlobal/html/report.mldatx')gydF4y2Ba

检查生成的代码gydF4y2Ba

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

类型gydF4y2Bacodegen / lib / countGlobal / countClassMulti.hgydF4y2Ba

另请参阅gydF4y2Ba

相关的话题gydF4y2Ba