在生成的代码中声明变量
y = coder.opaque (
声明一个变量类型
)y
使用所生成的代码中的指定类型和初始值。
y
可以是变量或结构字段。
MATLAB®代码无法设置或访问y
,但外部C函数可以接受y
作为参数。
y
可以是:
参数coder.rref
,coder.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 (___,'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
字符串的字符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中的值%% # 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工作空间中,你可以看到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
.变量必须具有相同的类型。下面的示例演示如何比较这些变量。比较使用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
.
如果没有这种强制转换,就可能在代码生成期间收到编译器警告。