2012-05-03 3 views
0

Когда мой ехе выход после финиша питон скрипт, я попал в точку ошибки в crt0dat.c enter image description here Стек вызовов, как это ... enter image description here Есть ли какая-то ошибка в мой код C++ или код python?выход исключение Сбой C++ вызова питон скрипт

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; 
} 

и код питона:

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

жаль мой бедный английский ...

+7

Можете ли вы выслать любой код? Трудно отлаживать незаметный код. – Blender

+2

Как вы ожидаете, что мы узнаем, что если вы не даете нам свой C++ или ваш код на Python? – mfontanini

+1

'doexit()', вероятно, вызывается, потому что программа завершилась из-за нарушения доступа или какого-либо другого условия завершения. Что это такое, полностью зависит от того, что делает код C++ или Python. Во-вторых, первые два комментария - нет способа узнать, что происходит, просто глядя на то, что программа завершена. –

ответ

3

Видимо вы намерены пройти по двум списки и уменьшают количество ссылок на их элементы, но вы забудете сбросить iter, чтобы вы не перебирали второй список.

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); 

Катастрофа, однако, может быть связано с другими причинами (это зависит от документированного поведения функций, которые вы используете).

+0

+1, waaaay лучше. :) – HostileFork

+1

Спасибо большое, я нашел причину. Я делаю это Py_XDECREF (item) три раза .... но у меня просто есть списки буксиров – wtm

+0

@wtm Если ваша проблема решена информацией, которую кто-то дает вам, убедитесь, что вы " принять "ответ ... это этикет на StackOverflow ... – HostileFork

Смежные вопросы