3

我有一个 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)之前编写“包含”代码和“应用”代码。

4

0 回答 0