Qt Forum

    • Login
    • Search
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Search
    • Unsolved

    ASSERT failure in QVector<T>::operator[]: "index out of range", file ...

    General and Desktop
    4
    6
    18836
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • R
      rahmanig last edited by

      Hi everyone

      I am relatively new to Qt, and working on game of life. Can someone please help me overcome this error.

      ASSERT failure in QVector<T>::operator[]: "index out of range", file ..............\Qt\Qt5.0.1\5.0.1\mingw47_32\include/QtCore/qvector.h, line 356

      Here is the code:

      dialog.h:

      @#ifndef DIALOG_H
      #define DIALOG_H

      #include <QDialog>
      #include<QtCore>
      #include<QtGui>
      #include <QGraphicsScene>
      #include <QGraphicsRectItem>
      #include"mycell.h"
      #include "QTimer"
      #include "QVector"

      namespace Ui {
      class Dialog;
      }

      class Dialog : public QDialog
      {
      Q_OBJECT

      public:
      explicit Dialog(QWidget *parent = 0);
      ~Dialog();
      int gridSize, saveIndex;
      bool timeState;

       QVector<QVector<bool> > tempGrid;
      

      private slots:
      void on_pushButton_clicked();
      void on_pushButton_2_clicked();
      void on_pushButton_3_clicked();
      void on_pushButton_4_clicked();
      void on_comboBox_activated(int index);
      void update_grid();

      void on_pushButton_5_clicked();
      
      void on_comboBox_2_activated(int index);
      
      void on_comboBox_3_activated(int index);
      

      private:
      Ui::Dialog *ui;
      QGraphicsScene *scene;
      // myCell cellArray[100][100];
      QVector<QVector<myCell
      > > vect;

      // myCell *cell;
      QTimer *timer;
      };

      #endif // DIALOG_H

      ==========================================================================================
      dialog.cpp

      ==============================================================================================

      #include "dialog.h"
      #include "ui_dialog.h"
      #include"mycell.h"
      #include "QTimer"
      #include "thread.h"

      Dialog::Dialog(QWidget *parent) :
      QDialog(parent),
      ui(new Ui::Dialog)
      {

      ui->setupUi(this);
      //tempGrid [gridSize][gridSize];
      scene = new QGraphicsScene(this);
      ui->graphicsView->setScene(scene);
      //Dialog.resize(scene->itemsBoundingRect().size());
      
      timer = new QTimer(this);
      connect(timer, SIGNAL(timeout()), this, SLOT(on_pushButton_2_clicked()));
      
      saveIndex = 0;
      

      }

      Dialog::~Dialog()
      {
      delete ui;
      }

      void Dialog::on_pushButton_clicked() // Display button
      {

      scene->clear();
      
      timeState = true;
      ui->label->setText(ui->lineEdit->text());
      int x, y= 0;
      gridSize= 20;
      gridSize = ui->label->text().toInt();
      ui->graphicsView->resize((gridSize*10)+3,(gridSize*10)+3);
              //ui->lineEdit->setText(QString::number(gridSize));
      
      
      for (int i= 0; i<gridSize; i++){
          for(int j=0;j<gridSize;j++){
              vect[i][j]= new myCell(i*10,j*10,10);
              scene->addItem(vect[i][j]);
              //Dialog.resize(scene->addItem(vect[i][j]));
             // ui->graphicsView->setSizeIncrement(y,y);
              x+=10;
          }
          x= -100;
          y+=10;
      }
      ui->pushButton->setEnabled(true);
      ui->pushButton_2->setEnabled(true);
      ui->pushButton_3->setEnabled(true);
      

      // ui->pushButton_4->setEnabled(true);
      ui->comboBox->setEnabled(true);
      ui->pushButton_5->setEnabled(false);
      ui->comboBox_3->setEditable(true);
      ui->comboBox_2->setEnabled(true);
      on_pushButton_4_clicked();

      }

      void Dialog::on_pushButton_2_clicked() //step button
      {

      int getNeighbours = 0;
      
      for (int a=0;a<vect.size();a++)
      {
          for (int b=0;b<vect.size();b++)
          {
              tempGrid[a][b] = vect[a][b]->state;
          }
      }
      for (int x=1;x<vect.size()-1;x++)
      {
          for (int y=1;y<vect.size()-1;y++)
          {
              getNeighbours = 0;
              vect[x][y-1]->state ? getNeighbours +=1:getNeighbours +=0;
      
              vect[x+1][y]->state ? getNeighbours +=1:getNeighbours +=0;
      
              vect[x][y+1]->state ? getNeighbours +=1:getNeighbours +=0;
      
              vect[x-1][y]->state ? getNeighbours +=1:getNeighbours +=0;
      
              vect[x+1][y-1]->state ? getNeighbours +=1:getNeighbours +=0;
      
              vect[x+1][y+1]->state ? getNeighbours +=1:getNeighbours +=0;
      
              vect[x-1][y+1]->state ? getNeighbours +=1:getNeighbours +=0;
      
              vect[x-1][y-1]->state ? getNeighbours +=1:getNeighbours +=0;
              
              tempGrid[x][y]= vect[x][y]->state == true && getNeighbours < 2 ?
                          false: true;
      
      
               if (vect[x][y]->state == true && getNeighbours <=3)
              {
                  tempGrid[x][y] = true;
              }
              else if (vect[x][y]->state == true && getNeighbours > 3)
              {
                  tempGrid[x][y] = false;
              }
              else if (vect[x][y]->state == false && getNeighbours == 3)
              {
                  tempGrid[x][y] = true;
              }
      
          }
      }
      for (int a=0;a<vect.size();a++)
          for (int b=0;b<vect.size();b++)
          {
              vect[a][b]->state = tempGrid[a][b];
              vect[a][b]->update();
          }
      

      }

      void Dialog::on_pushButton_3_clicked() // Auto Step button
      {
      timer->start(100);
      // ui->pushButton_2->setEnabled(false);
      ui->comboBox_3->setEnabled(false);
      ui->comboBox->setEnabled(false);
      ui->lineEdit->setEnabled(false);
      ui->pushButton->setEnabled(false);
      ui->pushButton_5->setEnabled(false);
      ui->comboBox_2->setEnabled(false);
      ui->pushButton_4->setEnabled(true);

      }

      void Dialog::on_pushButton_4_clicked() //Pause button
      {
      timer->stop();
      ui->pushButton_2->setEnabled(true);
      ui->comboBox->setEnabled(true);
      ui->lineEdit->setEnabled(true);
      ui->pushButton->setEnabled(true);
      ui->pushButton_5->setEnabled(true);
      ui->comboBox_3->setEnabled(true);
      ui->comboBox_2->setEnabled(true);
      }

      void Dialog::update_grid()
      {
      for (int a=0;a<gridSize;a++)
      for (int b=0;b<gridSize;b++)
      vect[a][b]->update();
      }@

      I hope that does not confuse u too much. I don't know what am I doing wrong!!@@@@

      Thanks in advance

      1 Reply Last reply Reply Quote 0
      • raven-worx
        raven-worx Moderators last edited by

        @QVector<QVector<myCell*> > vect; //empty vector @
        You need to use "QVector::resize()":http://qt-project.org/doc/qt-4.8/qvector.html#resize to get around the assertion at least.

        --- SUPPORT REQUESTS VIA CHAT WILL BE IGNORED ---
        If you have a question please use the forum so others can benefit from the solution in the future

        1 Reply Last reply Reply Quote 0
        • G
          giesbert last edited by

          If you have a vector of cells (QVector<myCell>) you have to add the myCell objects. If you have a vector of pointers, you have to add the pointers. A resize is not enough.

          Nokia Certified Qt Specialist.
          Programming Is Like Sex: One mistake and you have to support it for the rest of your life. (Michael Sinz)

          1 Reply Last reply Reply Quote 0
          • R
            rahmanig last edited by

            unfortunately I cant get my head around those :/ can you be more clear. Thx.

            1 Reply Last reply Reply Quote 0
            • R
              rahmanig last edited by

              I realized that the vector is empty and that might be the reason but as soon as do this:

              @QVector<QVector<myCell*> > vect[200][200];@

              I get bunch of errors.

              1 Reply Last reply Reply Quote 0
              • JohanSolo
                JohanSolo last edited by JohanSolo

                You're trying to declare an array of QVector< QVector< myCell* > > with the given syntax... i.e. 40000 instances of QVector< QVector< myCell* > >.

                Maybe try to get a look at this first

                `They did not know it was impossible, so they did it.'
                -- Mark Twain

                1 Reply Last reply Reply Quote 0
                • First post
                  Last post