我正在编写一个 Python C 扩展,而不使用 Cython。
我想在 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);
// 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 的标准方法是什么?我找到了文档,但没有很好的例子。另外,内存泄漏怎么办?返回前 INCREF 是否正确,以便保留 alpha 和 beta 的实例?当不再需要它们时,释放怎么办?
EDIT我终于用在中找到的方法得到了正确的结果NumPy 食谱 http://www.scipy.org/Cookbook/C_Extensions/NumPy_arrays.
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 */
}
请随意对此发表评论并感谢您的回答。