Возвращение массива из функции дает неожиданный результат C ++ - PullRequest
0 голосов
/ 24 апреля 2020

Я пытаюсь изучать C ++ с помощью создателя Qt, и теперь я не могу вывести правильный результат.
Моя программа должна читать числа из QTableWidget и выводить самые низкие значения. И иногда это работает, но часто есть что-то вроде 201-e302. Я не знаю почему. Я должен сделать это с динамическими c массивами. Это задача моего учителя.


Вот мой код:

    QPair<int, double*> Widget::count()
{
    double *arr = new double[0];
    bool ok;
    int len = 0;
 //Reading numbers from QTablewidget
    for (int row = 0; row < ui->table->rowCount(); row++)
        for (int col = 0; col < ui->table->columnCount(); col++)
        {
            if(ui->table->item(row, col) and
                    ui->table->item(row, col)->text().length() != 0)  
            {
                double *temp = new double[len + 1];
                for (int j = 0; j < len; j++)
                {
                    temp[j] = arr[j];
                }
                temp[len] = ui->table->item(row, col)->text().toDouble(&ok);
                arr = temp;
                delete [] temp;
                len++;
            }
            else
            {
                QPair<int, double*> res = qMakePair(0, arr);
                QMessageBox::information(this, "Error", "Fill every cell");
                return res;
            }
        }
//
    QPair<int, double*> res = qMakePair(len, arr);
    return res;
}

void Widget::on_min_but_clicked()
{
    int len = count().first;
    double* arr = count().second;
    if (len != 0)
    {
        double min = arr[0];
        for (int i = 0; i < len; i++)
        {
            if (arr[i] < min)
            {
                min = arr[i];
            }
        }
        ui->min_lineedit->setText(QString::number(min));
    }
}

1 Ответ

2 голосов
/ 24 апреля 2020

В этом фрагменте кода вы выделяете новый массив, назначаете указатель на этот массив и затем удаляете этот массив.

double *temp = new double[len + 1];
arr = temp;
delete [] temp;

Это оставляет arr с висящим указателем на удаленную память. Я бы предложил изменить тип на std::vector<double> arr.

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