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);

// 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 */

}

请对此发表评论并感谢您的回答。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值