2015-03-24 3 views
0

Я попытался изменить массив в моей программе с помощью вектора, он работал хорошо, когда я использовал массив, но когда я его изменяю, программа не работает правильно. 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

Ваш член 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 поплавков.

+0

это работает благодаря –

0

Если вы хотите заменить массив фиксированного размера, как в

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; 
    //... 
} 

ИЛИ (менее эффективный)

for (unsigned int i = 0; i<24; i++) 
{ 
    temp.push_back(mint + rand() % r); 
    //... 
} 
+0

Это работает благодаря –