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

조회 수: 8 (최근 30일)
masami hamaguchi
masami hamaguchi 2018년 2월 27일
답변: masami hamaguchi 2018년 6월 13일
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;
}

답변 (2개)

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

masami hamaguchi
masami hamaguchi 2018년 6월 13일
回答ありがとうございます

카테고리

Help CenterFile Exchange에서 MATLAB の C ライブラリ에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!