Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Из-за чего возникает необработанное исключение и как его исправить? Программа в C++

Чепрасов Владислав Алексеевич Профи (878), закрыт 5 лет назад
Текст программы:

Header.h:

#include
#include
using namespace std;
int countColumn(int**matrix, int n, int m);

Main.cpp:

int main()
{

#include "Header.h"

setlocale(LC_ALL, "RUSSIAN");

ifstream in("input.txt");
cout << "Введите размер матрицы";
ifstream out("output.txt");

int n;
int m;

cin >> n;
cin >> m;

cout << endl;

int** matrix = new int*[n];
for (int i = 0; i < n; ++i) {
matrix[n] = new int[m];
}

if (in.is_open())
{
for (int i=0; i < n; ++i)
{
for (int j = 0; j < m; ++ j)
{
in >> matrix[i][j]; //Исключение
cout << &matrix[i][j];
}

cout << endl;
}

}

else
{
cout << "Файл не найден.";
}

cout << endl;

if (countColumn(matrix, n, m) == 0)
cout << "В матрице нет столбцов, содержащих более трёх повторяющихся элементов";
else
cout << "Количество столбцов матрицы, содержащих более трёх повторяющихся элементов равно " << (countColumn(matrix, n, m))<< "столбцов";

return 0;

}

#include "Header.h"

CountColumn.cpp:

int countColumn(int **matrix, int n, int m)

{

int countCol = 0;

for (int i = 0; i < n; i++)
{
int countRepeat = 0;

for (int j = 0; j < (m - 1); j++)
{
if (matrix[i][j] == matrix[i][j + 1])
countRepeat++;
if (countRepeat > 3)
countCol++;
}

}

return countCol;

}

Исключение возникает в месте, помеченном //Исключение.

Его текст:

Необработанное исключение по адресу 0x0F2E56AC (msvcp140d.dll) в Homework by 14.11.18 Task_1.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0xCDCDCDCD.
Дополнен 6 лет назад
Большое спасибо, Miku Hatsune. Проблема теперь решена наполовину. Половину чисел в матрице он почему-то заменяет числом -842150451, и не ставит пробелы между столбцами, хотя cout<<endl; есть в коде.
Дополнен 6 лет назад
Хотя нет, со столбцами вопрос решён. Но вот что делать с -842150451 другой вопрос.
Лучший ответ
kaiu Высший разум (117675) 6 лет назад
matrix[n] = new int[m];
И вот это прошло?
n уже за массивом будет
надо i
Остальные ответы
Miku Hatsune Мудрец (11190) 6 лет назад
В части
for (int i = 0; i < n; ++i) {
matrix[n] = new int[m];
}
Ты аллоцируешь память только для matrix[n], n раз подряд, тем самым засоряя память, но это не суть
Поэтому, конечно же, при попытке доступа к ней по i < n
in >> matrix[i][j];
Ты пытаешься попасть по адресу, память для которого не выделена
Исправляй на
for (int i = 0; i < n; ++i) {
matrix[i] = new int[m];
}

Хочу так же добавить, что произошедшее - никакое не исключение, а фатальное падение программы. Ты не сможешь выловить подобное в try-catch
Похожие вопросы