主要内容

MATLAB代码生成的类定义

为MATLAB生成高效的独立代码®类,您必须使用与在MATLAB环境中运行代码时不同的类。

有什么不同 更多的信息
一组受限制的语言特性。 语言的限制
有限的代码生成特性集。 代码生成功能与类不兼容
类属性的定义。 为代码生成定义类属性
句柄类的使用。

生成MATLAB句柄类和系统对象的代码

句柄类析构函数的代码生成

处理代码生成的对象限制

包含MATLAB句柄对象的全局变量不支持代码生成。金宝app N/A
不支持从内置MATLAB类继承。金宝app 不支持从内置MATLAB类继承金宝app

语言的限制

虽然为类的常见特性(如属性和方法)提供了代码生成支金宝app持,但仍有许多高级特性不受支持,例如:

  • 事件

  • 听众

  • 对象数组

  • 递归数据结构

    • 链表

  • 构造函数中的嵌套函数

  • Overloadable运营商subsref,subsassign,subsindex

    在MATLAB中,类可以定义自己版本的subsref,subsassign,subsindex方法。代码生成不支持对这些方法有自己定义的类。金宝app

  • 方法

    在MATLAB中,类有内置的静态方法,,它创建类的空数组。代码生成不支持此方法。金宝app

  • 下面的MATLAB句柄类方法:

    • addlistener

    • 情商

    • findobj

    • findpro

  • AbortSet属性的属性

代码生成功能与类不兼容

  • 您可以为使用类的入口点MATLAB函数生成代码,但不能直接为MATLAB类生成代码。

    例如,如果ClassNameA是一个类定义,你不能通过执行以下命令来生成代码:

    codegen ClassNameA

  • 句柄类对象不能是入口点函数的输入或输出。

  • 值类对象可以是入口点函数输入或输出。但是,如果值类对象包含句柄类对象,则值类对象不能是入口点函数输入或输出。句柄类对象不能是入口点函数的输入或输出。

  • 代码生成不支持句柄类的全局变量。金宝app

  • 代码生成不支持构造函数的多个输出。金宝app

  • 你不能在Simulink中使用类金宝app®信号、参数或数据存储存储器。

  • 代码生成不支持将值类的对象赋值给不可调属性。金宝app例如,obj.prop = v;是无效的道具不可调属性是和吗v是基于值类的对象。

  • 你不能用coder.extrinsic将一个类或方法声明为外部的。

  • 您不能将MATLAB类传递给coder.ceval。可以将类属性传递给coder.ceval

  • 如果属性具有get方法、set方法或验证器,或者是具有某些属性的System object™属性,则不能通过引用将属性传递给外部函数。看到某些属性不支持按引用传递金宝app

  • 的代码中使用类MATLAB函数块时,不能使用调试器查看类信息。

  • 如果对象具有重复的属性名称,并且代码生成器试图对该对象进行常量折叠,则代码生成可能会失败。对象使用时,代码生成器将对其进行常量折叠coder.const,或者当它是一个常数折叠的外部函数的输入或输出时。

    在以下情况下,子类的对象中会出现重复的属性名:

    • 子类有一个与父类的属性同名的属性。

    • 子类派生自多个父类,这些父类对属性使用相同的名称。

    有关MATLAB何时允许重复属性名的信息,请参见子类化多个类

为代码生成定义类属性

