Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用SWIG在Python中使用NumPy数组在struct中包装C指针_Python_C_Numpy_Swig - Fatal编程技术网

使用SWIG在Python中使用NumPy数组在struct中包装C指针

使用SWIG在Python中使用NumPy数组在struct中包装C指针,python,c,numpy,swig,Python,C,Numpy,Swig,我有以下C结构: struct my_struct { int some_int; const int *some_int_vector; } 我希望从Python接口(使用SWIG),如下所示: >>> ms = my_struct() >>> ms.some_int = 5 >>> ms.some_int_vector = [1,2,3] 包装结构本身似乎是可行的:我可以给一些\u int赋值。然而,对于some\u

我有以下C结构:

struct my_struct {
    int some_int;
    const int *some_int_vector;
}
我希望从Python接口(使用SWIG),如下所示:

>>> ms = my_struct()
>>> ms.some_int = 5
>>> ms.some_int_vector = [1,2,3]
包装结构本身似乎是可行的:我可以给
一些\u int
赋值。然而,对于
some\u int\u vector
,我得到了Python中的
NoneType
。如果我给它赋值,就会得到错误

TypeError: in method 'my_struct_some_int_vector_set', argument 2 of type 'int_t const *'
经过几个小时的搜索,我仍然不知道如何连接这个。我知道
numpy.I
,但使用它似乎需要事先知道向量维度

我还尝试了以下建议的类型映射:

%typemap(in)int_t*vec(int_t temp[$1\u dim0]){
int i;
如果(!PySequence_Check($input)){
PyErr_SetString(PyExc_ValueError,预期为序列);
SWIG_失败;
}
如果(PySequence_Length($input)!=1_dim0){
PyErr_SetString(PyExc_ValueError,“大小不匹配。预期为$1_dim0元素”);
SWIG_失败;
}
对于(i=0;i<$1_dim0;i++){
PyObject*o=PySequence\u GetItem($input,i);
如果(PyNumber_检查(o)){
温度[i]=(浮点)PyFloat\u为双精度(o);
}否则{
PyErr_SetString(PyExc_ValueError,“序列元素必须是数字”);
SWIG_失败;
}
}
$1=临时工;
}

但这似乎没有改变任何事情。

我没有swig方面的经验,但您是否尝试使用元组而不是列表?正如在
ms.some_int_vector=(1,2,3)
中一样,我尝试过,但得到的错误消息与列表相同。我没有使用swig的经验,但您是否尝试过使用元组而不是列表?正如在
ms.some_int_vector=(1,2,3)
中一样,我尝试过,但得到了与列表相同的错误消息。
%typemap(in) int_t *vec (int_t temp[$1_dim0]) {

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