文档

coder.opaque

在生成的代码中声明变量

描述

y = coder.opaque (类型声明一个变量y使用所生成的代码中的指定类型和初始值。

  • y可以是变量或结构字段。

  • MATLAB®代码无法设置或访问y,但外部C函数可以接受y作为参数。

  • y可以是:

    • 参数coder.rrefcoder.wref,或coder.ref

    • 输入或输出参数coder.ceval

    • 用户编写的MATLAB函数的输入或输出参数

    • 输入一个子集的MATLAB工具箱函数,支持代码生成金宝app

  • 分配y在生成的代码中声明另一个具有相同类型的变量。例如:

    y = coder.opaque (int);z = y;
    声明一个变量z类型的在生成的代码中。

  • 你可以分配y从使用其中之一声明的另一个变量coder.opaque或使用声明的变量赋值coder.opaque.变量必须具有相同的类型。

  • 你可以比较y转换为另一个使用其中之一声明的变量coder.opaque或使用声明的变量赋值coder.opaque.变量必须具有相同的类型。

例子

y = coder.opaque (类型价值的类型和初始值y

例子

y = coder.opaque (___,'尺寸',大小的大小(以字节为单位)y.您可以使用前面的任何语法指定大小。

例子

y = coder.opaque (___,'headerfile',HeaderFile指定包含类型定义的头文件。代码生成器生成# include语句用于头文件,在生成的代码中需要该语句。您可以使用前面的任何语法指定头文件。

例子

声明指定初始值的变量

为函数生成代码valtest它返回1如果呼叫myfun是成功的。这个函数使用coder.opaque声明一个变量x1和初始值0.赋值x2 = x1声明x2是一个与类型和初始值的变量x1

写一个函数valtest

函数y = valtest% codegen%声明x1为一个初始值为“0”的整数x1 =码码。opaque(“int”' 0 ');声明x2具有与x1相同的类型和初始值x1, x2 =x2 = coder.ceval (“myfun”);%通过比较x1的值来测试调用'myfun'的结果如果x = x y = 0;其他的y = 1;结束结束

声明可变指定初始值和标题文件

为一个MATLAB函数生成代码哪一个返回自己的源代码使用fopen /从文件中读/文件关闭.这个函数使用coder.opaque声明用于存储文件指针的变量fopen /从文件中读/文件关闭.呼吁coder.opaque声明的变量f文件*,初始值,头文件< stdio . h >

编写MATLAB函数

函数缓冲=鱼片% # codegen%声明'f'为不透明类型'FILE *',初始值为'NULL '%指定包含“文件*”类型定义的标题文件;f = coder.opaque ('文件 *'“零”“HeaderFile”'');%以二进制模式打开文件f = coder.ceval (fopen的装运箱(“filetest.m”),cstring(rb的));%从文件中读取,直到到达并放置文件的末尾%内容到缓冲区n = int32 (1);我= int32 (1);缓冲=字符(0 (8192));n > 0%默认情况下,MATLAB转换常量值%在生成的代码中为双精度%,因此插入显式的类型转换到int32。n = coder.ceval (从文件中读的,coder.ref(缓冲区(i)),int32(1),...int32(元素个数(缓冲),f);I = I + n;结束coder.ceval (“关闭”f);缓冲= strip_cr(缓冲);%在Matlab字符向量结束时放置C终止字符'\ 0'函数Y = cstring(x) Y = [x char(0)];%删除所有字符13(CR),但保持字符10(LF)函数if (j = 1, j = 1, j = 1);i = 1:元素个数(缓冲)如果Buffer (i) ~= char(13);J = J + 1;结束结束缓冲(i) = 0;

比较使用声明的变量coder.opaque

使用coder.opaque测试是否成功打开文件。

使用coder.opaque声明一个变量文件*和初始值

null = coder.opaque ('文件 *'“零”“HeaderFile”'');

使用赋值来声明另一个变量ftmp具有相同的类型和值

ftmp =零;ftmp = coder.ceval (fopen的, ('testfile.txt'char (0)], [“r”char (0)));

比较的变量。

如果ftmp = =零%错误条件结束

使用声明的变量的类型强制转换coder.opaque

这个例子展示了如何对使用声明的变量进行类型转换coder.opaque.这个函数castopaque调用C运行时函数strncmp至多比较n字符串的字符s1s2n是较短字符串中的字符数。为。生成正确的C类型strncmp输入nsizet,函数类型转换n到C类型size_t并分配结果nsizet.这个函数使用coder.opaque声明nsizet.在使用输出之前retvalstrncmp,函数类型转换retval到matlab类型INT32.并将结果存储在里面y

编写这个MATLAB函数:

函数y = castopaque (s1, s2)%<0  - 不匹配的第一个字符在S1中的值较低,而不是S2% 0 -两个字符串的内容相等% >0 -第一个不匹配的字符在s1中的值大于s2中的值% # codegencoder.cinclude (' < string.h >”);N = min(numel(s1), numel(s2));%转换要与size_t比较的字符数nsizet =投(n,“喜欢”coder.opaque (“size_t”' 0 '));%返回值是intretval = coder.opaque (“int”);retval = coder.ceval (“strncmp”, cstr(s1), cstr(s2), nsizet);%将不透明返回值转换为MATLAB值y =投(retval,“int32”);%--------------函数sc =装运箱(s)% NULL结束一个MATLAB字符向量为CSc = [s, char(0)];

生成MEX函数。

codegencastopaquearg游戏{空白(3),空格(3)}-报告

使用输入调用MEX函数“abc”“abc”

Castopaque_mex(“abc”“abc”
ans = 0

输出是0因为字符串是相等的。

使用输入调用MEX函数“abc”abd的

Castopaque_mex(“abc”abd的
ans = 1

输出是-1因为第三个字符d在第二个字符串中大于第三个字符c在第一个字符串中。

使用输入调用MEX函数abd的“abc”

Castopaque_mex(abd的“abc”
ans = 1

输出是1因为第三个字符d在第一个字符串中大于第三个字符c在第二个字符串中。

在MATLAB工作空间中,你可以看到yINT32.

声明变量指定初始值和大小

声明y初始值为0的4字节整数。

y = coder.opaque (“int”' 0 '“大小”4);

输入参数

全部折叠

生成代码中变量的类型。类型必须是编译时常量。类型必须是a:

  • 内置C数据类型或在头文件中定义的类型

  • C键入通过分配支持副本金宝app

  • C语言声明中的合法前缀

例子:'文件 *'

生成代码中变量的初始值。价值必须是编译时常量。指定一个不依赖于MATLAB变量或函数的C表达式。

如果您没有提供初始值价值,在使用变量之前初始化该变量的值。初始化使用声明的变量coder.opaque

  • 从另一个具有相同类型的变量中赋值coder.opaque或使用声明的变量赋值coder.opaque

  • 从外部C函数中赋值。

  • 使用命令将变量的地址传递给外部函数coder.wref

指定一个价值它的类型是类型指定。否则,生成的代码可能会产生意想不到的结果。

例子:“零”

生成代码中变量的字节数,指定为整数。如果不指定大小,则变量的大小为8字节。

数据类型:||int8|int16|INT32.|int64|uint8|uint16|uint32|uint64

定义的头文件的名称类型HeaderFile必须是编译时常量。

对于系统头文件,使用尖括号。

例子:''生成# include < stdio . h >

对于应用程序头文件,请使用双引号。

例子:“foo””生成# include“foo”

如果省略角度括号或双引号,则代码生成器会产生双引号。

例子:“foo”生成# include“foo”

在构建配置参数中指定包含路径。

例子:cfg。CustomInclude = ' c: \ myincludes '

提示

  • 指定一个价值它的类型是类型指定。否则,生成的代码可能会产生意想不到的结果。例如,下面coder.opaque声明可能会产生意想不到的结果。

    y = coder.opaque (“int”,'0.2')

  • coder.opaque声明变量的类型。它不会实例化变量。您可以通过在MATLAB代码中使用它来实例化变量。在以下示例中,分配fp1coder.ceval实例化fp1

    %声明类型为FILE *的fp1fp1 = coder.opaque ('文件 *');%创建变量fp1fp1 = coder.ceval(fopen的, ('testfile.txt'char (0)], [“r”char (0)));

  • 在MATLAB环境中,coder.opaque中指定的值价值.如果价值时,将返回空字符向量。

  • 您可以比较使用这两种方法声明的变量coder.opaque或使用声明的变量赋值coder.opaque.变量必须具有相同的类型。下面的示例演示如何比较这些变量。比较使用coder.opaque声明的变量

  • 为了避免在生成的代码中包含多个头文件,请将头文件包含在条件预处理器语句中#如果未定义# endif.例如:

    #ifndef myheader_h #define myheader_h  #endif
  • 你可以使用MATLAB函数将变量强制转换为使用coder.opaque.使用coder.opaque仅适用于数字类型。

    强制转换声明的变量coder.opaque到一个MATLAB类型,可以使用B =投(类型)语法。例如:

    x = coder.opaque (' size_t ', ' 0 ');X1 = cast(x, 'int32');

    你也可以用theB =投(“喜欢”,p)语法。例如:

    x = coder.opaque (' size_t ', ' 0 ');X1 = cast(x, 'like', int32(0));

    将MATLAB变量转换为声明的变量的类型coder.opaque,你必须使用B =投(“喜欢”,p)语法。例如:

    x = int32 (12);x1 =码码。opaque(“size_t”,' 0 ');X2 = cast(x, 'like', x1));

    使用coder.opaque生成正确的数据类型:

    • 您调用的C/ c++函数的输入coder.ceval

    • 赋值给调用C/ c++函数的输出的变量coder.ceval

    如果没有这种强制转换,就可能在代码生成期间收到编译器警告。

介绍了R2011a