Почему Python IDLE вылетает с ошибкой StackHash_0a9e? - PullRequest
0 голосов
/ 19 июня 2019

Мой код сравнивает 2 списка кортежей и отображает «True», если все элементы первого кортежа находятся в диапазоне второго кортежа.Диапазон задается аргументом "ar".

#include <Python.h>

PyObject *compare( PyObject *self, PyObject *args )
{
    PyObject *pList1;
    PyObject *pList2;
    PyObject *pItem1;
    PyObject *pItem2;
    Py_ssize_t n;
    int i, i2;
    int ar, ar2;
    int c, s, b;

    if (!PyArg_ParseTuple(args, "O!O!i", &PyList_Type, &pList1, &PyList_Type, &pList2, &ar)) {
        PyErr_SetString(PyExc_TypeError, "parameter must be a list.");
        return NULL;
    }

    ar2 = ar * 2;
    n = PyList_Size(pList1);
    for (i=0; i<n; i++) {
        pItem1 = PyList_GetItem(pList1, i);
        if(!PyTuple_Check(pItem1)) {
            PyErr_SetString(PyExc_TypeError, "list items must be tuples.");
            return NULL;
        }
        pItem2 = PyList_GetItem(pList2, i);
        if(!PyTuple_Check(pItem2)) {
            PyErr_SetString(PyExc_TypeError, "list items must be tuples.");
            return NULL;
        }

        for (i2=0; i2<3; i2++) {
            c = (int) PyInt_AsLong(PyTuple_GetItem(pItem1, i2));
            s = (int) PyInt_AsLong(PyTuple_GetItem(pItem2, i2));
            s -= ar;
            b += ar2;

            if(!(s <= c && c <= b)) {
                return Py_False;
            }
        }
    }

    return Py_True;
}

После 5000 итераций в цикле Python завершает работу с AppCrash.

1 Ответ

0 голосов
/ 19 июня 2019

Причина была в счетчике ссылок.Надо было добавить до возврата Py_INCREF (Py_False) и Py_INCREF (Py_True) соответственно.

...