Почему переменная выводит 0, хотя отладчик показывает другое значение переменной
Если использовать такой код:
void outputResultsCalculation(double initialX, double finalX, double stepX, double epsilon)
{
double deltaX = initialX, amountRow;
int numberMemberRow;
for (deltaX; checkValuesX(stepX, deltaX, finalX); deltaX += stepX)
{
amountRow = 0;
numberMemberRow = 0;
cout << deltaX << ":\n"
<< "Функция: " << log(1 - deltaX) << endl
<< "Цикл: " << getSumRowCycle(deltaX, epsilon) << endl
<< "Рекурсия: " << getSumRowRecursion(deltaX, amountRow, numberMemberRow, epsilon) <<
"\nВызывается: " << numberMemberRow << " раз\n";
cout << endl;
}
}
то переменная numberMemberRow будет выводить 0, а если такой:
void outputResultsCalculation(double initialX, double finalX, double stepX, double epsilon)
{
double deltaX = initialX, amountRow;
int numberMemberRow;
for (deltaX; checkValuesX(stepX, deltaX, finalX); deltaX += stepX)
{
amountRow = 0;
numberMemberRow = 0;
cout << deltaX << ":\n"
<< "Функция: " << log(1 - deltaX) << endl
<< "Цикл: " << getSumRowCycle(deltaX, epsilon) << endl
<< "Рекурсия " << numberMemberRow << " раза вызывается\nРезультат: " <<
getSumRowRecursion(deltaX, amountRow, numberMemberRow, epsilon) << endl;
cout << endl;
}
}
то все нормально будет выводиться. Переменная numberMemberRow подсчитывает количество вызовов рекурсивной функции, вот ее код:
double getSumRowRecursion(double deltaX, double& amountRow, int& numberMemberRow, double epsilon)
{
numberMemberRow++;
double memberRow = pow(deltaX, numberMemberRow) / -numberMemberRow;
if (abs(memberRow) >= epsilon && numberMemberRow <= 3970)
{
amountRow += memberRow;
return getSumRowRecursion(deltaX, amountRow, numberMemberRow, epsilon);
}
else
return amountRow;
}
Ответы (1 шт):
Автор решения: Harry
→ Ссылка
Думаю, ваш компилятор еще не знает, что в С++17 вычисления в цепочке << должны выполняться в том порядке, в котором записаны, и пользуется своим правом вычислять их так, как это ему удобно - например, сначала взяв значение numberMemberRow для вывода, а уже потом вычисляя getSumRowRecursion. Попробуйте разбить вывод на части, типа:
cout << deltaX << ":\n"
<< "Функция: " << log(1 - deltaX) << endl;
cout << "Цикл: " << getSumRowCycle(deltaX, epsilon) << endl;
cout << "Рекурсия: " << getSumRowRecursion(deltaX, amountRow, numberMemberRow, epsilon);
cout << "\nВызывается: " << numberMemberRow << " раз\n";