i tried to change the array in my program with vector,it was working well when i used array but when i change it, the program cant work properly. Qt says no error and it could run but when i press the generate or the calculate button the program seems to fail and i don't really know where the mistakes are
so here are my codes
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <math.h>
#include <vector>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
int r, maxt, mint;
std::vector<float> temp;
float avg, sd;
private:
Ui::MainWindow *ui;
public slots:
void min();
void max();
void calc();
void gen();
};
#endif // MAINWINDOW_H
main.cpp
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.setWindowTitle("Arfyan Rabbani");
w.show();
return a.exec();
}
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
connect (ui->Calculate,SIGNAL (clicked()),this,SLOT(calc()));
connect (ui->Generate,SIGNAL (clicked()),this,SLOT(gen()));
connect (ui->MaxSlider,SIGNAL (valueChanged(int)),this,SLOT(max()));
connect (ui->MinSlider,SIGNAL (valueChanged(int)),this,SLOT(min()));
maxt=37;
mint=25;
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::calc()
{
float totaltemperature = 0;
for (unsigned int i=0;i<24;i++)
totaltemperature = totaltemperature + temp[i];
avg = totaltemperature/24;
QString average = QString ("Average = %1").arg(avg);
ui->textBrowser_calc->setText(average);
float stdev=0;
for (unsigned int i=0;i<24;i++)
stdev = stdev + pow((temp[i]-avg),2);
sd = sqrt(stdev/24);
QString stand = QString ("Standard Deviation = %1").arg(sd);
ui->textBrowser_calc->append(stand);
}
void MainWindow::gen()
{
r = maxt-mint+1;
ui->textBrowser_data->setText("Temperature of The Room");
for (unsigned int i=0;i<24;i++)
{
temp[i]= mint+rand()%r;
QString t = QString ("Height %1 = %2").arg(i+1).arg(temp[i]);
ui->textBrowser_data->append(t);
}
}
void MainWindow::max()
{
maxt = ui->MaxSlider->value();
}
void MainWindow::min()
{
mint = ui->MinSlider->value();
}
i am currently learning how to use vectors, so i would be glad if someone could help me.
thanks!!
Your vector data member temp
is default-initialized and therefore empty, yet you treat as if it weren't:
temp[i] // out of bounds access, undefined behaviour.
This triggers undefined behaviour.
Have a look at a good std::vector
reference, particularly std::vector::resize
, std::vector::push_back
, std::vector::emplace_back
, and the constructor taking an integer for initial size. For example, to instantiate temp
to hold 24 zero-initialized elements,
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow),
temp(24) // init temp to hold 24 0.0f
{
....
}
After that you can safely index temp
as you would an array of 24 floats.