[英]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.