Russian Qt Forum

Qt => Вопросы новичков => Тема начата: demaker от Июнь 06, 2013, 11:38



Название: Ошибка
Отправлено: demaker от Июнь 06, 2013, 11:38
Тестирую код программы.
Сначала работает нормально.
Затем после некоторых манипуляций
происходит зависание.

Во вложение картинка с сообщением.
Что это за ошибка и как от нее избавиться?




Название: Re: Ошибка
Отправлено: mutineer от Июнь 06, 2013, 11:39
ошибка работы с памятью. Обращение по дикому указателю, скорее всего


Название: Re: Ошибка
Отправлено: demaker от Июнь 06, 2013, 11:45
В консоль без дебага выдает код ошибки -805306369.

ошибка работы с памятью. Обращение по дикому указателю, скорее всего
И что делать-то???


Название: Re: Ошибка
Отправлено: mutineer от Июнь 06, 2013, 11:47
Искать где ты портишь какой-то указатель. Или где-нить выходишь за пределы массивы. В общем искать неверную работу с памятью. Возможно тебе поможет стек (в нижнем левом углу твоего скриншота)


Название: Re: Ошибка
Отправлено: demaker от Июнь 06, 2013, 11:50
М-да наверное это надолго :-\


Название: Re: Ошибка
Отправлено: mutineer от Июнь 06, 2013, 11:57
Судя по количеству файлов да


Название: Re: Ошибка
Отправлено: Kurles от Июнь 06, 2013, 12:01
Судя по количеству файлов да
Ну не так и много )


Название: Re: Ошибка
Отправлено: demaker от Июнь 06, 2013, 12:02
Наверное, проще переписать все...


Название: Re: Ошибка
Отправлено: demaker от Июнь 06, 2013, 12:31
не могу понять, уже тестирую код как полчаса,багов нет.
 ??? ??? ???


Название: Re: Ошибка
Отправлено: mutineer от Июнь 06, 2013, 12:37
Да, это тяжелоуловимая ошибка. Потому что память под битым указателем может быть выделена, а может и не быть, как повезет


Название: Re: Ошибка
Отправлено: demaker от Июнь 06, 2013, 13:17
А может эта ошибка возникать из-за ОС???
ole32.dll может вызывать сообщение об ошибке в Винде.
У меня Windows7.


Название: Re: Ошибка
Отправлено: kambala от Июнь 06, 2013, 13:20
даже не надейся на это, точно где-то битый указатель сидит. первым делом поищи по слову delete — может ты где-то руками удаляешь объект, которому назначен родитель.


Название: Re: Ошибка
Отправлено: Old от Июнь 06, 2013, 13:59
может ты где-то руками удаляешь объект, которому назначен родитель.
Эта ситуация обрабатывается в деструкторе и совершенно не опасна.


Название: Re: Ошибка
Отправлено: demaker от Июнь 06, 2013, 15:20
Вот код с удалением объектов
можете сказать что тут может быть неправильно

Код:
void Widget::deletePlot(QTreeWidgetItem * item)
{
    w->removePlotItem(((TreeWidgetItem*)item)->pw->lwi);

    listPlotWidget.removeOne(((TreeWidgetItem*)item)->pw);
    ((TreeWidgetItem*)item)->pw->deleteLater(); //может стоить заменить deleteLater() на close()???

    itemdeSelectColor(item);
    ((TreeWidgetItem*)item)->checkFlag = false;
}

Код:
void widgetPlots::removePlotItem(ListWidgetItem*lwi)
{
    qDebug()<<"removePlotItem";
    list_pws.removeOne(lwi->pw);
    list_widget->removeItemWidget(lwi);
    delete lwi;
}

Код:
void Widget::sl_deletePlotWidget(plotWidget *pw)
{
    w->removePlotItem(pw->lwi);
    pw->item->checkFlag = false;
    itemdeSelectColor(pw->item);
    listPlotWidget.removeOne(pw);
    pw->close();//pw->deleteLater();
}


Название: Re: Ошибка
Отправлено: Kurles от Июнь 06, 2013, 16:31
Вот код с удалением объектов
можете сказать что тут может быть неправильно

