LINUX.ORG.RU

Проблема с QList (QT 4.3.1)


0

0

Доброго времени суток.
У меня проблема со следующим кодом:

QList<QList<int> >*xdata=new QList<QList<int> >;
xdata->push_back(QList<int>());
xdata->last()<<5646<<56456<<56489<<566;

for(int j=0,i=0;j<xdata->at(i).count();j++){
xdata->at(i)[j]+666;
if(j)qDebug()<<j<<": "<<xdata->at(i)[j]<<" - "<<xdata->at(i)[j-1];
}

По логике начиная с 1-го элемента должно выводиться построчно:
номер: текущий элемент - предыдущий элемент.
Фактически выводится
номер: текущий элемент - 1

Оптимизация отключена, строка `xdata->at(i)[j]+666;` фактически ничего не делает, обращается к элементу. Вместо нее можно выполнить например сравнение с числом. Если эту строку закомментировать, программа работает 'как надо'.

Если выводить начиная со второго элемента так:
if(j>1)qDebug()<<j<<": "<<xdata->at(i)[j]<<" - "<<xdata->at(i)[j-2];
программа опять же работает правильно.

Пробовал проводить абсолютно такие же телодвижения со своим списком - проблем нет.

Проблема наблюдается под Linux, в windows работает нормально.

Что делать и кто виноват?)

★★★★★

Всё работает.

[alex:alex ql]$ cat main.cpp
#include <QList>

#include <iostream>

int main(int argc, char **argv)
{
    QList<QList<int> > *xdata = new QList<QList<int> >;

    xdata->push_back(QList<int>());

    xdata->last() << 1 << 2 << 3 << 4;

    for(int j = 0,i = 0;j < xdata->at(i).count();j++)
    {
        if(j)
            std::cerr << j << ": " << xdata->at(i)[j] << " - " << xdata->at(i)[j-1] << std::endl;
    }

    std::cerr << std::endl;

    return 0;
}

[alex:alex ql]$ ./ql
1: 2 - 1
2: 3 - 2
3: 4 - 3

[alex:alex ql]$ gcc --version | head -1
gcc (GCC) 3.4.6 (Debian 3.4.6-5)

Qt 4.3.3

alex_custov ★★★★★
()
Ответ на: комментарий от alex_custov

В том-то и дело, что я сам не вижу причин. Но я дал практически полный код всей программы. Вот целиком:

#include<QList>
#include<QDebug>

int main(){
QList<QList<int> >*xdata=new QList<QList<int> >;
xdata->push_back(QList<int>());
xdata->last()<<5646<<56456<<56489<<566;

qDebug()<<xdata->at(0);
for(int j=0,i=0;j<xdata->at(i).count();j++){
xdata->operator[](i)[j]+666;
if(j)qDebug()<<j<<":"<<xdata->at(i)[j]<<" - "<<xdata->at(i)[j-1];
}
qDebug()<<xdata->at(0);
return 0;
}

На выходе:
(5646, 56456, 56489, 566)
1 : 56456 - 1
2 : 56489 - 1
3 : 566 - 1
(5646, 56456, 56489, 566)

Т.е. сами данные не меняются (да и с чего бы)...

staseg ★★★★★
() автор топика
Ответ на: комментарий от staseg

$ uname -o -r && gcc --version | head -1 && qmake --version 2.6.22.9-desktop-1mdv GNU/Linux gcc (GCC) 4.2.2 20070909 (prerelease) (4.2.2-0.RC.1mdv2008.0) QMake version 2.01a Using Qt version 4.3.1 in /usr/lib/qt4/lib

staseg ★★★★★
() автор топика
Ответ на: комментарий от alex_custov

teferi@arkham:~/tmp$ ./tmp
(5646, 56456, 56489, 566)
1 : 56456  -  5646
2 : 56489  -  56456
3 : 566  -  56489
(5646, 56456, 56489, 566)

teferi@arkham:~/tmp$ gcc --version
gcc (GCC) 4.2.3 (Ubuntu 4.2.3-2ubuntu7)

teferi@arkham:~/tmp$ qmake --version
QMake version 2.01a
Using Qt version 4.3.4 in /usr/lib


попробуй поставить qt поновее. Похоже ты нарвался на какой-то старый баг.

teferiincub
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.