主要内容GydF4y2Ba

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

生成C代码时,软件会分析您的MATLABGydF4y2Ba®GydF4y2Ba编码并生成与入口点MATLAB函数对应的入口点C函数。生成C++代码时,可以选择在C++类中生成入口点函数作为方法。使用此选项:GydF4y2Ba

  • 您可以获得更多面向对象的代码。GydF4y2Ba

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

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

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

您可以从命令行或从GydF4y2BaMATLAB编码器™GydF4y2Ba在命令行中,使用GydF4y2BaCppInterfaceStyleGydF4y2Ba和GydF4y2BaCPPCInterfaceClassNameGydF4y2Ba配置参数。从应用程序,在GydF4y2Ba生成代码GydF4y2Ba步骤中,选择GydF4y2Ba语言GydF4y2Ba像GydF4y2BaC++GydF4y2Ba选择GydF4y2Ba界面风格GydF4y2Ba像GydF4y2Ba方法GydF4y2Ba,然后指定GydF4y2Bac++接口类名GydF4y2Ba.GydF4y2Ba

这些示例展示了命令行工作流。GydF4y2Ba

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

这个例子展示了在使用类接口时生成的C++代码是如何不同的。GydF4y2Ba

MATLAB算法GydF4y2Ba

考虑一个简单的Matlab函数,它在矩阵上执行运算并输出结果。GydF4y2Ba

函数GydF4y2Baout=foogGydF4y2Ba%#编码基因GydF4y2BaI=眼(447);外=眼(447)*I+7;GydF4y2Ba

生成c++代码,有或没有类接口GydF4y2Ba

要生成带有类接口的c++代码,请使用GydF4y2BaCppInterfaceStyleGydF4y2Ba和GydF4y2BaCPPCInterfaceClassNameGydF4y2Ba参数。将输出存储在GydF4y2Ba同级GydF4y2Ba文件夹GydF4y2Ba

cfg=coder.config(GydF4y2Ba“lib”GydF4y2Ba);cfg。GenCodeOnly = true;cfg。TargetLang =GydF4y2Ba“C++”GydF4y2Ba;cfg。CppInterfaceStyle =GydF4y2Ba“方法”GydF4y2Ba; cfg.cppcInterfaceClassName=GydF4y2Ba“myClass”GydF4y2Ba;编码基因GydF4y2Ba福格GydF4y2Ba-配置GydF4y2BacfgGydF4y2Ba报告GydF4y2Ba- dGydF4y2Ba同级GydF4y2Ba
代码生成成功:要查看报告,请打开('withClass/html/report.mldatx')。GydF4y2Ba

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

cfg=coder.config(GydF4y2Ba“lib”GydF4y2Ba);cfg。GenCodeOnly = true;cfg。TargetLang =GydF4y2Ba“c++”GydF4y2Ba;编码基因GydF4y2Ba福格GydF4y2Ba-配置GydF4y2BacfgGydF4y2Ba报告GydF4y2Ba- dGydF4y2BawithoutClassGydF4y2Ba
代码生成成功:要查看报告,请打开('withoutClass/html/report.mldatx')。GydF4y2Ba

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

类型GydF4y2BawithClass / / main.cpp例子GydF4y2Ba

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

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

要探索生成的类实现,请修改函数GydF4y2Ba福格GydF4y2Ba使其包含的变量超过配置参数指定的最大堆栈使用量GydF4y2BaStackUsageMaxGydF4y2Ba.GydF4y2Ba

函数GydF4y2Baout=foogBigGydF4y2Ba%#编码基因GydF4y2BaI=眼(448);外=眼(448)*I+7;GydF4y2Ba

的默认值GydF4y2BaStackUsageMaxGydF4y2Ba以字节为单位是:GydF4y2Ba

StackUsageMaxGydF4y2Ba
Ans = int32 200000GydF4y2Ba

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

