5/06/2014

ASSERT: "uint(i) < uint(size())" in file bla.. bla.., line bla.. in Qt

Hope you know these days I'm trying Qt\C++. Today I spent lot of my valuable time for solve the error mentioned in the title (ASSERT: "uint(i) < uint(size())" in file bla.. bla.., line bla..). It is run time error and I tried lot to find what was happening. At that time I have no knowledge about the 'Q_ASSERT' also.

A one bug hidden inside below code. Can you find it?


for (int row = 0; row < heights().count(); ++row)
        {
            for (int col = 0; col < ampererates().count(); ++col)
            {
                QModelIndex index = item_model->index(row,col,QModelIndex());
                no_of_components = item_model->data(index).toString();

                if(no_of_components.toInt()>0)
                {
                    height = heights().at(row);
                    ampererates = ampererates.at(col);
                    item_details.clear();
                    item_details.append(QString::number(selected_width));
                    item_details.append(height);
                    item_details.append(amperate);
                    item_details.append(no_of_components);

                    selected_components.append(item_details);
                }
            }
        }

I know it is very difficult to found a bug without the whole story. But I'm writing this post to anyone who got the same problem as a beginner like me and detail about my thinking pattern.

As a first step I put qDebug() s intermediate of the lines. And I found the bug in below line.
ampererates = ampererates.at(col); 

Then I thought what type of error it was. It mentioned something about sizes. Sizes?? something about arrays or List..?? Then I thought if there is no error in count() of the same list. Why it was informing error like out of bound?
for (int col = 0; col < ampererates().count(); ++col) Working fine.
ampererates = ampererates.at(col); ++col) Not working

Variable ampererates is QString. And ampererates() is QStringList. Ohh.. Shit.. I missed the brackets. Solution founded. I was trying to read a char from QString instead of read string from QStringList. There is no guarantee that index position is valid.

Then I checked what .at() doing in different classes. As mentioned in there class references.

const QChar QString::at ( int position ) const

Returns the character at the given index position in the string.
The position must be a valid index position in the string (i.e., 0 <= position < size()).

const T & QList::at ( int i ) const

Returns the item at index position i in the list. i must be a valid index position in the list (i.e., 0 <= i < size()).
This function is very fast (constant time).

QStringList inhereted from QList.

OK. Thinks this is help somebody to solve same issue. I'm going to learn further what 'Q_ASSERT' do.

Thanks for reading. Have a nice day.