Showing posts with label Qt. Show all posts
Showing posts with label Qt. Show all posts

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.

11/20/2013

d-pointer in Qt


My dear friends, How are you? Nice to see you after such a long time.  Nowadays I'm slightly moving to the Qt and hope to publish posts about it.   So let's move to the post.  Actually This is warm-up post ;)

D-pointer or opaque pointer  technique can be called as a design pattern.  According to the Wikipedia this technique same as Bridge pattern and sometimes  referred to as handle classes, the Pimpl idiom, Compiler firewall idiom or Cheshire Cat.

With d-pointer programmers gain some advantages.

1. Can be created simple interfaces.
2. Hide the implementation details of an interface from ordinary clients.
3. Provide binary code compatibility with different versions of a shared library.

You can implement d-pointer as this.

     

// MyClass.h

class MyClass
{
public:
    MyClass();
    ~MyClass();
    // implementation methods
private:
    class MyClassPrivate *d;
};

// MyClass.cpp
class MyClassPrivate
{
    int x;
};

MyClass::MyClass()
: d(*new MyClassPrivate)
{
}

MyClass::~MyClass()
{
    delete d;
}  
 

References

 http://qt-project.org/wiki/Dpointer