Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
5 / 5 / 0
Регистрация: 19.02.2018
Сообщений: 76
1

ASSERT failure in QList<T>::operator[]: "index out of range", file C:\Qt\5.7\mingw53_32\include/QtCore/qlist.h, line 545

07.10.2019, 13:22. Просмотров 2445. Ответов 4
Метки нет (Все метки)


Добрый день. В программе где-то есть утечка памяти, но что-то никак не могу её найти и исправить. Вследствие чего выдаётся ошибка: ASSERT failure in QList<T>::operator[]: "index out of range", file C:\Qt\5.7\mingw53_32\include/QtCore/qlist.h, line 545
Подскажите, пожалуйста, как её исправить.

widget.h

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#ifndef WIDGET_H
#define WIDGET_H
 
#include <QApplication>
#include <QWidget>
#include <QLabel>
#include <QSlider>
#include <QLayout>
#include <QPainter>
#include <QMouseEvent>
#include <QSignalMapper>
 
namespace Ui {
class Widget;
}
 
class Widget : public QWidget
{
    Q_OBJECT
 
public:
    explicit Widget(QWidget *parent = nullptr);
    ~Widget();
 
public slots:
    // from 0 to 100%
    void setT0(int val) { setPart(0, 0.01*val); }
    void setT1(int val) { setPart(1, 0.01*val); }
 
protected:
    virtual void paintEvent(QPaintEvent *event);
    virtual void mousePressEvent(QMouseEvent *event);
    virtual void mouseReleaseEvent(QMouseEvent *event);
    virtual void mouseMoveEvent(QMouseEvent *event);
 
private:
    int pointIdx(const QPointF& p);
    void updatePart();
    void setPart(int idx, qreal val);
    QList<QPointF> pts;
    QList<QPointF> ptsPart;
    qreal t0, t1;
    QPointF prev;
    int movingIdx;
    int overIdx;
 
    Ui::Widget *ui;
};
 
#endif // WIDGET_H
widget.cpp

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
#include "widget.h"
#include "ui_widget.h"
 
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    setMouseTracking(true);
    pts << QPointF(50, 50) << QPointF(450, 100)
        << QPointF(350, 450) << QPointF(750, 500);
    ptsPart = pts;
    updatePart();
 
    ui->setupUi(this);
}
 
const qreal r = 5.0;
 
void Widget::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event)
    QPainter painter(this);
    painter.fillRect(0, 0, width(), height(), Qt::darkGray);
    painter.setRenderHint(QPainter::Antialiasing);
    // draw original bezier
    painter.setPen(QPen(QBrush(Qt::white), 1.5));
    painter.setBrush(Qt::NoBrush);
    QPainterPath path(pts[0]);
    path.cubicTo(pts[1], pts[2], pts[3]);
    painter.drawPath(path);
    // draw path for control points
    path = QPainterPath(pts[0]);
    path.lineTo(pts[1]);
    path.lineTo(pts[2]);
    path.lineTo(pts[3]);
    QBrush b(Qt::yellow);
    painter.setPen(QPen(b, 0.75));
    painter.setBrush(Qt::NoBrush);
    painter.drawPath(path);
    // draw control points
    QBrush b1(Qt::cyan);
    painter.setPen(Qt::NoPen);
    for (int idx = 0; idx < pts.size(); ++idx) {
        painter.setBrush(idx == overIdx ? b1 : b);
        painter.drawEllipse(pts[idx], r, r);
    // draw part of original bezier
    painter.setPen(QPen(QBrush(QColor(0, 255, 0, 100)), 12.0));
    painter.setBrush(Qt::NoBrush);
    path = QPainterPath(ptsPart[0]);
    path.cubicTo(ptsPart[1], ptsPart[2], ptsPart[3]);
    painter.drawPath(path);
    }
}
 
void Widget::mousePressEvent(QMouseEvent *event)
{
    if (movingIdx == -1 && event->button() == Qt::LeftButton) {
        movingIdx = pointIdx(event->pos());
        prev = event->pos();
    }
}
 
void Widget::mouseReleaseEvent(QMouseEvent *event)
{
    if (movingIdx != -1 && event->button() == Qt::LeftButton)
        movingIdx = -1;
}
 
void Widget::mouseMoveEvent(QMouseEvent *event)
{
    if (movingIdx != -1) {
        pts[movingIdx] += (event->pos() - prev);
        updatePart();
        prev = event->pos();
        update();
    } else {
        int idx = pointIdx(event->pos());
        if (idx != overIdx)
            update();
        overIdx = idx;
    }
}
 
int Widget::pointIdx(const QPointF& p)
{
    for (int idx = 0; idx < pts.size(); ++idx) {
        if (QLineF(p, pts[idx]).length() <= 1.2*r)
            return idx;
    }
    return -1;
}
 
