QT упал во время работы - PullRequest
0 голосов
/ 27 июня 2018

Я пытаюсь загрузить некоторые данные из файла во вложенный список. Тем не менее, приложение упало во время загрузки данных. Я обнаружил, что при добавлении данных в мой внутренний список произошел сбой кода. Может кто-нибудь, пожалуйста, помогите мне понять, что случилось и как это исправить? Спасибо.

заголовочный файл (snp_plotter.h)

#ifndef SNP_PLOTTER_H
#define SNP_PLOTTER_H

#include <QMainWindow>

#include "QList"
#include <QtCharts/QChartGlobal>

QT_CHARTS_BEGIN_NAMESPACE
class QLineSeries;
class QChart;
QT_CHARTS_END_NAMESPACE
QT_CHARTS_USE_NAMESPACE

namespace Ui {
class SNP_Plotter;
}

class SNP_Plotter : public QMainWindow
{
    Q_OBJECT

public:
    explicit SNP_Plotter(QWidget *parent = 0);
    ~SNP_Plotter();

private slots:
    void on_openSnpFile_clicked();

private:
    Ui::SNP_Plotter *ui;
    QString nPorts;
    QString currentFile;
    QString snpData;
    QString snpHeader;
    QString domainType; //freq or time
    QString measureMethod; // s,y,abcd, etc
    QString measureType; // real+img, log+angl or linear+angl
    QString referenceImp; // system impd
    QList<QVector<double>*> listVector; //data list with [[][][]]
};

#endif // SNP_PLOTTER_H

код (main.cpp):

#include "snp_plotter.h"
#include "ui_snp_plotter.h"
#include "QFile"
#include "QFileDialog"
#include "QTextStream"
#include "QMessageBox"
#include "QDebug"
#include "QRegularExpression"
#include "QRegularExpressionMatch"
#include <QQueue>
#include <QList>
#include <QList>

SNP_Plotter::SNP_Plotter(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::SNP_Plotter)
{
    ui->setupUi(this);
    this->setCentralWidget(ui->verticalLayoutWidget);
}

SNP_Plotter::~SNP_Plotter()
{
    delete ui;
}

void SNP_Plotter::on_openSnpFile_clicked()
{
    // clean up the currntfile cache
    QString openFile = QFileDialog::getOpenFileName(this,
                                       tr("Open SNP file"),
                                       "/usr",
                                       "SNP(*.s*p)"
                                       );

    //extract number of ports
    QRegularExpression snpFormat(".s(\\d+)p");
    QRegularExpressionMatch match0 = snpFormat.match(openFile);
    nPorts = match0.captured(1);
    qint8 numberItems = 2*(nPorts.toInt()*nPorts.toInt())+1;
//    listVector = new QList<QList<double>*>(numberItems);

    for(auto i=0; i<numberItems; i++){
        QVector<double> *vector = new QVector<double>(1000);
        listVector.push_back(vector);
    }

    //open file
    QFile file(openFile);
    if (!file.open(QIODevice::ReadOnly | QFile::Text)) {
        QMessageBox::warning(this, "Warning", "Cannot open file: " + file.errorString());
        return;
    }


     QTextStream dataReading(&file);

     qint8 counter = 0;
     QRegularExpression headerFormat("#\\s+(\\w+)\\s+(\\w+)\\s+(\\w+)\\s+(\\w+)\\s+(\\w+)");
     QRegularExpression dataFormat("([^ ][-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?)");
     QString currentLine;
     while(!dataReading.atEnd()){
        //start a new line in the file
        currentLine = dataReading.readLine();

        //type of lines to skip
        if((currentLine[0]=="\x0")||(currentLine[0]=="!") ){continue;}

        //data extraction and insertion
        else if((currentLine[0]!="#")&&(currentLine[0]!="!")){
            QRegularExpressionMatchIterator dataList = dataFormat.globalMatch(currentLine);
            while(dataList.hasNext()){
                QRegularExpressionMatch matchedData = dataList.next();
                QString data = matchedData.captured(1);
                qInfo()<<data;
                listVector[counter%numberItems]->push_back(data.toDouble());  //crashed in this line 
                counter += 1;
            }
        }

        //header type extraction
        else if ((currentLine[0]=="#")) {
            QRegularExpressionMatch match2 = headerFormat.match(currentLine);
            domainType = match2.captured(1);
            measureType = match2.captured(2);
            measureMethod = match2.captured(3);
            referenceImp = match2.captured(5);
        }
     }
     qInfo()<<(listVector)[0]->size();
    // extraction completed, close file
     file.close();
}