Код:
void Widget::deletePlot(QTreeWidgetItem * item)
{
    w->removePlotItem(((TreeWidgetItem*)item)->pw->lwi);

    listPlotWidget.removeOne(((TreeWidgetItem*)item)->pw);
    ((TreeWidgetItem*)item)->pw->deleteLater(); //может стоить заменить deleteLater() на close()???

    itemdeSelectColor(item);
    ((TreeWidgetItem*)item)->checkFlag = false;
}

Код:
void widgetPlots::removePlotItem(ListWidgetItem*lwi)
{
    qDebug()<<"removePlotItem";
    list_pws.removeOne(lwi->pw);
    list_widget->removeItemWidget(lwi);
    delete lwi;
}

Код:
void Widget::sl_deletePlotWidget(plotWidget *pw)
{
    w->removePlotItem(pw->lwi);
    pw->item->checkFlag = false;
    itemdeSelectColor(pw->item);
    listPlotWidget.removeOne(pw);
    pw->close();//pw->deleteLater();
}
невалидный или нулевой указатель в процедуру передаваться может. А так вроде хорошо все.


Название: Re: Ошибка
Отправлено: kambala от Июнь 06, 2013, 18:02
может ты где-то руками удаляешь объект, которому назначен родитель.
Эта ситуация обрабатывается в деструкторе и совершенно не опасна.
странно, а я помню натыкался на краши в таком случае


Название: Re: Ошибка
Отправлено: demaker от Июнь 07, 2013, 11:52
странно, а я помню натыкался на краши в таком случае

А в каком именно ???
Может мне поможет  :)


Название: Re: Ошибка
Отправлено: kambala от Июнь 07, 2013, 11:53
я ж написал в каком, даже в цитате отображено


Название: Re: Ошибка
Отправлено: demaker от Июнь 07, 2013, 12:21
 ;D извините


Название: Re: Ошибка
Отправлено: kambala от Июнь 07, 2013, 15:08
проверил на это тестовом проекте — и правда не крашится. может я тогда еще указателю 0 присваивал или он был QPointer…


Название: Re: Ошибка
Отправлено: demaker от Июнь 10, 2013, 10:26
проверил на это тестовом проекте — и правда не крашится. может я тогда еще указателю 0 присваивал или он был QPointer…

 ???


Название: Re: Ошибка
Отправлено: demaker от Июнь 10, 2013, 10:27
невалидный или нулевой указатель в процедуру передаваться может. А так вроде хорошо все.

 ??? можно поподробнее


Название: Re: Ошибка
Отправлено: demaker от Июнь 10, 2013, 12:59
При тесте в консоле выдал:
Код:
Invalid parameter passed to C runtime function.
Invalid parameter passed to C runtime function.
Invalid parameter passed to C runtime function.
Invalid parameter passed to C runtime function.
QMutex::lock: Deadlock detected in thread 0x12b0

И еще винда выдала сообщение об ошибке(во вложенеи)
Подскажите, что это может значить?


Название: Re: Ошибка
Отправлено: Bepec от Июнь 10, 2013, 13:03
ы. Деадлок впервые? с почином :D

PS мутексы пересекаются и умирают друг в друге.


Название: Re: Ошибка
Отправлено: demaker от Июнь 10, 2013, 13:05
ы. Деадлок впервые? с почином :D

PS мутексы пересекаются и умирают друг в друге.

А первые четыре это, что???
Как мне поймать этот баг?


