将 MATLAB 类型映射到生成的代码中的类型
代码生成器在 C/C++ 中生成与您在 MATLAB® 代码中使用的数据类型对应的数据类型。生成的数据类型取决于目标平台和编译器。代码生成器既可以生成内置的 C 数据类型,如 short
、long
、int
等,也可以生成使用 C typedef
语句定义的自定义数据类型。默认情况下,代码生成器为独立代码(lib、dll 或 exe)生成内置类型,为 MEX 代码生成自定义类型。要使用内置 C 类型,请修改代码生成配置对象的 DataTypeReplacement
属性,或使用 MATLAB Coder™。有关详细信息,请参阅指定在生成的代码中使用的数据类型。
为了生成自定义 C/C++ 类型,代码生成器会在头文件 tmwtypes.h
中使用预定义的数据类型,该头文件位于 fullfile(matlabroot,'extern','include')
。代码生成器还可以基于对您的 MATLAB 代码的分析来生成自定义数据类型。自定义数据类型在位于代码生成目录中的文件 rtwtypes.h
和 myFunction_types.h
中定义。myFunction
是顶层函数的名称。代码生成器不能为 MATLAB 中存在的每种数据类型生成代码。请参阅 支持 C/C++ 代码生成的 MATLAB 语言功能。
当您不使用内置 C 数据类型时,代码生成器会生成以下数据类型:
MATLAB 数据类型 | 对应的自定义 C/C++ 数据类型 |
---|---|
logical | boolean_T |
char | char_T |
string | rtString |
int8 | int8_T |
int16 | int16_T |
int32 | int32_T |
int64 | int64_T |
uint8 | uint8_T |
uint16 | uint16_T |
uint32 | uint32_T |
uint64 | uint64_T |
single | real32_T |
double | real_T |
complex | 请参阅复数类型。 |
struct | 请参阅结构体类型。 |
fi | 请参阅定点类型。 |
当按引用传递变量时,对应的自定义数据类型使用解引用运算符。例如,当按引用传递时,int8
对应的自定义 C/C++ 数据类型为 int8_T*
。
动态分配的数组映射到自定义 emxArray_
类型。例如,动态分配的 char
数组将映射到 emxArray_char_T
类型。动态分配的双精度数组将映射到 emxArray_real_T
类型。例如,如果数组大小在编译时未知,或您使用 coder.varsize
创建了一个可变大小数组而没有指定显式上界,就会发生动态分配。有关可变大小数组的详细信息,请参阅在生成的函数接口中使用 C 数组。
复数类型
在 MATLAB 中,复/实性定义为数据类型的属性。下表列出了代码生成器用于 MATLAB 复数数据类型的预定义数据类型。
MATLAB 复数数据类型 | 对应的自定义 C/C++ 数据类型 |
---|---|
int8 | cint8_T |
int16 | cint16_T |
int32 | cint32_T |
int64 | cint64_T |
uint8 | cuint8_T |
uint16 | cuint16_T |
uint32 | cuint32_T |
uint64 | cuint64_T |
single | creal32_T |
double | creal_T |
代码生成器将每个复数值定义为具有实部 re
和虚部 im
的结构体。有关示例,请参阅 tmwtypes.h
中 creal32_T
的 typedef
:
typedef struct { real32_T re;/* Real component*/ real32_T im;/* Imaginary component*/ } creal32_T;
creal32_T
的变量 x
。生成的代码以 x.re
形式访问实部,以 x.im
形式访问虚部。如果您的 C/C++ 库需要不同的表示形式,您可以定义自己的 MATLAB Coder 复数类型版本,例如,通过使用 coder.cstructname
来定义。但是,在您的定义中,您必须对实部使用名称 re
,对虚部使用名称 im
。
有关详细信息,请参阅复数数据的代码生成。
结构体类型
MATLAB Coder 以逐字段方式将结构体映射到 C/C++ 类型。MATLAB 定义中的结构体字段的顺序保持不变。要控制生成的 C/C++ 结构体类型的名称,或提供定义,请使用 coder.cstructname
函数。如果不使用动态内存分配,结构体中的数组将转换为一维数组,而不是指针。有关详细信息,请参阅结构体。
定点类型
fi
对象的 numerictype
属性确定其 C/C++ 数据类型。默认情况下,代码生成器尝试使用内置 C/C++ 类型。但是,您可以选择改用自定义 C/C++ 数据类型。下表显示 Signedness
、WordLength
和 FractionLength
属性如何确定自定义 C/C++ 数据类型。自定义 C/C++ 数据类型是根据其字长选择的下一个更大的目标字长,该字长能够存储定点值。整数类型的符号与定点类型的符号匹配。
符号性 | 字长 | 小数长度 | 对应的自定义 C/C++ 数据类型 |
---|---|---|---|
1 | 8 | 7 | int8_T |
1 | 13 | 10 | int16_T |
1 | 16 | 15 | int16_T |
0 | 19 | 15 | uint32_T |
字符向量
MATLAB Coder 软件将 MATLAB 字符向量映射到 C/C++ 字符数组。这些字符数组不是 C/C++ 字符串,因为它们不以空值结尾。如果您将 MATLAB 字符向量传递给需要 C/C++ 字符串的外部 C/C++ 代码,则生成的 C/C++ 字符数组必须以空值结尾。要生成以空值结尾的 C/C++ 字符数组,请在 MATLAB 字符向量的末尾追加零。例如,['sample text' 0]
。否则,生成的需要字符串的代码可能会停止工作,而不会抛出编译器错误或警告。
多字类型
多字类型是当目标硬件无法以内置 C/C++ 类型存储您的 MATLAB 数据类型时生成的自定义类型。多字类型生成为包含整数数组的 C/C++ 结构体类型。数组维数取决于目标硬件上最宽整数类型的大小。
例如,对于 128 位定点类型,如果目标硬件上最宽的整数类型是 32 位,软件将生成一个结构体,该结构体包含一个由四个 32 位整数组成的数组。
typedef struct { unsigned int chunks[4]; } uint128m_T;
如果目标硬件上最宽的整数类型是大小为 64 位的 long
类型,代码生成器将生成一个结构体,该结构体包含一个由两个 64 位长类型组成的数组。
typedef struct { unsigned long chunks[2]; } uint128m_T;
从 64 位整数 MATLAB 类型生成的 C/C++ 数据类型取决于目标硬件上整数类型的大小。如果宽度足以存储 64 位的内置类型不存在,则 64 位 MATLAB Coder 类型将映射到自定义多字类型。
另请参阅
coder.cstructname
| coder.opaque