crash aplikacji w funkcji biblioteki Qt - QGridLayout::rowCount()?

0

Mam oto taki kawałek kodu:

//...

    static const int BUTTONS_IN_ROW =4;
    static const int BUTTONS_IN_COLUMN =4;
    // number of pseudo random operations on children
    static const unsigned int MIX_OPERATIONS = 500;

    QGridLayout * m_buttonsGrid;

//...
void Przesuwanka::mixButtons()
{
    //...

    qDebug() << "Przed inicjalizacja zmiennych" <<endl;
    int firstItemRow = 0;
    int firstItemColumn = 0;
    QLayoutItem * firstItem;

    int secondItemRow = 0;
    int secondItemColumn = 0;
    QLayoutItem * secondItem;

qDebug() << "Po inicjalizacji zmiennych" << endl
                << "Przed petla do zmiany pozycji" << endl;

    for(unsigned int operation =0; operation < MIX_OPERATIONS; operation++)
    {

        qDebug() << "Przed petla losujaca pozycje" << endl;

        do
        {
            firstItemRow = rand() % BUTTONS_IN_ROW;
            firstItemColumn = rand() % BUTTONS_IN_COLUMN;
            secondItemRow = rand() % BUTTONS_IN_ROW;
            secondItemColumn = rand() % BUTTONS_IN_COLUMN;
        }while(secondItemRow == firstItemRow && secondItemColumn == firstItemColumn);

        qDebug() << "Po petli losujacej pozycje" << endl; // !!OSTATNI KOMUNIKAT!!

        qDebug() << "rowCount = " << m_buttonsGrid->rowCount() << endl;  // !!!TUTAJ!!!
        qDebug() << "columnCount = " << m_buttonsGrid->columnCount() << endl;

        Q_ASSERT(firstItemRow < m_buttonsGrid->rowCount());
        Q_ASSERT(firstItemColumn < m_buttonsGrid->columnCount());

        qDebug() << "Przypisywanie do zmiennych first i second item" << endl;

        firstItem = m_buttonsGrid->itemAtPosition(firstItemRow,firstItemColumn);

	//...
}

To jest kawałek kodu, który chciałem zdebugować. Program dochodzi do wyświetlenia komunikatu "Po petli losujacej pozycje", a następnie dostaję komunikat, że
aplikacja niespodziewanie się zakończyła.

Po usunięciu wywołań funkcji:

        qDebug() << "rowCount = " << m_buttonsGrid->rowCount() << endl; 
        qDebug() << "columnCount = " << m_buttonsGrid->columnCount() << endl;

nie dostaję komunikatu "przypisywanie do zmiennych...", które pojawiło by się w wyniku wykonania:

	qDebug() << "Przypisywanie do zmiennych first i second item" << endl;

Tylko ten sam błąd, że aplikacja niespodziewanie się zamknęła.
Ale nie dostaję też żadnego komunikatu z assercji QT_ASSERT():

        Q_ASSERT(firstItemRow < m_buttonsGrid->rowCount());
        Q_ASSERT(firstItemColumn < m_buttonsGrid->columnCount());

Wygląda to tak, jakby program się psuł w funkcji rowCount, ale jest to funkcja biblioteczna, więc nie mogę jej zmienić w żaden sposób. Jest też mało prawdopodobne, żeby
naprawdę to była wina funkcji bibliotecznej, więc pewnie to ja coś napaskudziłem, ale nie mam pojęcia co to może być.

Jest to tylko kawałek programu, bo całość trochę zajmuje, jednak w razie potrzeby wkleję to, co potrzebne.

Z góry dziękuję za pomoc :)

1

m_buttonsGrid jest niezainicjowane.

1

Nie zainicjalizowałeś m_buttonsGrid

@spartanPAGE szybszy byłeś :)

0

Inicjalizacja znajduje się w konstruktorze i zapomniałem ją wkleić. Najmocniej przepraszam.

QGridLayout* m_buttonsGrid = new QGridLayout;

http://4programmers.net/Pastebin/3344 <- konstruktor
http://4programmers.net/Pastebin/3345 <- funkcja, która jest wywoływana przez konstruktor i powoduje błąd

tutaj jest cały kod konstruktora i funkcji która wywołuje błąd. Przepraszam za wszelkie popisane głupoty, dopiero uczę się Qt :)

2

Najlepiej by było, gdybyś podał cały kod klasy. Z podanych kawałków wynika, ze masz 2 wskaźniki o nazwie m_buttonsGrid na obiekt QGridLayout: jeden w samej klasie i 1 w konstruktorze. Inicjalizujesz obiekt na wskaźniku w konstruktorze, a nie w klasie.
Jeżeli się mylę, to mnie poprawcie :)

0

http://4programmers.net/Pastebin/3345 <-- przesuwanka.cpp
http://4programmers.net/Pastebin/3346 <-- przesuwanka.h

Ogólnie appka to ćwiczenie z książki ma to być mniej więcej coś takiego, że jest sobie układ przycisków 1,2,3..., które są wymieszane
użytkownik ma je pozamieniać tak, żeby były ułożone w kolejności a potem wyświetlić odpowiedni komunikat. Nie wszystko tutaj jest jeszcze zrobione, więc proszę
tylko o sprawdzenie konstruktora i tej nieszczęsnej funkcji. Dziękuję za chęci i szybkie odpowiedzi :)

0

Kurcze, faktycznie mam 2 zmienne o tej samej nazwie jedna lokalna druga jako pole w klasie. Nie zauważyłem tego i się głowiłem ciężko o co chodzi. Bardzo Wam dziękuję.

1 użytkowników online, w tym zalogowanych: 0, gości: 1