Сортировка массива структур Qt

226
26 июля 2018, 04:00

В бинарный файл в потоке записывается структура worker

struct worker{
    QString wname;
    QString wlastname;
    int wsalary;
};

В момент чтения файла нужно в MessageBox вывести содержимое файла, в порядке убывания wsalary, т.е. нужно считать содержимое файла и отсортировать, сделал следующее решение

void MainWindow::on_ReadFilepushButton_clicked()
{
    worker man;
    QFile file (FName);
    if(file.open(QIODevice::ReadOnly)){
        QDataStream output(&file);
        worker* mens = new worker;
        worker temp;
        QString s = "";
        int stuctIterator = 0;
        while(!output.atEnd()){
            output >> man.wname >> man.wlastname >> man.wsalary;
            stuctIterator++;
            qDebug() << "1"; 
            mens[stuctIterator].wname = man.wname; //Место сбоя
            qDebug() << mens[stuctIterator].wname;
            mens[stuctIterator].wlastname = man.wlastname;
            qDebug() << mens[stuctIterator].wlastname;
            mens[stuctIterator].wsalary = man.wsalary;
            qDebug() << mens[stuctIterator].wsalary;
        }
        for (int i = 0; i < stuctIterator - 1; i++){
            for (int j = 0; j < stuctIterator - i - 1; j++) {
                if (mens[j].wsalary > mens[j + 1].wsalary){
                    temp = mens[j];
                    mens[j] = mens[j + 1];
                    mens[j + 1] = temp;
                }
            }
        }
        for (int i = 0; i < stuctIterator; i++){
            s += QString::number(i + 1) + ") "
                    + mens[i].wname + " "
                    + mens[i].wlastname + " "
                    + QString::number(mens[i].wsalary) + "\n";
        }
        delete mens;
        file.close();
        QMessageBox::about(this, FName, s);
    } else
        QMessageBox::critical(this, FName, "file does not exist");
}

Программа перестаёт отвечать в том месте где помечено место сбоя, ума не приложу в чем ошибка и как исправить

Answer 1
    worker* mens = new worker;
    worker temp;
    QString s = "";
    int stuctIterator = 0;
    while(!output.atEnd()){
        output >> man.wname >> man.wlastname >> man.wsalary;
        stuctIterator++;
        qDebug() << "1"; 
        mens[stuctIterator].wname = man.wname; //Место сбоя

Обратите внимание: вы используете указатель mens и выделяете динамически память под одно значение worker. А затем используете его как массив - это уже не верно! Для начала, если вам нужен массив, то следует использовать new worker [n] - именно new []! Второе: какой размер массива должен быть? Тобишь нужно значение n. Это значение должно быть таким, чтобы не произошел выход за пределы массива (тобишь выделенной памяти) - иначе проблемы гарантированы!

READ ALSO
Как реализовать распознавание команд в c++?

Как реализовать распознавание команд в c++?

Есть команда состоящая из нескольких частей: действие -> объекты над которыми действие совершается

202
Как правильно перехватывать нажатия клавиш в Windows Forms (C++)?

Как правильно перехватывать нажатия клавиш в Windows Forms (C++)?

На Form есть DataGridView (в нём показывается одна строка) и WebBrowser

183
C++ ошибка dependent name is not a type, prefix with &#39;typename&#39; to indicate a type

C++ ошибка dependent name is not a type, prefix with 'typename' to indicate a type

пишу бинарное дерево и наткнулся на очень непонятную мне ошибку, вот пример:

208