在生成的代码中声明变量
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 (___,'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
字符串中的字符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_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工作空间中,您可以看到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
。
% 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
。
如果没有这种类型转换,就可能在代码生成期间接收编译器警告。