2017-09-28 23 views
1

Matlab関数ハンドルをC++関数ポインタと互換性を持たせることはできますか?私はMatlabからC++関数ポインタを取り込むC++関数を呼び出そうとしています。たとえば、次のようにMatlab関数ハンドルとC++関数ポインタ

C++:

void Cfunction(C++functionPointer); 

Matlabの:

function out Mfunction(functionHandle) 
    out= Cfunction(functionHandle) 

それは機密であるため、残念ながら、私はコードを投稿することはできません。ですから、私はMatlabプログラムでcalllib()を使ってC++関数を呼びたいと思っています。 C++関数のパラメータの1つが関数ポインタです。 Matlabでは、私はcallibのパラメータとしてMatlab関数ハンドルを使ってみましたが、これはうまくいきませんでした。したがって、私はMatlabからC++関数を呼び出すのが難しいです。

Matlabは、C++コンパイラがポインタ引数としてMatlab関数のハンドル型を受け入れないと言っています。

おかげ

+0

MEX APIについて読んでください。 –

+0

'funcionHandle'とは何ですか?あなたのC++プログラムでMatlab関数を呼びたいのですか? C++コードをコンパイルするための手順やMatlabシェルから 'Mfunction'を呼び出す方法など、完全な例を提供した方がより役に立ちます。 – giusti

+0

ちょうど編集された質問、ありがとう – 54321

答えて

2

[OK]を、ので、私が理解から、あなたは機能をC++で書かれたライブラリを持っているあなたが実行すること旧姓(私はfunctionFromMyCppLibraryそれを呼びましょう)。この関数が必要とする引数の1つに、関数ポインタがあります。

私はこの関数ポインタがC++関数でなければならないと仮定しています。 functionFromMyCppLibraryが任意のMatlab関数を呼び出す必要がある場合、私の答えは適用されません。しかし、Mathworksの交換にQ & Aがあります。役立つ情報はHow do I pass function handles to C++ mex function in MATLAB 7.8 (R2009a)?です。 CppFunctionをMatlabコールfevalに変更する必要があります。 CppFunction()にMatlabの関数名をハードコードすることができれば、実際にはより簡単になります。

callTheCppThing.cpp

#include "mex.h" 
#include "myCppLibrary.h" 

void CppFunction() 
{ 
    // The function your C++ library requires as a function pointer 
    // You could use mexCallMATLAB here to call a Matlab function, 
    // but it will get trickier if you can't hard-code the name of 
    // the Matlab function here 
} 

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, mxArray *prhs[]) 
{ 
    // Process however you need the arguments 
    functionFromMyCppLibrary(CppFunction); 

    // Create the output variables and return whatever Matlab needs 
} 

あなたは

mex callTheCppThing.cpp 

(あなたのライブラリーを++、このCをリンクするために必要とされ、このコマンドライン何にも追加。)

でコンパイルすることができますし、呼び出しますMatlabから

callTheCppThing 

これは、MatlabがC++ライブラリにどんな種類のハンドルを渡す必要もなくなります。 (C++で別のラッパーを記述する可能性がない場合は、MathworksのリンクされたQ & Aをチェックしてください)難しいですが可能です。

+0

私はあなたの応答をありがとう。ありがとうございました!しかし、あなたが与えた例を参照すると、CppFunctionはMatlab関数です。したがって、C++ライブラリの私の 'mexFunction'は、Matlabの 'CppFunction'を参照できる必要があります。したがって、Matlabの関数ハンドルです。これが意味をなさないことを願って、もう一度感謝します。 – 54321

+0

私は関数ハンドルにlibpointerを設定することを考えていましたが、それは動作しません。 – 54321

+0

'CppFunction()'が 'mexCallMATLAB'を使ってMatlab関数を呼び出すようにするのも一つの可能​​性です。しかし、いくつかの制限があります。例えば、Matlab関数は名前で指定されます。関数に引数を渡すことも地獄です。私はあなたに最も基本的な例しか与えません。 – giusti