сбой программы после присвоения значений элементам массива - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть класс с именем setaddress, содержащим структуру, которая содержит 2D-массив: int WaterMeterIDs[20][2];

namespace Ui {
class SetAddress;
}

class SetAddress : public QDialog
{
    Q_OBJECT

public:
    struct AddressList{
        int WaterMeterIDs[20][2];
    };
    explicit SetAddress(QWidget *parent = 0);
    ~SetAddress();
    etc...
private:
    Ui::SetAddress *ui;
    AddressList m_address;

Я хочу сохранить свои данные, которые находятся в ячейках qtablewidget, используя эти команды в моем .cppfile:

void SetAddress::on_pushButton_apply_clicked()
{
    int rowscount = ui->tableWidget->rowCount();
//rowscount is always less than 20
    for(int j = 0; j < 2; j++){
        for(int i = 0; i < rowscount; i++){
            if(ui->tableWidget->item(i,j) != 0x0 ){//if cell is not empty
                 m_address.WaterMeterIDs[i][j] = ui->tableWidget->item(i,j)->text().toInt();//convert data to int and put it in array
                 qDebug()<<m_address.WaterMeterIDs[i][j];
            }
        }
    }
}

, когда я нажимаю кнопку «Применить», программа работает хорошо (я вижу элементы массива, используя qDebug ()).но после нажатия кнопки «Применить», если я нажимаю любую другую клавишу, даже кнопка закрытия (или даже если я хочу изменить размер окна), программа вылетает!

1 Ответ

0 голосов
/ 19 февраля 2019

можете ли вы увидеть какую-либо ошибку в моем коде?

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

#include <array>

class AddressList{
    std::array<std::array<int, 2>, 20> WaterMeterIDs;

public:
    inline constexpr int& at(size_t row, size_t col) {
        return WaterMeterIDs.at(row).at(col);
    }

    inline constexpr int const& at(size_t row, size_t col) const {
        return WaterMeterIDs.at(row).at(col);
    }
};

Затем получил бы доступ к массиву через функцию at():

// set value
m_address.at(i,j) = ...

// log value
qDebug() << m_address.at(i,j);

Это должно убедиться, что ничегопроскользнул сквозь трещины относительно вашего 2D-массива.

И я бы проверил это ui->tableWidget->columnCount() >= 2 перед циклом, просто чтобы исключить это тоже:

int colcount = std::min(2, ui->tableWidget->columnCount());
for(int j = 0; j < colcount; ++j) {
   ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...