对于代码生成,您必须定义与在MATLAB环境中运行代码时不同的类属性:

  • 属性验证错误以错误消息结束模拟。要测试属性验证,最佳实践是在所有输入值范围内运行模拟。由C/ c++代码生成金宝app仿真软件编码器™不检测或报告属性验证错误。

  • 定义属性后,不要为其分配不兼容的类型。在尝试种植一个属性之前,不要使用它。

    在为代码生成定义类属性时,请考虑与定义变量时考虑的因素相同的因素。在MATLAB语言中,变量可以在运行时动态地改变它们的类、大小或复杂性,因此您可以使用相同的变量来保存不同的类、大小或复杂性的值。C和c++使用静态类型。在使用变量之前,为了确定它们的类型,代码生成器需要对每个变量进行完整的赋值。类似地,在使用属性之前,必须显式地定义它们的类、大小和复杂性。

  • 初始值:

    • 如果属性没有显式的初始值,则代码生成器假定在构造函数的开头未定义该属性。代码生成器不会将空矩阵赋值为默认值。

    • 如果属性没有初始值,并且代码生成器无法确定该属性在首次使用之前是否已被分配,则软件将生成编译错误。

    • 对于System对象,如果不可调优属性是一个结构,则必须完全分配该结构。不能使用下标进行部分赋值。

      例如,对于不可调属性,您可以使用以下赋值:

      mySystemObject.nonTunableProperty =结构(‘基坑’,‘‘,‘fieldB’,' b ');

      不能使用以下部分赋值:

      mySystemObject.nonTunableProperty.fieldA = 'a';mySystemObject.nonTunableProperty.fieldB = 'b';

    • coder.varsize类属性不支持。金宝app

    • 如果属性的初始值是一个对象,那么该属性必须是常量。要使属性成为常量,请声明常数属性块中的。例如:

      classdefMyClass属性(常数)p1 = MyClass2;结束结束

    • 在代码生成之前,MATLAB在类加载时计算类的初始值。如果在MATLAB类属性初始化中使用持久变量,则类加载时计算的持久变量的值属于MATLAB;它不是在代码生成时使用的值。如果你使用coder.target在MATLAB中进行类属性初始化;coder.target (MATLAB)返回真正的(1)

  • 适应可变属性:

    • 代码生成支持值和句柄类的上界和无金宝app界可变大小属性。

    • 若要生成无界可变大小的类属性,请启用动态内存分配。

    • 若要创建可变大小的类属性,请对类属性进行两次连续赋值,一次赋值给标量,另一次赋值给数组。

      classdefvarSizeProp1 <句柄属性道具varProp结束结束
      函数extFunc(n) obj = varSizeProp1;将标量值分配给属性。obj.prop= 1; obj.varProp = 1;将数组分配给相同的属性以使其大小可变。obj.prop= 1:98; obj.varProp = 1:n;结束

      的第一个赋值道具varProp是标量,它们的第二次赋值是赋给具有相同基类型的数组。的大小道具上界是98,使其成为上界可变大小的属性。

      如果n在编译时未知,obj.varProp是无界可变大小属性。如果已知,则它是上界可变大小的类属性。

    • 如果类属性是用可变大小数组初始化的,则该属性是可变大小的。

      classdefvarSizeProp2属性道具结束方法函数obj = varSizeProp2(inVar)将传入值赋给局部变量locVar = inVar;将局部变量声明为可变大小的列没有大小限制的%向量coder.varsize (“locVar”,[inf],[10]);%赋值obj.prop= locVar;结束结束结束

      在前面的代码中,不胀钢传递给类构造函数并存储在locVarlocVar被修改为可变大小coder.varsize并赋值给类属性obj.prop,这使得属性大小可变。

      • 如果输入函数调用varSizeProp2适应,coder.varsize不是必需的。

        函数z = constructCall(n) z = varSizeProp2(1:n);结束
      • 的值n在编译时未知并且没有指定的边界,z.prop是一个无界可变大小的类属性。

      • 的值n在编译时未知,并且具有指定的边界,z.prop是上界可变大小的类属性。

  • 如果属性是常量且其值是对象,则不能更改该对象的属性值。例如,假设:

    • obj是的对象myClass1

    • myClass1有一个常数属性p1那是…的对象myClass2

    • myClass2有一个属性p2

    代码生成不支持以下代码:金宝app

    obj.p1。P2 = 1;

从内置继承MATLAB不支持的类金宝app

您不能为从内置MATLAB类继承的类生成代码。例如,不能为以下类生成代码:

classdefMyclass < double

这个规则的一个例外是MATLAB枚举类。您可以为继承内置MATLAB类的枚举类生成代码。看到枚举的代码生成(MATLAB编码器)