[Numpy-discussion] segfault in PyArray_FromDims
Juerg Tschirren
juerg-tschirren at uiowa.edu
Sun Jul 1 15:23:17 EDT 2001
I did some experimenting with the NumPy C API. I wrote two functions.
One for processing a NumPy array in C++ and the other one for
generating a NumPy array in C++. The processing function work perfectly
fine. But in the array-generating function I get a segmentation fault
whenever I call PyArray_FromDims. I used swig for generating the wrapper
functions.
The two src-files (numPyExt.i and numPyExt.cc):
--- begin numPyExt.i -------------------------------------------------
%module numPyExt
%{
#include <iostream.h>
#include <Python.h>
#include <Numeric/arrayobject.h>
%}
%init %{
import_array();
%}
%typemap(python,in) double * {
PyArrayObject *py_arr;
if(!PyArray_Check($source)) {
PyErr_SetString(PyExc_TypeError, "Not a NumPy array");
return NULL;
}
if (PyArray_ObjectType($source,0) != PyArray_DOUBLE) {
PyErr_SetString(PyExc_ValueError, "Array must be of type double");
return NULL;
}
py_arr = (PyArrayObject*) \
(PyArray_ContiguousFromObject($source, PyArray_DOUBLE, 1, 1));
if (py_arr->nd != 1) {
PyErr_SetString(PyExc_TypeError, "Array must be 1D");
return NULL;
}
$target = (double*)(py_arr->data);
}
extern PyObject* createArray();
extern void processArray(double* pdInArray);
--- end numPyExt.i ---------------------------------------------------
--- begin numPyExt.cc ------------------------------------------------
#include <iostream.h>
#include <Python.h>
#include <Numeric/arrayobject.h>
//------
PyObject* createArray() {
PyArrayObject* retArray;
int iDimensions[3] = {10, 10, 10};
cout << "before PyArray_FromDims" << endl << flush;
retArray = (PyArrayObject*)PyArray_FromDims(3, iDimensions, PyArray_INT);
cout << "after PyArray_FromDims" << endl << flush;
return PyArray_Return(retArray);
}
//------
void processArray(double* pdInArray) {
cout << *pdInArray << " " << *(pdInArray+1) << " " << *(pdInArray+2)
<< endl;
}
--- end numPyExt.cc --------------------------------------------------
Compiled with:
g++ -c -I/usr/local/include/python2.0 -I/usr/local/lib/python2.0/site-packages -O2 numPyExt.cc
swig -python -c++ numPyExt.i
g++ -c -O2 numPyExt_wrap.c -DOS_LINUX -DHAVE_CONFIG_H -I. -I/usr/local/include/python2.0 -I/usr/local/lib/python2.0/site-packages -I/usr/local/lib/python2.0/config
g++ -W1,--heap,50000,--stack,100000 -O2 -shared numPyExt.o numPyExt_wrap.o -lstdc++ -o numPyExt.so
The Python test code I am using:
import Numeric, numPyExt
vec = Numeric.array((1.23, 4.56, 7.89))
numPyExt.processArray(vec) # works fine
a = numPyExt.createArray() # seg fault here
print a
I am using NumPy v20.0.0, Python 2.1, and gcc 2.95.2 on a Linux 2.2.16
sytem.
Does anybody have an idea what's causing this problem?
Juerg
More information about the NumPy-Discussion
mailing list