cfg=coder.config(GydF4y2Ba“lib”GydF4y2Ba,GydF4y2Ba“ecoder”GydF4y2Ba,假);cfg.GenCodeOnly=true;cfg.TargetLang=GydF4y2Ba“C++”GydF4y2Ba;cfg。CppInterfaceStyle =GydF4y2Ba“方法”GydF4y2Ba; cfg.cppcInterfaceClassName=GydF4y2Ba“myBigClass”GydF4y2Ba;编码基因GydF4y2BafoogBigGydF4y2Ba-配置GydF4y2BacfgGydF4y2Ba报告GydF4y2Ba- dGydF4y2BawithBigClassGydF4y2Ba
代码生成成功:要查看报告,打开('withBigClass/html/report.mldatx')。GydF4y2Ba

检查生成的接口类定义GydF4y2Ba

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

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

生成的C++类中的全局变量和持久性GydF4y2Ba

当生成具有类接口的C++代码时,您将访问全局和持久性作为类的成员。这个示例演示如何与类中的全局和持久性进行交互。GydF4y2Ba

MATLAB算法GydF4y2Ba

考虑一个MATLAB函数,它记录使用全局和持久变量调用它的次数。GydF4y2Ba

函数GydF4y2Ba[po,go]=countCallsGydF4y2Ba%#编码基因GydF4y2Ba%增量持久化和全局变量GydF4y2Ba持久的GydF4y2BaPGydF4y2Ba全球的GydF4y2BaGGydF4y2Ba如果GydF4y2BaIsempty (p) p = 0;GydF4y2Ba终止GydF4y2Bap=p+1;g=g+1;GydF4y2Ba设置输出变量GydF4y2Ba阿宝=双(p);go=双倍(g);GydF4y2Ba

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

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

全球的GydF4y2Bag;g = 0;GydF4y2Ba

在被调用的类中生成代码GydF4y2BacountClassGydF4y2Ba.GydF4y2Ba

cfg=coder.config(GydF4y2Ba“lib”GydF4y2Ba);cfg。GenCodeOnly = true;cfg。TargetLang =GydF4y2Ba“C++”GydF4y2Ba;cfg。CppInterfaceStyle =GydF4y2Ba“方法”GydF4y2Ba; cfg.cppcInterfaceClassName=GydF4y2Ba“countClass”GydF4y2Ba;编码基因GydF4y2Ba倒计时GydF4y2Ba-配置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

打破这个函数GydF4y2Ba倒计时GydF4y2Ba在前面的例子中,将调用分为两个函数,一个函数使用持久变量计算调用数,另一个函数使用全局变量计算调用数。检查这两个功能。GydF4y2Ba

函数GydF4y2Ba阿宝= countPersistentGydF4y2Ba%#编码基因GydF4y2Ba%增量持久变量GydF4y2Ba持久的GydF4y2BaPGydF4y2Ba如果GydF4y2BaIsempty (p) p = 0;GydF4y2Ba终止GydF4y2Bap = p + 1;GydF4y2Ba%设置输出变量GydF4y2Ba阿宝=双(p);GydF4y2Ba
函数GydF4y2Bago=全球计数GydF4y2Ba%#编码基因GydF4y2Ba增量全局变量GydF4y2Ba全球的GydF4y2BaG = G +1;GydF4y2Ba%设置输出变量GydF4y2Bago=双倍(g);GydF4y2Ba

生成c++代码GydF4y2Ba

使用GydF4y2Ba编码基因GydF4y2Ba命令并指定初始全局变量值作为输入。GydF4y2Ba

cfg=coder.config(GydF4y2Ba“lib”GydF4y2Ba);cfg。GenCodeOnly = true;cfg。TargetLang =GydF4y2Ba“C++”GydF4y2Ba;cfg。CppInterfaceStyle =GydF4y2Ba“方法”GydF4y2Ba; cfg.cppcInterfaceClassName=GydF4y2Ba“countClassMulti”GydF4y2Ba;编码基因GydF4y2BacountGlobalGydF4y2BacountPersistentGydF4y2Ba-配置GydF4y2BacfgGydF4y2Ba报告GydF4y2Ba全局变量GydF4y2Ba{' g ', 0}GydF4y2Ba
代码生成成功:要查看报告,请打开('codegen/lib/countGlobal/html/report.mldatx')。GydF4y2Ba

检查生成的代码GydF4y2Ba

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

类型GydF4y2Bacodegen / lib / countGlobal / countClassMulti.hGydF4y2Ba

另见GydF4y2Ba

相关的话题GydF4y2Ba