c语⾔如何定义双数组,C数组到PyArray
我正在编写⼀个没有使⽤Cython的Python C扩展。
我想在C语⾔中分配⼀个双数组,在⼀个内部函数中使⽤它(碰巧在Fortran中)并返回它。我指出C-Fortran接⼝在C语⾔中是完美的static PyObject *
Py_drecur(PyObject *self, PyObject *args)
{
// INPUT
int n;
int ipoly;
double al;
double be;
if (!PyArg_ParseTuple(args, "iidd", &n, &ipoly, &al, &be))
return NULL;
// OUTPUT
int nd = 1;
npy_intp dims[] = {n};
double a[n];
double b[n];
int ierr;
drecur_(n, ipoly, al, be, a, b, ierr);
python 定义数组// Create PyArray
PyObject* alpha = PyArray_SimpleNewFromData(nd, dims, NPY_DOUBLE, a);
PyObject* beta = PyArray_SimpleNewFromData(nd, dims, NPY_DOUBLE, b);
Py_INCREF(alpha);
Py_INCREF(beta);
return Py_BuildValue("OO", alpha, beta);
}
我调试了这段代码,当我试图从a中创建alpha时出现了分段错误。到⽬前为⽌,⼀切正常。函数drecur⼯作,如果删除它,我也会遇到同样的问题。
现在,围绕C数据定义PyArray的标准⽅法是什么?我到了⽂件,但没有好的例⼦。另外,内存泄漏呢?在返回之前递增以便保留alpha 和beta的实例是正确的吗?当他们不再需要的时候,交易⼜如何呢?
编辑
我终于⽤NumPy cookbook中的⽅法解决了这个问题。static PyObject *
Py_drecur(PyObject *self, PyObject *args)
{
// INPUT
int n;
int ipoly;
double al;
double be;
double *a, *b;
PyArrayObject *alpha, *beta;
if (!PyArg_ParseTuple(args, "iidd", &n, &ipoly, &al, &be))
return NULL;
// OUTPUT
int nd = 1;
int dims[2];
dims[0] = n;
alpha = (PyArrayObject*) PyArray_FromDims(nd, dims, NPY_DOUBLE); beta = (PyArrayObject*) PyArray_FromDims(nd, dims, NPY_DOUBLE);
a = pyvector_to_Carrayptrs(alpha);
b = pyvector_to_Carrayptrs(beta);
int ierr;
drecur_(n, ipoly, al, be, a, b, ierr);
return Py_BuildValue("OO", alpha, beta);
}
double *pyvector_to_Carrayptrs(PyArrayObject *arrayin) {
int n=arrayin->dimensions[0];
return (double *) arrayin->data; /* pointer to arrayin data as double */ }
请对此发表评论并感谢您的回答。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。