我有一个c函数要在python中使用:

extern int convertAtoB( stateStruct *myStruct,
                        const double PointA[3],
                        double PointB[3]);

使用swig,我想我需要定义一个类型映射来转换两点(pointa是输入,pointb是输出),这样python就可以使用它。TypeMaps中似乎没有TypeMap。我可以处理这个,所以我必须定义一个。我似乎在swig文档中找不到数组的例子。
我想这样使用这个库:
s = externalStruct()
point_a = [1, 2, 3]
result, point_b = convertAtoB(s, point_a)
print point_b
"expect [4, 5, 6]"

我该怎么做?谢谢

最佳答案

你就快到了。要去掉python签名中的伪参数,您需要将%typemap(in)PointB[3]更改为%typemap(in,numinputs=0)以指示swig忽略该输入值(您已经在复制它了)。这将从python方法签名中删除伪参数。
不过,我不确定是否需要复制整个%typemap(in)来实现这个专门化。也许有一种方法可以重用实际的类型映射,但我不知道如何重用。否则你会得到额外的

%typemap(in,numinputs=0) double PointB[3] (double temp[$1_dim0]) {
  int i;
  if (!PySequence_Check($input)) {
    PyErr_SetString(PyExc_ValueError,"Expected a sequence");
    return NULL;
  }
  if (PySequence_Length($input) != $1_dim0) {
    PyErr_SetString(PyExc_ValueError,"Size mismatch. Expected $1_dim0 elements");
    return NULL;
  }
  for (i = 0; i < $1_dim0; i++) {
    PyObject *o = PySequence_GetItem($input,i);
    if (PyNumber_Check(o)) {
      temp[i] = (double) PyFloat_AsDouble(o);
    } else {
      PyErr_SetString(PyExc_ValueError,"Sequence elements must be numbers");
      return NULL;
    }
  }
  $1 = temp;
}

10-06 06:28