尝试更改此:
static PyObject *_aux_error(PyObject *self) {
对此:
static PyObject *_aux_error(PyObject *self, PyObject *args) {
args
即使您不使用它定义函数,Python也会传递该参数。
您的代码仍然存在一个基本问题。您已经使用vector
堆栈上的数组创建了一个numpy数组。当_aux_error
返回时,该内存将被回收并可重复使用。
您可以使用PyArray_SimpleNew()
分配numpy数组的方式创建数组,然后将其复制vector
到数组的数据中:
static PyObject *_aux_error(PyObject *self, PyObject *args)
{
double vector[2] = {1.0 , 2.0};
npy_intp dims[1] = {2};
PyObject *ret = PyArray_SimpleNew(1, dims, NPY_DOUBLE);
memcpy(PyArray_DATA(ret), vector, sizeof(vector));
return ret;
}
请注意,我将类型更改为NPY_DOUBLE
; NPY_FLOAT
是32位浮点类型。
在一条评论中,您询问了有关在中动态分配内存的问题_aux_error
。这是可能有用的示例的变体。数组的长度仍用硬编码dims
,因此它不是完全通用的,但可能足以解决注释中的问题。
static PyObject *_aux_error(PyObject *self, PyObject *args)
{
double *vector;
npy_intp dims[1] = {5};
npy_intp k;
PyObject *ret = PyArray_SimpleNew(1, dims, NPY_DOUBLE);
vector = (double *) PyArray_DATA(ret);
/*
* NOTE: Treating PyArray_DATA(ret) as if it were a contiguous one-dimensional C
* array is safe, because we just created it with PyArray_SimpleNew, so we kNow
* that it is, in fact, a one-dimensional contiguous array.
*/
for (k = 0; k < dims[0]; ++k) {
vector[k] = 1.0 + k;
}
return ret;
}