我试图用矢量更改我的程序中的数组,当我使用数组时它运行良好但是当我更改它时,程序无法正常工作。 Qt说没有错误,它可以运行但是当我按下生成或计算按钮时,程序似乎失败了,我真的不知道错误在哪里
所以这是我的代码
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();
}
我目前正在学习如何使用载体,所以如果有人能帮助我,我会很高兴。
谢谢!
答案 0 :(得分:0)
您的矢量数据成员temp
是默认初始化的,因此是空的,但您将其视为不是:
temp[i] // out of bounds access, undefined behaviour.
这会触发未定义的行为。
查看好的std::vector
引用,尤其是std::vector::resize
,std::vector::push_back
,std::vector::emplace_back
以及构造函数的初始大小的整数。例如,要实例化temp
以保存24个零初始化元素,
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow),
temp(24) // init temp to hold 24 0.0f
{
....
}
之后,您可以安全地索引temp
,就像24个浮点数一样。
答案 1 :(得分:0)
如果要替换
中的固定大小的数组struct Foo {
int bar[10];
}
您最好使用std::array
:
struct Foo {
std::array<int,10> bar;
}
如果您真的想使用vector,则必须在运行时更改其大小。在构造期间,通过调整大小或在其背面添加元素:
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow),
temp(24)
{
//...
}
OR:
temp.resize(24);
for (unsigned int i = 0; i<24; i++)
{
temp[i] = mint + rand() % r;
//...
}
OR(效率较低)
for (unsigned int i = 0; i<24; i++)
{
temp.push_back(mint + rand() % r);
//...
}