将数组转换为向量,我得到了一些未检测到的错误

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::resizestd::vector::push_backstd::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);
    //...

【讨论】:

以上是关于将数组转换为向量,我得到了一些未检测到的错误的主要内容,如果未能解决你的问题,请参考以下文章

将检测到的 2D 地图调整为参考 2D 地图

使用递归策略将数组转换为二叉树

如何将 json 字符串转换为 ko.observableArray([]),他们得到一个错误数据未定义?

子弹物理和 OpenGL 将方向转换为前、上和右

转换向量索引超出数组边界 - matlab

旋转矩阵未正确应用于向量