@dalbio

Не могу запустить код в visual studio почему?

#include <bits/stdc++.h>
using namespace std;
const int mod = 1000000007;
int main() {
	long long matr[1001][1001];
	int n;
	cin >> n;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			char c;
			cin >> c;
			matr[i][j] = c == '*' ? LLONG_MAX : 0;
		}
	}
	//queue<pair<int, int>>q;
	//q.push({ 0, 0 });
	const int di[2] = { 0,1 };
	const int dj[2] = { 1,0 };
	while (0) {
		pair<int, int> t;
		//t = q.front();
		//q.pop();
		int i = t.first;
		int j = t.second;
		if (i == n - 1 && j == n - 1) continue;
		for (int t = 0; t < 2; t++) {
			if (i + di[t] < n && j + dj[t] < n && matr[i+di[t]][j+dj[t]]!=LLONG_MAX) {
				matr[i + di[t]][j + dj[t]] += matr[i][j];
				matr[i + di[t]][j + dj[t]] %= mod;
				//q.push({ i + di[t],j + dj[t] });
			}
		}
	}
	cout << matr[n - 1][n - 1];
}

Пример ввода:

4
....
.*..
...*
*...

В онлайн редакторе код запускается в visual studio community выдаёт
Необработанное исключение по адресу 0x00D83299 0xC00000FD: Stack overflow.
И при запуске без отладки завершил работу с кодом -1073741571.
Причём проблема именно в коде потому,что другой код запускается.
Буду благодарен за помощь.
  • Вопрос задан
  • 894 просмотра
Решения вопроса 2
Посмотрите ,на какой строчке останавливается отладка
Ответ написан
@MarkusD
все время мелю чепуху :)
long long matr[1001][1001] - это будет 8016008 байт, 7.645МБ.
Стандартный размер стека в MS Visual Studio задан в 1МБ. Естественно, при объявлении настолько большого массива ты сразу получишь Stack Overflow.

Выходов из данной ситуации несколько.
Выход первый - подойти к вопросу рассудительно. Тебе точно нужен именно статический массив в 8МБ именно на стеке? Я думаю что нет. Я думаю что тебе нужен std::vector, в котором ты сможешь легко разместить все 1002001 элементов. На самом деле и двумерность массива тебе тоже не очень нужна, т.к. на самом деле она тебя сейчас только запутывает. Через простую функцию от двух аргументов можно легко перейти от двух индексов к индексу в линейном массиве.

Выход второй - вынести свой статический массив за пределы контекста функции. Это можно сделать, объявив этот массив как static или объявив его в глобальной области видимости.

Выход третий, которым я советую не пользоваться без однозначного понимания своих действий.
Можно изменить размер стека через настройки линкера.
В свойствах проекта: Configuration Properties -> Linker -> System:
Stack Reserve Size - значение в байтах, это максимальный размер стека для потока. Его можно изменить хоть до 32МБ и больше.

Подвох с этим значением в том, что потоков у твоего приложения не один даже если само твое приложение является однопоточным. Вместе с твоим главным потоком работает еще несколько служебных. Их стек тоже будет расширен. Это все приводит к увеличению потребления памяти.
Обычно размер стека по умолчанию не трогают или сжимают до 64КБ, т.к. большинству потоков этого более чем достаточно. А вот для требовательных потоков, обычно, отдельно расширяют стек до требуемых размеров в момент создания потока.
Таким образом достигается контроль памяти. Даже сегодня бывают случаи, когда ее бывает мало.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@dalbio Автор вопроса
Вообщем проблема была в том,что почему то такую матрицу long long matr[1001][1001]; нельзя,но
long long matr[100][100]; можно.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы