使用 Matlab Coder 将 C 字符数组转换为 Matlab 字符串
Converting a C char array into a Matlab String using Matlab Coder
我有一些用 Matlab 编写的代码,我正在使用 Matlab Coder 将其转换为 C 代码。
我已经编写了一个 C 函数,我想从生成的 C 代码中调用它。这有效,到目前为止一切顺利。
问题是 C 函数的参数之一是用于输出字符串的 char**。
我通过制作一个不透明的 char* 并使用 coder.wref 来获取 char** 来实现这一点。但是我如何将不透明的 char* 转换为 Matlab 字符串,以便我可以 return 从我的函数中得到它?
代码是这样的:
function [status,out] = cfun()
buf = coder.opaque('char *', 'NULL');
len = coder.opaque('size_t ', 'NULL');
status = 0;
status = coder.ceval('_cfun', coder.wref(buf), coder.wref(len));
out = buf; % How do I convert buf into a Matlab string here??
end
_cfun 会写入一些数据到buf,并将长度写入len。
我目前几乎可行的解决方案是在Matlab中手动制作一个char数组并传输到数据。像这样:
length = cast(len, 'int32');
out = char(zeros(1,length+1));
for i = 1:(length+1)
out(i) = cast(buf(i), 'int32');
end
由此生成的 C 代码毫无意义并无限循环,但我可以手动更新它来工作。但是,每次我重新运行代码生成时,这都需要手动更新。
C 代码如下所示:
i18 = length + 1L;
copyfrom = (int)i18;
i = 1;
while (i <= copyfrom) {
source_str->data[0] = (signed char)(int)buf;
i = 2;
}
我可以更新它来工作:
i18 = length + 1L;
copyfrom = (int)i18;
i = 1;
while (i <= copyfrom) {
source_str->data[i-1] = (signed char)(int)(buf[i-1]);
i = i+1;
}
那么,有没有办法将char* + length转换成Matlab字符串呢?还是有更好的方法来做我想做的事情?
这有点浪费,但你可以分配一个 MATLAB char
数组并将 memcpy
数据放入其中:
mllen = cast(len,'int32'); % or int64
mlbuf = blanks(mllen); % allocate character vector
coder.ceval('memcpy',coder.wref(mlbuf),buf,len);
use(mlbuf);
根据 len
是否计入 NULL 终止符以及您是否需要,您可能希望在大小上获得 +1 或 -1。
如果你能以某种方式在调用 _cfun
之前弄清楚 len
那么你可以将 mlbuf
传递给 _cfun
而忘记副本。
生成的代码使用 0 进行索引并产生无限循环,因为就 Coder 而言,buf
是 1×1 coder.opaque
。如果您生成了一个 MEX 文件并且 运行 它,您将得到一个索引越界错误。
我有一些用 Matlab 编写的代码,我正在使用 Matlab Coder 将其转换为 C 代码。
我已经编写了一个 C 函数,我想从生成的 C 代码中调用它。这有效,到目前为止一切顺利。
问题是 C 函数的参数之一是用于输出字符串的 char**。
我通过制作一个不透明的 char* 并使用 coder.wref 来获取 char** 来实现这一点。但是我如何将不透明的 char* 转换为 Matlab 字符串,以便我可以 return 从我的函数中得到它?
代码是这样的:
function [status,out] = cfun()
buf = coder.opaque('char *', 'NULL');
len = coder.opaque('size_t ', 'NULL');
status = 0;
status = coder.ceval('_cfun', coder.wref(buf), coder.wref(len));
out = buf; % How do I convert buf into a Matlab string here??
end
_cfun 会写入一些数据到buf,并将长度写入len。
我目前几乎可行的解决方案是在Matlab中手动制作一个char数组并传输到数据。像这样:
length = cast(len, 'int32');
out = char(zeros(1,length+1));
for i = 1:(length+1)
out(i) = cast(buf(i), 'int32');
end
由此生成的 C 代码毫无意义并无限循环,但我可以手动更新它来工作。但是,每次我重新运行代码生成时,这都需要手动更新。
C 代码如下所示:
i18 = length + 1L;
copyfrom = (int)i18;
i = 1;
while (i <= copyfrom) {
source_str->data[0] = (signed char)(int)buf;
i = 2;
}
我可以更新它来工作:
i18 = length + 1L;
copyfrom = (int)i18;
i = 1;
while (i <= copyfrom) {
source_str->data[i-1] = (signed char)(int)(buf[i-1]);
i = i+1;
}
那么,有没有办法将char* + length转换成Matlab字符串呢?还是有更好的方法来做我想做的事情?
这有点浪费,但你可以分配一个 MATLAB char
数组并将 memcpy
数据放入其中:
mllen = cast(len,'int32'); % or int64
mlbuf = blanks(mllen); % allocate character vector
coder.ceval('memcpy',coder.wref(mlbuf),buf,len);
use(mlbuf);
根据 len
是否计入 NULL 终止符以及您是否需要,您可能希望在大小上获得 +1 或 -1。
如果你能以某种方式在调用 _cfun
之前弄清楚 len
那么你可以将 mlbuf
传递给 _cfun
而忘记副本。
生成的代码使用 0 进行索引并产生无限循环,因为就 Coder 而言,buf
是 1×1 coder.opaque
。如果您生成了一个 MEX 文件并且 运行 它,您将得到一个索引越界错误。