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

Posted

技术标签:

【中文标题】使用 Matlab Coder 将 C 字符数组转换为 Matlab 字符串【英文标题】:Converting a C char array into a Matlab String using Matlab Coder 【发布时间】:2016-08-17 15:32:01 【问题描述】:

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

我编写了一个 C 函数,我想从生成的 C 代码中调用它。这行得通,到目前为止一切顺利。

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

我通过制作一个不透明的 char* 并使用 coder.wref 来获取 char** 来实现这一点。但是如何将不透明的 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 字符串?还是有更好的方法来做我想做的事?

【问题讨论】:

很好奇,为什么 Llength + 1L; 和 C 代码中的所有转换?最好发布i18, length, copyfrom, i, source_str, buf 的定义,看看发生了什么。就目前的帖子而言,我觉得不清楚。 这是从 Matlab 生成的代码。所以 L 和演员表是 Matlab 的决定。我认为 L 是为了避免和检查整数溢出(我在代码中删除了一些检查)。除非您想开始调试为什么没有正确生成 for 循环,否则这些定义并不重要。但下面的答案有效,所以我不会花更多时间在上面。 【参考方案1】:

有点浪费,不过你可以分配一个MATLABchar数组和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 文件并运行它,您会得到一个索引越界错误。

【讨论】:

这行得通,谢谢!在调用_cfun 之前,我无法弄清楚len,但它是这样工作的,所以这很完美。

以上是关于使用 Matlab Coder 将 C 字符数组转换为 Matlab 字符串的主要内容,如果未能解决你的问题,请参考以下文章

将 C 字符数组转换为 Matlab 字符串 [Matlab 编码器]

在 MATLAB Coder 中创建用于指定数组大小的常量

MATLAB Coder:截断/连接元胞数组

无法使用 Matlab Coder 将 Matlab 代码转换为 C 代码

使用 Matlab Coder 将 Matlab m 文件转换为 C/C++ 代码,包括 mex 文件 (mxArray)

在 MATLAB coder 中使用自定义 C 结构体