python - python : input and output arrays 的 swig 类型映射

标签 python c swig

我有一个要在 Python 中使用的 C 函数:

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

使用 SWIG,我想我需要定义一个类型映射来转换两个点(PointA 输入,PointB 输出)以便 Python 可以使用它。 typemaps.i 中似乎没有适用于此的类型映射,因此我必须定义一个。我似乎无法在 SWIG 文档中找到数组的示例。

我想像这样使用这个库:

s = externalStruct()
point_a = [1, 2, 3]
result, point_b = convertAtoB(s, point_a)
print point_b
"expect [4, 5, 6]"

我该怎么做?谢谢

最佳答案

你快到了。要摆脱 python 签名中的虚拟参数,您需要将 PointB[3]%typemap(in) 更改为 %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;
}

关于python - python : input and output arrays 的 swig 类型映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3660270/

相关文章:

python - 如何将 UTF-8 转换为转义字符串

python - pygame 的随机线生成

python - 如何识别数量不断增加且文件名形式相似的文件?

python C++ 扩展 : symbol not defined error

java - 为多个参数对定义一次 SWIG 类型映射

javascript - 如何关闭用python制作的chrome native 应用程序?

使用 eclipse 和 mingw 的控制台应用程序(不在 cms.exe 中启动应用程序)

c++ - 在c中存储多维数组

c++ - 线程有不同的栈和堆吗?

c# - 用多个 C# .dll 包装多个 C++ .dll