Top.Mail.Ru
Ответы
Аватар пользователя
6лет
Изменено
Аватар пользователя
Аватар пользователя
Аватар пользователя
Программирование
+4

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

Текст программы:

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.

Дополнен

Большое спасибо, Miku Hatsune. Проблема теперь решена наполовину. Половину чисел в матрице он почему-то заменяет числом -842150451, и не ставит пробелы между столбцами, хотя cout<<endl; есть в коде.

Дополнен

Хотя нет, со столбцами вопрос решён. Но вот что делать с -842150451 другой вопрос.

По дате
По рейтингу
Аватар пользователя
Новичок
6лет

matrix[n] = new int[m];
И вот это прошло?
n уже за массивом будет
надо i

Аватар пользователя
Мудрец
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

Аватар пользователя
Искусственный Интеллект
6лет

Возможно, заменить ++i на i++?