使用Matlab Coder将C char数组转换为Matlab字符串

时间:2016-08-17 15:32:02

标签: c matlab matlab-coder

我有一些用Matlab编写的代码,我正在使用Matlab Coder转换成C代码。

我已经编写了一个C函数,我想从生成的C代码中调用它。到目前为止,这很有效。

问题是C函数的一个参数是用于输出字符串的char **。

我通过制作一个不透明的char *并使用coder.wref获取char **来实现这一目标。但是如何将opaque char *转换为Matlab字符串,以便从函数中返回它?

代码如下:

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 * +长度转换为Matlab字符串?或者有更好的方法来做我想做的事情吗?

1 个答案:

答案 0 :(得分:1)

这有点浪费,但您可以将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大小。

如果您在致电len之前能够以某种方式找出_cfun,那么您可以将mlbuf传递给_cfun并忘记复制。

生成的代码使用0进行索引并生成无限循环,因为就编码器而言,buf是1乘1 coder.opaque。如果生成MEX文件并运行它,则会得到索引超出范围的错误。