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

标签 c matlab matlab-coder

我有一些用 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* + 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 Coder 将 C char 数组转换为 Matlab 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39000799/

相关文章:

c - 文件描述符,open() 返回零

Matlab - 在 x 轴上标记特定值

c - 数组和 matlab 编码器的问题

c++ - MATLAB编码器: sparse matrix

C: 类型定义不完整 'struct date' 错误

c - 如何向 Makefile 添加 header ?

arrays - 将元胞数组的内容作为单独的输入参数传递给 MATLAB 中的函数

r - 在 R 中通过数组索引向量

c# - Matlab Coder - 从 .m 文件生成 EXE

由 cron 运行时的 C sleep 方差