Cライブラリにポインタを渡して値を受け取る方法

8 vues (au cours des 30 derniers jours)
masami hamaguchi
masami hamaguchi le 27 Fév 2018
c言語で作ったライブラリの関数を呼び出して、引数で渡したポインタに値を詰めて、 Mファイルの関数で受け取りたいのですが、どのような実装をすればよろしいでしょうか?  
【添付ファイル】
上記事象の発生するソースを添付しています。
cライブラリ(shrlibsample.mexw64))の関数 c_bufwrite() charポインタを引数で渡す。
cの関数内でポインタの中に値"abcde"を詰める。
 ⇒ M関数 wrap_bufwritepの中に値"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;
}

Réponses (2)

Mesbah
Mesbah le 1 Mar 2018
ライブラリー関数の返り値を現在の int 型の代わりに char* 型を返すように修正することが前提ですが、 loadlibrary 関数は char* 型をデフォルトでは cstring としてしまうようですので、 プロトタイプファイルで cstring の部分を stringPtr に変更した後 loadlibrary すれば、 対応可能かもしれません。
共有ライブラリ関数とMATLAB間の引数の受け渡しはやや複雑なため、 コード生成を絡む実用的な場面では、MEX の利用も含めて検討することをおすすめします。 こちらに関しまして、添付の例参考になると思います。

masami hamaguchi
masami hamaguchi le 13 Juin 2018
回答ありがとうございます

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!