данные, которые я пытаюсь использовать

! S3P File: Measurements: Mag<S11> Ang<S11> Mag<S12> Ang<S12> Mag<S13> Ang<S13>! row 1 
!             Mag<S21> Ang<S21> Mag<S22> Ang<S22> Mag<S23> Ang<S23>! row 2 
!             Mag<S31> Ang<S31> Mag<S32> Ang<S32> Mag<S33> Ang<S33>! row 3 



# Hz S  dB   R 50
10000000 -52.282864 83.754532 -15.67896 -0.49186572 -1.5670134 -1.301762
-15.748223 -0.10280456 -50.764286 149.86646 -56.900387 -70.843872
-1.5776229 -1.2955924 -71.374367 -141.70441 -48.866203 65.932648
29987500 -60.731289 51.972256 -15.724875 -1.8122723 -1.5746148 -3.2653806
-15.716247 -1.8535374 -52.617325 178.46486 -62.476551 5.2978568
-1.5735339 -3.2886419 -65.686714 36.462376 -61.792774 9.9133005
49975000 -64.386765 2.9596229 -15.755823 -3.1201222 -1.5706615 -5.4831181
-15.738674 -3.0600834 -52.237274 169.75545 -58.964714 27.526367
-1.5741955 -5.4729681 -58.479481 47.793446 -56.108696 63.561378
69962500 -60.896507 -36.51757 -15.757278 -4.3601637 -1.577867 -7.6754441
-15.747104 -4.3896055 -50.548729 177.66254 -57.043007 9.1148758
-1.5749472 -7.6169047 -56.500164 6.8388286 -57.866039 -28.409134
89950000 -55.328976 -45.191593 -15.76739 -5.6117945 -1.5797645 -9.8418713
-15.749889 -5.5769963 -50.809414 173.62177 -57.651119 -0.7305429
-1.5803487 -9.7842817 -56.621773 5.4209571 -66.583694 23.118269
109937500 -60.013988 -42.251778 -15.770485 -6.7288284 -1.5785085 -12.021818
-15.764176 -6.7430348 -51.211327 170.20062 -56.137653 -1.5785257
-1.5805914 -11.985991 -55.860668 0.92532599 -58.335781 15.83968
129925000 -55.2337 -47.264515 -15.773083 -7.9232988 -1.5834771 -14.20496
-15.74941 -7.9423704 -52.448433 166.58505 -57.46785 -5.3259425
-1.5812542 -14.161623 -57.962692 0.68304181 -66.230148 -5.397459
149912500 -52.218529 -63.591721 -15.763268 -9.1296005 -1.5826913 -16.37332
-15.770909 -9.0827551 -51.982231 165.33054 -56.151371 -14.161432
-1.586452 -16.33128 -56.938805 -20.056446 -57.895336 -49.978813
169900000 -48.723946 -68.877541 -15.772202 -10.29782 -1.58857 -18.537006
-15.756567 -10.253307 -53.100327 166.75829 -57.286308 -21.661839
-1.5859301 -18.455862 -58.19286 -23.011927 -56.403473 -61.177219
189887500 -47.055653 -63.976929 -15.761551 -11.486256 -1.5892707 -20.66897
-15.756705 -11.417432 -52.570255 161.31961 -58.11451 -14.260036
-1.589681 -20.645853 -58.313042 -19.368044 -56.06601 -59.461319
209875000 -48.199955 -65.147034 -15.758836 -12.678895 -1.5931528 -22.858885
-15.750708 -12.633892 -54.576355 159.43607 -57.476353 -23.090178
-1.5905892 -22.808754 -57.229259 -22.673452 -53.756973 -77.388786
229862500 -47.620575 -65.079559 -15.761273 -13.856562 -1.5960027 -24.995838
-15.757499 -13.857363 -54.944546 168.24443 -57.51046 -25.383596
-1.5932056 -24.973335 -56.755974 -24.434172 -53.588017 -78.209816
249850000 -45.54829 -72.373695 -15.759305 -15.106434 -1.5959594 -27.192209
-15.754061 -15.04305 -56.757584 167.29137 -57.757648 -35.331924
-1.593374 -27.133352 -57.15892 -38.918037 -52.251003 -78.6092
269837500 -45.209282 -79.048836 -15.762296 -16.186449 -1.595193 -29.34836
-15.761364 -16.268795 -56.31012 155.37877 -58.96965 -36.80077
-1.6012613 -29.305353 -58.892376 -30.59782 -51.139919 -88.653198
289825000 -44.495762 -75.946327 -15.77701 -17.442837 -1.5954289 -31.487225
-15.759547 -17.546104 -57.791164 136.05252 -58.239506 -44.324471
-1.6040369 -31.49972 -58.461231 -38.748329 -50.686073 -102.10234
309812500 -43.302803 -82.000542 -15.766918 -18.634033 -1.5996813 -33.661705
-15.761863 -18.641865 -61.730743 144.8166 -60.559978 -37.826778
-1.6024027 -33.65374 -57.697384 -42.566422 -51.518753 -105.38393
329800000 -43.696449 -78.707024 -15.772308 -19.829834 -1.6114002 -35.827797
-15.758872 -19.892492 -61.704247 131.07913 -60.35778 -39.423588
-1.6023126 -35.767818 -59.314335 -32.67252 -52.212837 -96.09478
349787500 -41.770233 -79.74221 -15.764846 -21.037899 -1.6063002 -37.965122
-15.761175 -21.141983 -67.287781 106.3756 -59.302685 -45.419971
-1.6093071 -37.931061 -58.065773 -47.054985 -50.113159 -100.45293
369775000 -41.834766 -85.074005 -15.755595 -22.26008 -1.6062098 -40.106232
-15.755444 -22.253096 -67.486336 95.830017 -60.84161 -46.56329
-1.6086895 -40.089161 -59.786545 -45.948189 -49.895309 -123.41199
389762500 -40.628685 -85.450836 -15.762123 -23.489182 -1.6093255 -42.268429
-15.763054 -23.396936 -68.248146 81.470787 -60.379967 -55.129562
-1.608591 -42.201767 -61.377071 -50.809517 -50.866241 -127.41563
409750000 -40.523582 -86.431625 -15.7611 -24.674004 -1.6127316 -44.40868
-15.759981 -24.647635 -75.545479 166.72386 -58.76609 -50.209095
-1.6096529 -44.381767 -58.312939 -53.500042 -50.608158 -125.55299
429737500 -39.49865 -87.925888 -15.768126 -25.870119 -1.6137398 -46.560898
-15.756283 -25.906502 -74.112823 -93.561935 -59.226101 -58.54623
-1.6217877 -46.567924 -59.321663 -53.369888 -48.844105 -125.06399

