Я работаю над своим первым расширением С++ для программы python. Я пытаюсь отлаживать этот конкретный фрагмент кода в течение нескольких часов, и у меня нет идей.
Кажется, что segfault имеет какое-то отношение к PyArrayObject
old_simplices_array
, который передается коду С++. Этот объект является 2d numpy array
типа uint32
.
Этот код был изменен непосредственно из того, что scipy.weave
объединяет. Все работает отлично, когда код отформатирован и используется scipy.weave.inline. Кажется, это исключает часть python моей программы и сам алгоритм из возможных виновников.
Это просто оставляет синтаксис и типы. Кто-нибудь видит какой-либо неправильный синтаксис или тип, переводящий код?
static PyObject* exterior(PyObject* self,
PyArrayObject* old_simplices_array)
{
const short unsigned int step = old_simplices_array->dimensions[1];
const short unsigned int j_max = step - 1;
const long unsigned int col_max =
old_simplices_array->dimensions[0] * step;
short unsigned int j, k, face_index;
long unsigned int col;
unsigned int num_simplices = 0;
PyObject* indices = PyList_New(0);
PyObject* indptr = PyList_New(0);
PyObject* data = PyList_New(0);
PyObject* simplices = PyList_New(0);
PyList_Append(indptr, PyLong_FromLong(0));
PyObject* simplex_to_index = PyDict_New();
for(col = 0; col < col_max; col+=step)
{
for(j = 0; j <= j_max; j++)
{
face_index = 0;
PyObject* face = PyTuple_New(j_max);
for(k = 0; k <= j_max; k++)
{
if(j != k)
{
PyTuple_SetItem(face, face_index,
PyLong_FromLong(old_simplices_array->data[col + k]));
face_index++;
}
}
if(PyDict_Contains(simplex_to_index, face))
{
PyList_Append(indices,
PyDict_GetItem(simplex_to_index, face));
}
else
{
PyDict_SetItem(simplex_to_index, face,
PyLong_FromLong(num_simplices));
PyList_Append(simplices, face);
num_simplices++;
}
PyList_Append(data, PyLong_FromLong(1 - 2 * (j % 2)));
}
PyList_Append(indptr, PyLong_FromLong(col + j));
}
return PyTuple_Pack(3, PyTuple_Pack(3, data, indices, indptr), simplices,
simplex_to_index);
}
------ ------ ОБНОВЛЕНИЕ
gdb указывает
const short unsigned int step = old_simplices_array->dimensions[1];
вызывает segfault. Я неправильно использовал типы?
------ ------ ОБНОВЛЕНИЕ
Несмотря на то, что GDB говорит мне,
const short unsigned int step = old_simplices_array->dimensions[1];
вызывает segfault, если я вернусь из программы непосредственно перед циклом for, я не получаю segfault (просто ошибка на стороне python, жалующаяся на возвращение NoneType).
Это полная обратная трассировка:
Program received signal SIGSEGV, Segmentation fault.
exterior (self=<optimized out>, old_simplices_array=0xec0a50)
at src/_alto.cpp:39
warning: Source file is more recent than executable.
39 const short unsigned int step = old_simplices_array->dimensions[1];
(gdb) bt
exterior (self=<optimized out>, old_simplices_array=0xec0a50)
at src/_alto.cpp:39
0x00007ffff7aedad2 in PyEval_EvalFrameEx ()
from /usr/lib/sagemath/local/lib/libpython2.7.so.1.0
0x00007ffff7aeddc9 in PyEval_EvalFrameEx ()
from /usr/lib/sagemath/local/lib/libpython2.7.so.1.0
0x00007ffff7aee902 in PyEval_EvalCodeEx ()
from /usr/lib/sagemath/local/lib/libpython2.7.so.1.0
0x00007ffff7a70ad6 in ?? ()
from /usr/lib/sagemath/local/lib/libpython2.7.so.1.0
0x00007ffff7a4565e in PyObject_Call ()
from /usr/lib/sagemath/local/lib/libpython2.7.so.1.0
0x00007ffff7a53b80 in ?? ()
from /usr/lib/sagemath/local/lib/libpython2.7.so.1.0
0x00007ffff7a4565e in PyObject_Call ()
from /usr/lib/sagemath/local/lib/libpython2.7.so.1.0
0x00007ffff7aaaea0 in ?? ()
from /usr/lib/sagemath/local/lib/libpython2.7.so.1.0
0x00007ffff7aa68bc in ?? ()
from /usr/lib/sagemath/local/lib/libpython2.7.so.1.0
0x00007ffff7a4565e in PyObject_Call ()
from /usr/lib/sagemath/local/lib/libpython2.7.so.1.0
0x00007ffff7ae9bce in PyEval_EvalFrameEx ()
from /usr/lib/sagemath/local/lib/libpython2.7.so.1.0
0x00007ffff7aee902 in PyEval_EvalCodeEx ()
from /usr/lib/sagemath/local/lib/libpython2.7.so.1.0
0x00007ffff7aeea32 in PyEval_EvalCode ()
from /usr/lib/sagemath/local/lib/libpython2.7.so.1.0
0x00007ffff7b103fa in PyRun_FileExFlags ()
from /usr/lib/sagemath/local/lib/libpython2.7.so.1.0
0x00007ffff7b10e3d in PyRun_SimpleFileExFlags ()
from /usr/lib/sagemath/local/lib/libpython2.7.so.1.0
0x00007ffff7b26972 in Py_Main ()
from /usr/lib/sagemath/local/lib/libpython2.7.so.1.0
0x00007ffff6d29ea5 in __libc_start_main ()
from /lib/x86_64-linux-gnu/libc.so.6
0x00000000004006d1 in _start ()