Сбой приложения C ++ по неизвестной причине? - PullRequest
0 голосов
/ 06 августа 2020

Я не знаю почему, но мое приложение QT вылетает каждый раз в комментарии //Error (в последней функции файла. cpp). Вы знаете почему? У меня, к сожалению, нет отладчика здесь: /

ServerSys. cpp

#include "ServerSys.hpp"
#include "ui_ServerSys.h"
#include "ServerNet.hpp"
#include <iostream>
#include <iomanip>
#include <sstream>
#include <math.h>
#include <algorithm>
#include <QDesktopWidget>

Ui::ServerSys *serverSys;

ServerSys::ServerSys(QWidget *parent) : QMainWindow(parent), ui(new Ui::ServerSys)
{
    ui->setupUi(this);
    serverSys = ui;
    this->setFixedSize(QSize(811, 521));
    this->setGeometry(QApplication::desktop()->screen()->rect().center().x() / 2, 500, 811, 521);
}

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

void ServerSys::sendData()
{
    std::vector<long long> decTokens(8);
    std::vector<std::string> binTokens(8);
    std::vector<bool> binLabel;
    long long decLabel;

    getData(decTokens);
}

void ServerSys::getData(std::vector<long long> &decTokens)
{


    //Error
    decTokens[0] = stoll(serverSys->lineEdit_label_270->text().toStdString());


    decTokens[1] = stoll(serverSys->lineEdit_sdi_270->text().toStdString());
    decTokens[2] = stoll(serverSys->lineEdit_distance_270->text().toStdString());
    decTokens[3] = stoll(serverSys->lineEdit_lsb_270->text().toStdString());
    decTokens[4] = stoll(serverSys->lineEdit_msb_270->text().toStdString());
    decTokens[5] = 0;
    decTokens[6] = stoll(serverSys->lineEdit_ssm_270->text().toStdString());
    decTokens[7] = stoll(serverSys->lineEdit_parity_270->text().toStdString());
}

ServerSys.hpp

#ifndef SERVERUI_HPP
#define SERVERUI_HPP

#include <QMainWindow>
#include <vector>
#include <string>

QT_BEGIN_NAMESPACE
namespace Ui
{
    class ServerSys;
}
QT_END_NAMESPACE

class ServerSys : public QMainWindow
{
    Q_OBJECT

public:
    ServerSys(QWidget *parent = nullptr);
    ~ServerSys();
    void sendData();

private:
    Ui::ServerSys *ui;
    void getData(std::vector<long long>&);
};

#endif // SERVERUI_HPP

Поскольку я пытался отлаживать его вручную с помощью

std::string test = serverSys->lineEdit_label_270->text().toStdString();
std::cout << test << std::endl;

приложение не вылетело, но test ничего не было и не было выхода. Для всех тестов я, разумеется, написал некоторые числа в поле редактирования строки, например 123.

1 Ответ

2 голосов
/ 06 августа 2020

std::stoll вызывает исключение std::invalid_argument, когда преобразование невозможно. Скорее всего, у вас возникла ошибка sh, особенно если другой ваш тест показал, что строка уже пуста.

Ui::ServerSys *serverSys; в качестве глобальной переменной - это действительно странная вещь, если у вас уже есть ui как переменная-член, доступная в той же области, но по крайней мере эта не должна вызывать никаких проблем, пока действительно существует только один ServerSys экземпляр ever .

Что на самом деле пошло не так? Есть два возможных варианта:

  • sendData() был вызван для экземпляра ServerSys, который уже был удален. Учитывая код, вы бы не заметили другого, кроме как при попытке чтения из потенциально свободного экземпляра виджетов в вашем Ui::ServerSys экземпляре.
  • У вас есть больше правок строк в той форме, которую вы намеревались, и вы читаете не те. Дважды проверьте в дизайнере, действительно ли виджеты имеют то же имя, что и вы.

В любом случае, QString имеет полезный метод toLongLong(), который не использует исключения, поэтому вам действительно стоит использовать его напрямую, а не объездным try { std::stoll([...].toStdString()) } catch(...).

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