主要内容

coder.opaque

在生成的代码中声明变量

描述

y = coder.opaque (类型声明一个变量y使用指定的类型,并且在生成的代码中没有初始值。

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

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

  • y可以是:

    • 参数Coder.Rref.coder.wref,或coder.ref

    • 输入或输出参数coder.ceval

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

    • 输入代码生成支持的MATLAB工具箱功能的子集金宝app

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

    y =编码器。呼一('int');z = y;
    声明一个变量Z.类型int在生成的代码中。

  • 你可以分配y从使用的另一个变量使用coder.opaque或者从使用的变量分配coder.opaque.变量必须具有相同的类型。

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

例子

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

例子

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

例子

y = coder.opaque (___“HeaderFile”,标题文件指定包含类型定义的头文件。代码生成器产生#包括标题文件的语句在生成的代码中需要语句。您可以使用任何先前的语法指定标题文件。

例子

声明可变指定初始值

为函数生成代码valtest哪个退货1如果召唤myfun是成功的。此功能使用coder.opaque声明变量x1用类型int和初始价值0..那作业x2 = x1声明x2类型和初始值为的变量x1

写一个功能valtest

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

声明指定初始值和头文件的变量

为MATLAB函数生成代码repetest.哪一个返回自己的源代码使用fopen /从文件中读/文件关闭.此功能使用coder.opaque声明存储文件指针的变量fopen /从文件中读/文件关闭.调用coder.opaque声明变量F用类型文件 *,初始值,头文件< stdio . h >

编写MATLAB函数repetest.

函数缓冲=鱼片% # codegen%用初始值'null表示“f”作为不透明类型的“文件*”%指定包含file *类型定义的头文件;f =编码器。呼一(“文件*”'空值''头球文件'' < stdio . h >”);%以二进制模式打开文件f = coder.ceval(fopen的,cstring('inetest.m'),装运箱(rb的));%从文件中读取,直到到达并放置文件的末尾%内容进入缓冲区n = int32 (1);我= int32 (1);缓冲=字符(0 (8192));尽管n> 0.%默认情况下,MATLAB转换常量值%在生成的代码中为双精度将%SO显式类型转换转换为INT32。n = coder.ceval (“吓坏”coder.ref(缓冲区(i)), int32 (1),...INT32(NUMER(缓冲区)),f);我= i + n;结尾Coder.CEVAL('fclose',F);缓冲= strib_cr(缓冲区);在MATLAB字符向量的末尾添加一个C终止字符'\0'函数y = cstring(x)y = [x char(0)];%删除所有字符13 (CR),但保留字符10 (LF)函数if (j = 1, j = 1, j = 1);为了i = 1:numel(缓冲区)如果Buffer (i) ~= char(13);J = J + 1;结尾结尾缓冲(i) = 0;

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

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

coder.opaque声明变量用类型文件 *和初始价值

null = coder.opaque(“文件*”'空值''头球文件'' < stdio . h >”);

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

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

比较变量。

如果ftmp == null.%错误条件结尾

使用声明的变量的类型强制转换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中的值% # codegen编码器.Cinclude(' < string.h >”);n = min(numel(s1),numel(s2));%转换为与size_t比较的字符数nsizet =投(n,“喜欢”coder.opaque (“size_t”'0'));%返回值为int类型Retval = Coder.opaque('int');retval = coder.ceval (“strncmp”, cstr(s1), cstr(s2), nsizet);%将不透明返回值转换为MATLAB值y =施放(retval,“int32”);%--------------函数sc = cstr(s)% NULL结束一个MATLAB字符向量为CSc = [s, char(0)];

生成MEX功能。

codegenCastopaque-  args.{空白(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

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

对于系统标题文件,请使用ANGLE括号。

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

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

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

如果省略尖括号或双引号,代码生成器将生成双引号。

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

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

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

提示

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

    y = coder.opaque ('int'那'0.2')

  • coder.opaque声明变量的类型。它不实例化变量。您可以在后面的MATLAB代码中使用它来实例化变量。在下面的例子中,赋值FP1.coder.ceval实例化FP1.

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

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

  • 您可以使用两个声明的变量进行比较coder.opaque或者从使用的变量分配coder.opaque.变量必须具有相同的类型。以下示例演示了如何比较这些变量。比较使用编码器声明的变量..opaque

  • 要避免生成代码中同一标题文件的多个夹杂物,请将标题文件括在条件预处理器语句中#ifndef.#万一.例如:

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

    施加一个宣布的变量coder.opaque到一个MATLAB类型,可以使用B =铸造(A,键入)句法。例如:

    x = coder.opaque (' size_t ', ' 0 ');x1 =施法(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 = coder.opaque (“size_t”那'0');X2 = cast(x, 'like', x1));

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

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

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

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

在R2011A介绍