一尘不染

SWIG C至Python Int数组

linux

我正在尝试使用swig从python使用以下原型访问C函数:

int cosetCoding(int writtenDataIn, int newData, const int memoryCells, int *cellFailure, int failedCell);

Swig创建.so没问题,我可以将其导入python,但是当我尝试使用以下命令进行访问时:

 cosetCoding.cosetCoding(10,11,8,[0,0,0,0,0,0,0,0],0)

我得到以下回溯:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: in method 'cosetCoding', argument 4 of type 'int *'

该指针应该是一个int数组,其大小由memoryCells定义


阅读 363

收藏
2020-06-07

共1个答案

一尘不染

如果可以,请使用ctypes。更简单。但是,由于您要求输入SWIG,因此需要的是一个描述如何处理int
*的类型图。SWIG不知道可以指向多少个整数。以下摘自SWIG文档中有关多参数typemap的示例

%typemap(in) (const int memoryCells, int *cellFailure) {
  int i;
  if (!PyList_Check($input)) {
    PyErr_SetString(PyExc_ValueError, "Expecting a list");
    return NULL;
  }
  $1 = PyList_Size($input);
  $2 = (int *) malloc(($1)*sizeof(int));
  for (i = 0; i < $1; i++) {
    PyObject *s = PyList_GetItem($input,i);
    if (!PyInt_Check(s)) {
        free($2);
        PyErr_SetString(PyExc_ValueError, "List items must be integers");
        return NULL;
    }
    $2[i] = PyInt_AsLong(s);
  }
}

%typemap(freearg) (const int memoryCells, int *cellFailure) {
   if ($2) free($2);
}

请注意,使用此定义时,从Python调用时,将省略memoryCells参数并仅传递诸如[1,2,3,4]for
的数组cellFailure。类型图将生成memoryCells参数。

附言:如果您愿意,我可以发布一个完整的示例(适用于Windows)。

2020-06-07