मैं साइथन का उपयोग किए बिना पाइथन सी-एक्सटेंशन लिख रहा हूं।सी सरणी को PyArray
मैं सी में एक डबल सरणी आवंटित करना चाहता हूं, इसे आंतरिक फ़ंक्शन में उपयोग करना चाहता हूं (जो कि फोरट्रान में होता है) और इसे वापस कर दें। मैं कहना है कि सी-फोरट्रान इंटरफ़ेस सी
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);
}
में पूरी तरह से काम करता है मैं इस कोड डिबग और जब मैं एक से बाहर अल्फा बनाने की कोशिश मैं एक विभाजन गलती मिलता है। वहां तक सब कुछ ठीक काम करता है। फ़ंक्शन drecur_ काम करता है और अगर इसे हटा दिया जाता है तो मुझे वही समस्या मिलती है।
अब, सी डेटा के आसपास एक PyArray परिभाषित करने का मानक तरीका क्या है? मुझे प्रलेखन मिला लेकिन कोई अच्छा उदाहरण नहीं मिला। इसके अलावा, स्मृति रिसाव के बारे में क्या? क्या यह वापसी से पहले INCREF के लिए सही है ताकि अल्फा और बीटा का उदाहरण संरक्षित हो? जब उन्हें अब और आवश्यकता नहीं है तो deallocation के बारे में क्या?
संपादित मैं अंत में यह सही दृष्टिकोण 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 */
}
इस पर टिप्पणी करने के लिए स्वतंत्र महसूस करें और उत्तर के लिए धन्यवाद।