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?
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.