Так что я работал над Задача 15 с сайта проекта Эйлера , и мое решение работало отлично, пока я не решил удалите заявления Cout, которые я использовал для отладки при написании кода. Мое решение работает путем генерации треугольника Паскаля в одномерном массиве и поиска элемента, который соответствует количеству путей в решетке NxN, заданных пользователем. Вот моя программа:
#include <iostream>
using namespace std;
//Returns sum of first n natural numbers
int sumOfNaturals(const int n)
{
int sum = 0;
for (int i = 0; i <= n; i++)
{
sum += i;
}
return sum;
}
void latticePascal(const int x, const int y, int &size)
{
int numRows = 0;
int sum = sumOfNaturals(x + y + 1);
numRows = x + y + 1;
//Create array of size (sum of first x + y + 1 natural numbers) to hold all elements in P's T
unsigned long long *pascalsTriangle = new unsigned long long[sum];
size = sum;
//Initialize all elements to 0
for (int i = 0; i < sum; i++)
{
pascalsTriangle[i] = 0;
}
//Initialize top of P's T to 1
pascalsTriangle[0] = 1;
cout << "row 1:\n" << "pascalsTriangle[0] = " << 1 << "\n\n"; // <--------------------------------------------------------------------------------
//Iterate once for each row of P's T that is going to be generated
for (int i = 1; i <= numRows; i++)
{
int counter = 0;
//Initialize end of current row of P's T to 1
pascalsTriangle[sumOfNaturals(i + 1) - 1] = 1;
cout << "row " << i + 1 << endl; // <--------------------------------------------------------------------------------------------------------
//Iterate once for each element of current row of P's T
for (int j = sumOfNaturals(i); j < sumOfNaturals(i + 1); j++)
{
//Current element of P's T is not one of the row's ending 1s
if (j != sumOfNaturals(i) && j != (sumOfNaturals(i + 1)) - 1)
{
pascalsTriangle[j] = pascalsTriangle[sumOfNaturals(i - 1) + counter] + pascalsTriangle[sumOfNaturals(i - 1) + counter + 1];
cout << "pascalsTriangle[" << j << "] = " << pascalsTriangle[j] << '\n'; // <--------------------------------------------------------
counter++;
}
//Current element of P's T is one of the row's ending 1s
else
{
pascalsTriangle[j] = 1;
cout << "pascalsTriangle[" << j << "] = " << pascalsTriangle[j] << '\n'; // <---------------------------------------------------------
}
}
cout << endl;
}
cout << "Number of SE paths in a " << x << "x" << y << " lattice: " << pascalsTriangle[sumOfNaturals(x + y) + (((sumOfNaturals(x + y + 1) - 1) - sumOfNaturals(x + y)) / 2)] << endl;
delete[] pascalsTriangle;
return;
}
int main()
{
int size = 0, dim1 = 0, dim2 = 0;
cout << "Enter dimension 1 for lattice grid: ";
cin >> dim1;
cout << "Enter dimension 2 for lattice grid: ";
cin >> dim2;
latticePascal(dim1, dim2, size);
return 0;
}
Операторы cout, которые, похоже, сохраняют мою программу, отмечены закомментированными стрелками. Кажется, работает до тех пор, пока любой из этих строк включены. Если все эти заявления будут удалены, тогда программа выведет: «Количество путей SE в a» а потом повесить на пару секунд до завершения без распечатки ответа. Я хочу, чтобы эта программа была как можно более чистой и просто выводила ответ без необходимости печатать все содержимое треугольника, чтобы она не работала так, как задумано, в своем текущем состоянии.
Существует высокая вероятность того, что выражение для расчета индекса массива или выражение для размера массива при распределении вызывает неопределенное поведение, например переполнение стека.
Поскольку видимость этого неопределенного поведения для вас не определена, программа может работать так, как вы хотели, или может делать что-то другое — что может объяснить, почему она работает с одним компилятором, а не с другим.
Вы можете использовать вектор с vector :: resize () и vector :: at () вместо массива с new и [], чтобы получить некоторую улучшенную информацию в случае, если программа прерывает работу перед записью или сбросом всех своих выходных данных из-за неверный доступ к памяти.
Если проблема связана с использованием недопустимого индекса, то vector :: at () вызовет исключение, которое вы не поймете, и многие отладчики остановятся, когда они найдут эту пару факторов вместе, и они помогут вам проверить укажите в программе, где возникла проблема, и ключевые факты, например, к какому индексу вы пытались получить доступ, а также к содержимому переменных.
Обычно они показывают больше «стековых фреймов», чем вы ожидаете, но некоторые являются внутренними подробностями того, как система управляет необработанными исключениями, и вы должны ожидать, что отладчик поможет вам найти стековый фрейм, соответствующий вашей проблеме, чтобы вы могли проверить контекст этого.
Ваша программа работает хорошо с g ++ в Linux:
$ g++ -o main pascal.cpp
$ ./main
Enter dimension 1 for lattice grid: 3
Enter dimension 2 for lattice grid: 4Number of SE paths in a 3x4 lattice: 35
Должно быть что-то еще, так как у ваших утверждений cout нет побочных эффектов.
Вот идея о том, как это отладить: откройте 2 экземпляра Visual Studio, у одного будет версия без заявления Cout, а другой будет иметь версию с их. Просто сделайте пошаговую отладку, чтобы найти первое различие между ними. Я предполагаю, что вы поймете, что операторы cout не имеют ничего общего с ошибкой.