我有一个 c++ 类和一个成员函数使用两个双精度数组作为输入,例如:
class model{
//define some varible..
void Trainmodel(double *x,double *y);
//...
};
我想在 c# 中使用这个类,并按照./swigwin2.0.9/examples/csharp/arrays
帮助页面中的示例和指南进行操作:SWIG
我的 model.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
}
谁能帮我弄清楚这些代码有什么问题?为什么 swig generate 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”arrays_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)之前编写“包含”代码和“应用”代码。