void Widget::updatePart()
{
    qreal u0 = 1.0 - t0;
    qreal u1 = 1.0 - t1;
 
    qreal x1 = pts[0].x();
    qreal y1 = pts[0].y();
    qreal x2 = pts[3].x();
    qreal y2 = pts[3].y();
    qreal bx1 = pts[1].x();
    qreal by1 = pts[1].y();
    qreal bx2 = pts[2].x();
    qreal by2 = pts[2].y();
 
    qreal qxa =  x1*u0*u0 + bx1*2*t0*u0 + bx2*t0*t0;
    qreal qxb =  x1*u1*u1 + bx1*2*t1*u1 + bx2*t1*t1;
    qreal qxc = bx1*u0*u0 + bx2*2*t0*u0 +  x2*t0*t0;
    qreal qxd = bx1*u1*u1 + bx2*2*t1*u1 +  x2*t1*t1;
 
    qreal qya =  y1*u0*u0 + by1*2*t0*u0 + by2*t0*t0;
    qreal qyb =  y1*u1*u1 + by1*2*t1*u1 + by2*t1*t1;
    qreal qyc = by1*u0*u0 + by2*2*t0*u0 +  y2*t0*t0;
    qreal qyd = by1*u1*u1 + by2*2*t1*u1 +  y2*t1*t1;
 
    ptsPart[0].setX(qxa*u0 + qxc*t0);
    ptsPart[1].setX(qxa*u1 + qxc*t1);
    ptsPart[2].setX(qxb*u0 + qxd*t0);
    ptsPart[3].setX(qxb*u1 + qxd*t1);
 
    ptsPart[0].setY(qya*u0 + qyc*t0);
    ptsPart[1].setY(qya*u1 + qyc*t1);
    ptsPart[2].setY(qyb*u0 + qyd*t0);
    ptsPart[3].setY(qyb*u1 + qyd*t1);
 
}
 
void Widget::setPart(int idx, qreal val)
{
    qreal& t = (idx == 0) ? t0 : t1;
    t = val;
    updatePart();
    update();
}
 
Widget::~Widget()
{
    delete ui;
}
main.cpp

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include "widget.h"
#include <QApplication>
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    
    QGridLayout* layout = new QGridLayout(&w);
    layout->addWidget(new QLabel("t0:"), 0, 0);
    layout->addWidget(new QLabel("t1:"), 1, 0);
    QSlider* s0 = new QSlider(Qt::Horizontal);
    QSlider* s1 = new QSlider(Qt::Horizontal);
    layout->addWidget(s0, 0, 1);
    layout->addWidget(s1, 1, 1);
    s0->setRange(0, 100);
    s1->setRange(0, 100);
    Widget* widget = new Widget();
    layout->addWidget(widget, 2, 0, 1, 2);
    QObject::connect(s0, SIGNAL(valueChanged(int)), widget, SLOT(setT0(int)));
    QObject::connect(s1, SIGNAL(valueChanged(int)), widget, SLOT(setT1(int)));
    s0->setSliderPosition(20);
    s1->setSliderPosition(75);
    
    w.resize(800, 600);
    w.show();
 
    return a.exec();
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.10.2019, 13:22
Ответы с готовыми решениями:

Assert failure in qlist
При дебаге вылетает ошибка

Вызов хранимой процедуры в Oracle с параметрами QList<double>, QList<QDateTime>, QList<quint64>
Добрый день, уважаемые форумчане. Необходимо в хранимую процедуру в Oracle передать параметры,...

Ошибка при запуске ASSERT: "d" in file . , line 120. Все, что есть внутри
Полный текст ошибки: Запускается...

Qt failure in QList
QList&lt;elective&gt; listOfElective и Student student объявлены в main как глобальные ошибка...

4
183 / 175 / 57
Регистрация: 25.09.2014
Сообщений: 828
08.10.2019, 12:43 2
Лучший ответ Сообщение было отмечено Fedor373 как решение

Решение

Сходу в коде я проблемы не вижу. А значит могу тебе посоветовать провести инициализацию твоих переменных типов int и qreal, ибо не инициализировать переменные - плохо и опасно. Не исключено, что где-то вызывается функция с одной из этих переменных дефолтного значения и потом это значение где-то используетсяЮ что приводит к ошибкам из-за неожиданных данных.
А программа по сути ругается, что где-то идет обращение к индексу листа, которого нет. Обращаешься или в меньше 0 или в больше 3.
1
5 / 5 / 0
Регистрация: 19.02.2018
Сообщений: 76
08.10.2019, 13:36  [ТС] 3
Горбаг,
Цитата Сообщение от Горбаг Посмотреть сообщение
А программа по сути ругается, что где-то идет обращение к индексу листа, которого нет. Обращаешься или в меньше 0 или в больше 3.
Тоже так понял, но никак не могу найти, в каком месте идёт обращение к несуществующим индексам.

Добавлено через 3 минуты
Цитата Сообщение от Горбаг Посмотреть сообщение
инициализацию твоих переменных типов int и qreal,
Здесь немного вас не понял. qreal и так же идёт как тип и переменные этого типа инициализированы. Тоже самое и с int.
0
183 / 175 / 57
Регистрация: 25.09.2014
Сообщений: 828
08.10.2019, 13:54 4
qreal t0, t1;
int movingIdx;
int overIdx;

Я вижу, что ты их объявил. Но ты не присвоил им стартовые значения в конструкторе класса. При первом использовании там мусор. Любое значение.
1
5 / 5 / 0
Регистрация: 19.02.2018
Сообщений: 76
08.10.2019, 14:11  [ТС] 5
Горбаг, Большое спасибо, помогло!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.10.2019, 14:11

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

QList<QList<QRgb>> ошибка с вложенными списками
Пишу класс, который будет производить операции над изображением (пока только обрезка пустых полей)....

список списков QList<QList<int>>
QList&lt;QList&lt;int&gt;&gt; results = FactorsComb(n); QList&lt;QList&lt;int&gt;&gt;::iterator Iter1; ...

Получаю ошибку ASSERT "i >=0" in file
Здравствуйте! У меня возникает вышеуказанная ошибка, вот полный ее текст: 15:50:32: Запускается...

QList<QList<Type> >
Можно ли делать так? #include &lt;QCoreApplication&gt; #include &lt;QDebug&gt; class test { public: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.