1

deloytool を使用して Matlab から C++ 共有ライブラリを作成し、MVS で使用したいと考えています。関数名 'foo.m' をコンパイルすると、ファイルのリスト (.h、.cpp、.lib、...) が得られ、'fooCpplib.h' の関数は次のようになります。

extern LIB_fooCpplib_CPP_API void MW_CALL_CONV foo(int nargout, mwArray& y, const mwArray& x);

次に、MVS プロジェクト (2010)、ウィンドウ フォーム アプリケーション、2 つのテキスト ボックスと 2 つのクリック ボタン、inBox という名前の 1 つのテキスト ボックス、および outBox という名前の別のテキスト ボックスを作成します。button_click 内のコードは次のとおりです。

private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
double input = System::Double::Parse(inBox->Text);
mxArray *x_ptr;
mxArray *y_ptr=NULL;
double *y;

// Create an mxArray to input into mlfFoo
x_ptr = mxCreateDoubleScalar(input);

// Call the implementation function 
// Note the second input argument should be &y_ptr instead of y_ptr. 
foo(1,&y_ptr,x_ptr);

// The return value from mlfFoo is an mxArray. 
// Use mxGetpr to get a pointer to data it contains.
y = (double*)mxGetPr(y_ptr);

// display the result in the form
outBox->Text = ""+*y;

//clean up memory
mxDestroyArray(x_ptr);
mxDestroyArray(y_ptr);
}

プロジェクトをビルドすると、次のようなエラーが発生しました。

error C2664: 'foo' : cannot convert parameter 2 from 'mxArray **' to 'mwArray &'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style
cast.

注: .cpp ソース ファイルには既に 'fooCpplib.h' が含まれています。

誰でもこれについて私を助けることができます! ありがとうございました!

4

2 に答える 2

2

パラメータが次のように宣言されている場合

TypeName &argName

参考になるということargNameです。C++ では、参照によってパラメーターを渡すことができます。これにより、関数は、渡された変数を (特に) 変更できます。

ポインターはあるが、関数が参照を予期している場合は、ポインターのアドレスをアンパサンドで取得するのではなく、アスタリスクを使用して呼び出しでポインターを逆参照する必要があります。

foo(1,*y_ptr,*x_ptr);
//    ^      ^
//    |      |
//  Here and here

変数、ポインター、ポインターへのポインターなどは、間接性のレベルで考えることができます。変数の間接性レベルは 0 です。ポインタの間接性レベルは 1 です。ポインターへのポインターの間接性レベルは 2 などです。

アンパサンドを追加すると、間接性のレベルが上がります。アスタリスクを追加すると減少します。変数と同様に、参照の間接性レベルは 0 です。ポインターがあり、変数が必要な場合は、先頭にアスタリスクを付けて間接参照のレベルを下げる必要があります。

コードの別の問題は、「w」を使用した へのfoo参照を期待しているのに、「x」を使用してへのmwArray参照を渡していることです。mxArrayタイプは一致する必要があります。一致しない場合、コンパイラはプログラムを取得しません。

于 2013-05-04T12:14:18.653 に答える
1

mwArray&参照型です。「への参照mwArray」です。ただし、渡そうとしているため、 、または「へのポインターへのポインター」&y_ptrが返されます。代わりに、参照渡しできるを取得するために逆参照する必要があります。3 番目の引数についても同様です。mwArray**mwArrayy_ptrmwArray

foo(1,*y_ptr,*x_ptr);

ただし、y_ptrnull であるという別の問題があります。mwArray逆参照するには、オブジェクトを指している必要があります。

于 2013-05-04T12:14:25.057 に答える