在生成的代码中声明变量
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
.变量必须具有相同的类型。
为函数生成代码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
字符串的字符s1
和s2
.N
是较短字符串中的字符数。为。生成正确的C类型strncmp.
输入nsizet
,函数类型转换N
到C类型size_t.
并将结果赋给nsizet
.这个函数使用coder.opaque
要申报的nsizet
.在使用输出之前retval
从strncmp.
,函数类型转换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工作空间中,你可以看到y
是int32
.
声明y
是具有初始值0的4字节整数。
y = coder.opaque ('int'那'0'那“大小”4);
指定一个价值
它的类型是类型
指定。否则,生成的代码可以产生意外结果。例如,以下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
.
如果没有这种强制转换,就可能在代码生成期间收到编译器警告。