программа будет работать и обрабатывать данные до строки

129925000 -55.2337 -47.264515 -15.773083 -7.9232988 -1.5834771 -14.20496
-15.74941 -7.9423704 -52.448433 166.58505 -57.46785 -5.3259425
-1.5812542 -14.161623 -57.962692 0.68304181 -66.230148 -5.397459

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

У вас слишком много двойных значений, чтобы прочитать все из них, используя тип qint8 в качестве счетчика. counter имеет тип qint8, поэтому вы можете хранить целые числа со знаком в диапазоне [-128,127], когда вы назначаете значение больше 127 ( в вашем файле больше двойных значений, чем 127) к вашей переменной counter она рассматривается как отрицательное число, и сбой вашего приложения при вызове оператора индекса, потому что counter%numberItems - отрицательное значение.

listVector[counter%numberItems]->push_back(data.toDouble()); // accessing list item with negative index

Измените counter на более широкий целочисленный тип, например, qint32 или сбросьте значение counter где-то в вашем коде, чтобы избежать переполнение значения int.

0 голосов
/ 27 июня 2018

Итак, во-первых, вы выделяете много кучи памяти, даже не очищая ее впоследствии. Каждый из этих new операторов без соответствующего удаления приведет к утечке памяти.

Также, если преобразование nPorts.toInt() завершится неудачно или проанализирует неправильно, вы получите numberItems, равный чему-то странному. Затем вы используете это число для выделения listVector, предполагая, что оно будет иметь ожидаемый вами размер. Затем работайте непосредственно с ним с помощью операторов нижнего индекса, не проверяя фактический размер объекта или число, которое вы использовали для его выделения.

Доступ к динамически размещаемому объекту с использованием подобных операторов, без проверки фактического размера, может привести к сбою вашей программы.

Я полагаю, что ваша проблема связана с этой строкой: (edit: изначально не читал комментарий к этой строке, но рад, что вы это знаете. Это усиливает мои подозрения.)

listVector[counter%numberItems]->push_back(data.toDouble()); //crashed in this line

И это потому, что вы получаете ошибку сегментации при превышении границ вашего объекта listVector, который не соответствует ожидаемому размеру. Я могу ошибаться, но есть кое-что, что нужно начать расследовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...