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

QList<QList<QRgb>> ошибка с вложенными списками

14.05.2017, 14:30. Просмотров 1238. Ответов 2
Метки нет (Все метки)


Пишу класс, который будет производить операции над изображением (пока только обрезка пустых полей). Сначала переводил изображение в двумерный массив, но там постоянно были ошибки с памятью, да и в отладчике массивы сложно смотреть. Решил перейти к спискам и не понимаю, в чём ошибка. В классе есть поле QList<QList<QRgb>> data, с помощью append списки добавляются, но в отладчике вместо элементов этих списков написано <недоступно>, и при чтении из этих списков получаю ошибку
ASSERT failure in QList<T>::operator[]: "index out of range", file C:\Qt\5.7\mingw53_32\include/QtCore/qlist.h, line 545
Invalid parameter passed to C runtime function.
imageprocessor.h
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#ifndef IMAGECPROCESSOR_H
#define IMAGECPROCESSOR_H
#include<QImage>
#include<QList>
 
class ImageProcessor
{
public:
    ImageProcessor(const QImage& image);
    QImage getImage() const;
    ImageProcessor& cutEmpty();
    int width() const;
    int height() const;
private:
    QList<QList<QRgb>> data;
};
 
#endif // IMAGECPROCESSOR_H
imageprocessor.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
#include "imageprocessor.h"
#include <QRgb>
#include <QDebug>
 
ImageProcessor::ImageProcessor(const QImage &image)
{
    for(int i=0;i<image.height();i++){
        data.append(QList<QRgb>());
        QRgb* line=(QRgb*)image.scanLine(i);
        QString str;
        for(int j=0;j<image.width();j++){
            data[i].append(line[j]);
            str+=QString::number(data[i][j]>1)+" ";
        }
        qDebug()<<str;
    }
}
 
QImage ImageProcessor::getImage() const
{
    if(!data.size()) return QImage();
    QRgb* arrayData=new QRgb[data.size()*data.at(0).size()];
    for(int i=0;i<data.size();i++){
        for(int j=0;j<data.at(i).size();j++){
            arrayData[i*data.at(i).size()+j] = data.at(i).at(j);
        }
    }
    return QImage((uchar*)arrayData,width(),height(),QImage::Format_RGB32);
}
 
ImageProcessor &ImageProcessor::cutEmpty()
{
    bool notEmpty=false;
    //Удаление пустых строк сверху
    for(int i=height();i>=0;--i){
        for(int j=0;j<width();j++){
            if(data[i][j]!=0) notEmpty=true;
        }
        if(notEmpty) break;
        else{
            data.removeAt(i);
        }
    }
    //Удаление пустых строк снизу
    for(int i=0;i>height();i++){
        for(int j=0;j<width();j++){
            if(data[i][j]!=0) notEmpty=true;
        }
        if(notEmpty) break;
        else{
            data.removeAt(i);
        }
    }
    //Подсчёт минимальных отступов слева и справа
    int leftOffset=0,rightOffset=0;
    for(int i=0;i<data.size();i++){
        int offset=0;
        for(;offset<data[i].size(),data[i][offset]==0;offset++);
        if(--offset<leftOffset) leftOffset=offset;
        offset=0;
        for(int j=data[i].size();j>leftOffset,data[i][j]==0;j--,offset++);
        if(--offset<rightOffset) rightOffset=offset;
    }
    if(leftOffset || rightOffset){
        for(int i=0;i<data.size();i++){
            for(int j=0;j<=leftOffset;j++){
                data[i].removeFirst();
            }
            for(int j=0;j<=rightOffset;j++){
                data[i].removeLast();
            }
        }
    }
    return *this;
}
 
int ImageProcessor::width() const
{
    if(data.size()) return data[0].size();
    return 0;
}
 
int ImageProcessor::height() const
{
    return data.size();
}
0
Миниатюры
QList<QList<QRgb>> ошибка с вложенными списками   QList<QList<QRgb>> ошибка с вложенными списками  
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.05.2017, 14:30
Ответы с готовыми решениями:

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

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

'QList<QListWidgetItem*>' в 'QList<QPair<QString, QString> >*'
Перевести 'QList&lt;QListWidgetItem*&gt;' в 'QList&lt;QPair&lt;QString, QString&gt; &gt;*' ?????

Ошибка QList
int id = QFontDatabase::addApplicationFont(&quot;./font.ttf&quot;); //путь к шрифту ...

2
1 / 1 / 0
Регистрация: 12.12.2015
Сообщений: 34
14.05.2017, 18:19  [ТС] 2
С ошибкой проблему решил, действительно был выход за пределы списка в нескольких местах. А проблема с отображением вложенных списков осталась
0
зомбяк
1443 / 1104 / 313
Регистрация: 14.05.2017
Сообщений: 3,591
14.05.2017, 20:12 3
Можно попробовать сделать List указателей на QList<QRgb>, редактируемый синхронно с собственно массивом данных...

Да, в ImageProcessor::getImage() утечка памяти, нужно наверное так
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
QImage ImageProcessor::getImage() const
{
    if(!data.size()) return QImage();
    QRgb* arrayData=new QRgb[data.size()*data.at(0).size()];
    for(int i=0;i<data.size();i++){
        for(int j=0;j<data.at(i).size();j++){
            arrayData[i*data.at(i).size()+j] = data.at(i).at(j);
        }
    }
    QImage image((uchar*)arrayData,width(),height(),QImage::Format_RGB32)
    delete[] arrayData;
    return image;
}
или вовсе сделать из arrayData QVector<QRgb>.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.05.2017, 20:12

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

Ошибка: invalid conversion from 'int' to 'QList<int>::Node*'
ошибка: invalid conversion from 'int' to 'QList&lt;int&gt;::Node*' .h private: QList&lt;int&gt;...

QList
Может дуратский вопрос, но все же. Когда добавляешь объект в QList он туда копируется или там...

QList в QList
Для удобства прикрепил рисунок, там наглядно видно что и как работает, словами проблематично, но...

QList
Интересует такой вопрос: у меня имеется класс M class M { private: int a,b; public: ...


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

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

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