主要内容

coder.opaque

在生成的代码中声明变量

描述

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

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

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

  • y可以是:

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

    • 输入或输出参数coder.ceval

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

    • 输入MATLAB工具箱的一个子集函数,支持代码生成万博1manbetx

  • 分配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'调用的结果如果x2 == x1 y = 0;其他的y = 1;结束结束

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

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

编写MATLAB函数

函数缓冲=鱼片% # codegen% Declare 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);i = 1:元素个数(缓冲)如果buffer(i) ~= char(13) buffer(j) = buffer(i);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,函数强制转换nC类型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_tnsizet =投(n,“喜欢”coder.opaque (“size_t”,' 0 '));%返回值是intretval = coder.opaque (“int”);retval = coder.ceval (“strncmp”if cstr(s1), cstr(s2), nsizet);%将不透明的返回值转换为MATLAB值y =投(retval,“int32”);%--------------函数sc =装运箱(s)% NULL终止C的MATLAB字符向量sc = [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键入通过分配支持副本万博1manbetx

  • 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

    % Declare fp1的类型为FILE *fp1 = 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');

    你也可以用B =投(“喜欢”,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 ');(x, 'like', x1));

    使用coder.opaque要为下列对象生成正确的数据类型:

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

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

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

介绍了R2011a