Cライブラリにポインタを渡して値を受け取る方法
6 views (last 30 days)
Show older comments
c言語で作ったライブラリの関数を呼び出して、引数で渡したポインタに値を詰めて、 Mファイルの関数で受け取りたいのですが、どのような実装をすればよろしいでしょうか?
【添付ファイル】
上記事象の発生するソースを添付しています。
・cライブラリ(shrlibsample.mexw64))の関数 c_bufwrite() にcharポインタを引数で渡す。
・cの関数内でポインタの中に値"abcde"を詰める。
⇒ M関数 wrap_bufwriteで pの中に値"abcde"が受け取れない
■Test_pointer\src_wrap\wrap_bufwrite.m
function [ ret ] = wrap_bufwrite( pbuf, bufsize ) %#codegen
ret = 0;
if coder.target('MATLAB')
p = libpointer('cstring', char(zeros(1,bufsize)));
ret = calllib('shrlibsample', 'c_bufwrite', p);
p.value; % 【問題箇所】"abcde"が詰まったpが受け取れない
% pの値をpbufに値を詰めて返したい
else
ret = coder.ceval('c_bufwrite', coder.wref(pbuf));
end
■Test_pointer\src_c\shrlibsample.c
/*
* charポインタを受け取り、"abcd"を詰めて復帰する
*/
EXPORTED_FUNCTION int c_bufwrite(char *buf)
{
buf = "abcde";
printf("%s\n", buf);
return 1;
}
0 Comments
Answers (2)
Mesbah
on 1 Mar 2018
ライブラリー関数の返り値を現在の int 型の代わりに char* 型を返すように修正することが前提ですが、 loadlibrary 関数は char* 型をデフォルトでは cstring としてしまうようですので、 プロトタイプファイルで cstring の部分を stringPtr に変更した後 loadlibrary すれば、 対応可能かもしれません。
共有ライブラリ関数とMATLAB間の引数の受け渡しはやや複雑なため、 コード生成を絡む実用的な場面では、MEX の利用も含めて検討することをおすすめします。 こちらに関しまして、添付の例参考になると思います。
0 Comments
See Also
Categories
Find more on MATLAB の C ライブラリ in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!