将数组转换为向量,我得到了一些未检测到的错误
Posted
技术标签:
【中文标题】将数组转换为向量,我得到了一些未检测到的错误【英文标题】:transforming arrays into vectors and i got some undetected errors 【发布时间】:2015-03-24 10:23:56 【问题描述】:我尝试用向量更改程序中的数组,当我使用数组时它运行良好,但是当我更改它时,程序无法正常运行。 Qt 说没有错误,它可以运行,但是当我按下生成或计算按钮时,程序似乎失败了,我真的不知道错误在哪里
这是我的代码
主窗口.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();
主窗口.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();
我目前正在学习如何使用向量,所以如果有人可以帮助我,我会很高兴。
谢谢!!
【问题讨论】:
【参考方案1】:您的矢量数据成员 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 个浮点数的数组一样。
【讨论】:
【参考方案2】:如果要替换固定大小的数组,如
struct Foo
int bar[10];
你最好使用std::array
:
struct Foo
std::array<int,10> bar;
如果你真的想使用矢量,你必须在运行时改变它的大小。在构建过程中,通过调整大小或在其背面添加元素:
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow),
temp(24)
//...
或者:
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);
//...
【讨论】:
以上是关于将数组转换为向量,我得到了一些未检测到的错误的主要内容,如果未能解决你的问题,请参考以下文章