Сбой программы без сообщения об ошибке

#c #qt #loops #crash

#c #qt #циклы #сбой

Вопрос:

Я использую Qt Creator (сообщество), чтобы научиться программировать.
У меня есть задание вычислить корни функции, и я попытался использовать код, который я нашел здесь в проекте Qt Widgets.
Когда я пытаюсь запустить программу, Qt не обнаружил никаких ошибок.
Однако моя программа выходит из строя всякий раз, когда я пытаюсь показать результаты с помощью on_pushButton_clicked().
Мой лектор подозревает, что где-то должен быть разомкнутый цикл, но я его не вижу.
Любая помощь была бы очень признательна.
Приведенный ниже код:

 double function1(double q)
{
double ab = ((q*q*q) (9*q*q)-(15*q) 98)*(sin(q));
return ab;
}

void MainWindow::on_pushButton_clicked()
{
    ui->label->setText(tr("%1").arg(func1()));
}

double MainWindow::func1()
{    
    std::setprecision(4);
    double precision = 0.001;
    double a = -10;
    double b = -9;
    double product = function1(a)*function1(b);
    double absolute = fabs(a-b);
    double e = 0;
    if (product>0)
    {
          a;
          b;
    }
    else
    {
        while (absolute >= precision)
        {
            e = (a   b) / 2;
            double fa = function1(a);
            double fe = function1(e);
            if (fe == 0)
            {
                return e;
                break;
            }
            if (fa*fe>0)
            {
                a = e;
            }
            else if (fa*fe<0)
            {
                b = e;
            }
        }
    }
    return e;
}
  

Комментарии:

1. Вы пробовали использовать отладчик? Где точно происходит сбой? Если вы подозреваете, что она вылетает в on_pushButton_clicked (если бы вы использовали debugger, вы бы знали, а не подозревали), то все ли указатели, используемые там, ненулевые?

2. Довольно распространенное явление. Если бы вы ожидали сбоя настолько, чтобы ввести сообщение об ошибке, скорее всего, вы бы исправили ошибку вместо этого.

3. никогда не обновляются абсолютные значения и точность… итак, почему вы это сравниваете?

4. спасибо Ф.Берналу, в конце концов, это была проблема.

Ответ №1:

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

while (абсолютная >= точность)

. Это должно помочь вам разобраться.

Комментарии:

1. Итак, проблема в том, что Ф. Бернал упоминал выше, но я все еще не понимаю, почему absolute не обновляется каждый раз, когда я изменяю значение ‘a’ или ‘b’ в цикле if else.

2. @Shironats Звучит так, как будто вы пришли с функционального языка. В процедурном, таком как C / C , ваши переменные обновляются не так, как вы предполагаете. Вы должны пересчитать это.

3. Понятно, огромное спасибо за то, что прояснил это для меня, Кит.

Ответ №2:

Если программа вылетает при нажатии кнопки, которая «вызывает» on_pushButton_clicked, значит, что-то не так внутри этого слота.

Во-первых, все ли объекты памяти кучи созданы ранее с помощью инструкции new (в частности, label)?

PS: вы можете удалить инструкцию break, функция уже вышла из цикла while из-за возврата в предыдущей строке.