私はc++クラスを持っていて、メンバー関数は次のように入力として2つのdouble配列を使用します。
class model{
//define some varible..
void Trainmodel(double *x,double *y);
//...
};
このクラスをc#で使用したかったので./swigwin2.0.9/examples/csharp/arrays
、ヘルプページの例とガイドに従いました。SWIGmymodel.MY
ファイルは次のようになります。
%module model_dll
%{
/* Includes the header in the wrapper code */
#include "model.h"
%}
/* Parse the header file to generate wrappers */
%include "model.h"
%include "arrays_csharp.i"
%apply double INPUT[] { double* x }
%apply double INPUT[] { double* y }
しかし、この関数をc#で使用すると、エラーが発生します。エラー1の最適なオーバーロードされたメソッドの一致にmodel.Trainmodel(SWIGTYPE_p_double, SWIGTYPE_p_double)
は、いくつかの無効な引数があり、エラー2引数1:からdouble[]
に変換できません。SWIGTYPE_p_double
model.csのソースコードを確認すると、trainmodel関数は次のようになっています。
public int Trainmodel(SWIGTYPE_p_double x, SWIGTYPE_p_double y) {
//do something
}
誰かが私がこれらのコードの何が問題になっているのかを理解するのを手伝ってもらえますか?なぜ SWIGTYPE_p_double
代わりに小枝が生成されるのdouble []
ですか?
以下のSWIGのサンプルコードをコピーします。
c#コード:
int[] source = { 1, 2, 3 };
int[] target = new int[ source.Length ];
example.myArrayCopy( source, target, target.Length );
cコード:
void myArrayCopy( int* sourceArray, int* targetArray, int nitems ) {
int i;
for ( i = 0; i < nitems; i++ ) {
targetArray[ i ] = sourceArray[ i ];
}
}
.iワープファイル:
%include "arrays_csharp.i"
%apply int INPUT[] {int *sourceArray}
%apply int OUTPUT[] {int *targetArray}
私は何かが足りないのですか?
申し訳ありませんが、このようなばかげた間違いを犯しました。(WTF!:-()* .iファイルでは、コード "%include" model.h""をこれらのコード"%include" array_csharp.i "%apply。 。"以前ではありません。したがって、正しい形式は次のとおりです。
%module model_dll
%{
/* Includes the header in the wrapper code */
#include "model.h"
%}
/* Parse the header file to generate wrappers */
%include "arrays_csharp.i"
%apply double INPUT[] { double* x }
%apply double INPUT[] { double* y }
%include "model.h"//BE CAREFUL: this should put after the include"arrays_csharp.i"
問題は解決しました。また、arrays_csharp.iをインクルードしたい場合は、独自の.hファイル(この場合はmodel.h)をインクルードする前に、「インクルード」コードと「適用」コードが記述されていることを確認してください。