我有一个名称为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单元中 在我的.cpp文件中:
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];
}
}
}
}
当我单击Apply按钮时,程序运行良好(我可以使用qDebug()看到数组元素)。 但是,如果我按了应用按钮之后再按任何其他键,即使关闭按钮(或者即使我想调整窗口大小),程序也会崩溃!
答案 0 :(得分:3)
您能在我的代码中看到任何错误吗?
即使您确定索引在范围内,显示给我们的代码中也没有任何东西可以确保确实如此,所以我将用以下代码替换您的数组:
#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) {
...