Название: Re: Ошибка
Отправлено: demaker от Июнь 11, 2013, 16:35
Нашел часть кода, в котором возможна ошибка
Код:
if(type_plot == ANALOG_TYPE)
    {
        y_max_primary = ct->getMaxValue(fn_dat+".DAT", num_channel,true);
        y_min_primary = ct->getMinValue(fn_dat+".DAT", num_channel,true);
        delta_scale_primary = calc_delta_scale(ct->getMaxValue(fn_dat+".DAT", num_channel,true),ct->getMinValue(fn_dat+".DAT", num_channel,true));
        y_scale_test_primary = (this->size().height() - 20)/(2*delta_scale_primary);
        optimum_scale_primary = calc_optimum_scale_primary();

        y_max_secondary = ct->getMaxValue(fn_dat+".DAT", num_channel,false);
        y_min_secondary = ct->getMinValue(fn_dat+".DAT", num_channel,false);
        delta_scale_secondary = calc_delta_scale(ct->getMaxValue(fn_dat+".DAT", num_channel,false),ct->getMinValue(fn_dat+".DAT", num_channel,false));
        y_scale_test_secondary = (this->size().height() - 20)/(2*delta_scale_secondary);
        optimum_scale_secondary = calc_optimum_scale_secondary();

        if( *(ct->DynamicCfg->AnalogChannels[num_channel].PS) == "P" )
        {
            unit = *(ct->DynamicCfg->AnalogChannels[num_channel].Unit);
            ((plotWidget*)(this->parent()))->ppw->namePlot->setText(*(ct->DynamicCfg->AnalogChannels[num_channel].Name) + "," +*(ct->DynamicCfg->AnalogChannels[num_channel].Unit));

            data = new QwtPointArrayData(ct->getTimeDataVector(fn_dat+".DAT"),
                                         ct->getAnalogDataVector(fn_dat+".DAT", num_channel,true),
                                         ct->DynamicCfg->NumSamples);

            //setAxisScale(QwtPlot::yRight, -(this->size().height() - 20)/(2*optimum_scale_primary), (this->size().height() - 20)/(2*optimum_scale_primary)); //!!!!!!!!!!Если оставить
        }
        if( *(ct->DynamicCfg->AnalogChannels[num_channel].PS) == "S" )
        {
            unit = *(ct->DynamicCfg->AnalogChannels[num_channel].Unit);
            ((plotWidget*)(this->parent()))->ppw->namePlot->setText(*(ct->DynamicCfg->AnalogChannels[num_channel].Name) + "," + *(ct->DynamicCfg->AnalogChannels[num_channel].Unit));

            data = new QwtPointArrayData(ct->getTimeDataVector(fn_dat+".DAT"),
                                         ct->getAnalogDataVector(fn_dat+".DAT", num_channel,false),
                                         ct->DynamicCfg->NumSamples);

            //setAxisScale(QwtPlot::yRight, -(this->size().height() - 20)/(2*optimum_scale_secondary), (this->size().height() - 20)/(2*optimum_scale_secondary));//!!!!!!!!!!Если оставить
        }
        else
        {
        }

        enableAxis(QwtPlot::yRight,true);
        enableAxis(QwtPlot::yLeft,false);

        setAxisAutoScale(QwtPlot::yRight,true); // //!!!!!!!!!!А это убрать, то через некоторое время работы вылетает

        setAxisScaleDraw(QwtPlot::yRight,new MyScaleDraw());
        setAxisScale(QwtPlot::xBottom,start_time,end_time);

        setCanvasBackground(QColor(Qt::gray));

...

double Plot::calc_delta_scale(double max, double min)
{
    double delta;
    double abs_min = qFabs(min);

    if(max >= abs_min)
    {
        delta = max;
    }
    else
    {
        delta = abs_min;
    }
    return delta;
}


double Plot::calc_optimum_scale_secondary()
{
    double tmp;
    for(int j = 0; j < (int)(sizeof(vec_scales)/sizeof(double)); j++)
    {
        if((y_scale_test_secondary >= vec_scales[j])&&(y_scale_test_secondary < vec_scales[j+1]))
        {
            tmp = vec_scales[j];
        }
    }
    return tmp;
}

Не могу понять почему  ???

Может
Код:
  setAxisScale(QwtPlot::yRight, -(this->size().height() - 20)/(2*optimum_scale_primary), (this->size().height() - 20)/(2*optimum_scale_primary)); //!!!!!!!!!!Если оставить
убрать из конструктора


Название: Re: Ошибка
Отправлено: kambala от Июнь 11, 2013, 16:56
если попадает в элс, то для data не выделяется память. подозреваю, что где-то в другой части программы написано delete data, отсюда и обращение по невалидному указателю.


Название: Re: Ошибка
Отправлено: demaker от Июнь 11, 2013, 17:27
Да нет все норм.
т.к. есть
Код:
 curve->attach(this);
 curve->setData(data);
и они сами все удаляют


Название: Re: Ошибка
Отправлено: demaker от Июнь 20, 2013, 16:23
Скажите,а возможен такой вариант.
У меня в QtSDK mingw32, а у меня 64-битная ОС и поэтому возникает ошибка???


Название: Re: Ошибка
Отправлено: kambala от Июнь 20, 2013, 16:49
нет


Название: Re: Ошибка
Отправлено: demaker от Июнь 21, 2013, 10:40
нет
Пробовал.
??? только почему-то на 32-битной не выдает ошибку ???