簡體   English   中英

使用Matlab Coder將C char數組轉換為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字符串,以便可以從函數中返回它?

該代碼是這樣的:

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字符串? 還是有一種更好的方式來做我想做的事情?

這有點浪費,但是您可以分配一個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大小為+1或-1,具體取決於len是否將NULL終止符計數以及是否需要。

如果您可以在調用_cfun之前弄清楚len ,則可以將mlbuf傳遞給_cfun並忘記該副本。

生成的代碼使用0索引並產生無限循環,因為就Coder而言, buf是1比1 coder.opaque 如果生成並運行了MEX文件,則會出現索引越界錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM