0

Pythonスクリプトの終了後にexeが終了すると、crt0dat.c ここに画像の説明を入力してくださいへのエラーポイントが発生しまし た。このような呼び出しスタック... ここに画像の説明を入力してください c ++コードまたはPythonコードにエラーがありますか?

このようなC++コード:

void PythonCall::call(std::vector<double>& s,std::vector<double>& b,std::vector<double>& t,std::vector<double>& y)
{

    PyObject* args = PyTuple_New(2);
    PyObject* tPyList = convert2PythonList(t);
    PyObject* yPyList = convert2PythonList(y);
    PyTuple_SetItem(args,0,tPyList);
    PyTuple_SetItem(args,1,yPyList);

    PyObject* r = PyObject_CallObject(func,args);

    PyObject* item;


    PyObject* iter = PyObject_GetIter(r);
    /*{
    PyObject *errtype, *errvalue, *traceback;
    PyErr_Fetch(&errtype, &errvalue, &traceback);
    PyObject *s = PyObject_Str(errvalue);
    char *errstr = PyString_AsString(s);
    std::cout << "Python Error: " << errstr; 
    }*/


    item = PyIter_Next(iter);
    int i = 0;
    PyObject* iter2 = PyObject_GetIter(item);
    PyObject* item2;
    while (item2 = PyIter_Next(iter2))
    {
        s[i] = PyFloat_AsDouble(item2);
        Py_XDECREF(item2);
        i++;
    }
    Py_XDECREF(item);
    //Py_XDECREF(iter2);

    item = PyIter_Next(iter);
    i = 0;
    iter2 = PyObject_GetIter(item);
    while (item2 = PyIter_Next(iter2))
    {
        b[i] = PyFloat_AsDouble(item2);
        Py_XDECREF(item2);
        i++;
    }
    Py_XDECREF(item);
    //Py_XDECREF(iter2);

    //Py_XDECREF(iter);
    Py_XDECREF(args);
    Py_XDECREF(r);
    Py_XDECREF(item);
    Py_XDECREF(tPyList);
    Py_XDECREF(yPyList);
    //std::cout << "done" << std::endl;
}

およびPythonコード:

def get_slope_baseLine(tl,xl):
    slopes = get_slope2(tl,xl)
    baselines = get_leakTime(tl,slopes)
    return slopes,baselines

私の英語が下手でごめんなさい...

4

1 に答える 1

3

どうやら、2つのリストを繰り返し処理し、それらの要素のrefカウントをデクリメントするつもりですが、リセットするのを忘れてiterいるため、2番目のリストを繰り返し処理していません。

PyObject* iter = PyObject_GetIter(r);

item = PyIter_Next(iter);
int i = 0;
PyObject* iter2 = PyObject_GetIter(item);
PyObject* item2;
while (item2 = PyIter_Next(iter2))
{
    s[i] = PyFloat_AsDouble(item2);
    Py_XDECREF(item2);
    i++;
}
Py_XDECREF(item);

// ! Here you probably intended another call to PyObject_GetIter
item = PyIter_Next(iter);
i = 0;
iter2 = PyObject_GetIter(item);
while (item2 = PyIter_Next(iter2))
{
    b[i] = PyFloat_AsDouble(item2);
    Py_XDECREF(item2);
    i++;
}
Py_XDECREF(item);

ただし、クラッシュは他の理由が原因である可能性があります(使用している関数の文書化された動作によって異なります)。

于 2012-05-03T05:10:51.377 に答える