Неясная ошибка в программе сортировки массива c++
Необходимо было сделать программу по такому условию:
Дана матрица размера M x N. Упорядочить ее столбцы так, чтобы их последние элементы образовывали убывающую последовательность
Как я понял, нужно просто упорядочить по убыванию последнюю строку (то есть ту, которая под номером M). Почему-то программа умирает сразу после исполнения сотой строки кода:
завершил работу с кодом -1073741819.
При сборке программы в режиме отладки, microsoft visual studio говорит такое:
Вызвано исключение по адресу 0x00543471 в ConsoleApplication.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0xFDFDFE01.
Работаю в microsoft visual studio 2019. Прошу прощения за потенциально низкокачественный код.
#include <iostream>
#include <ctime>
#include <iomanip>
int** array_create(int m, int n);
void array_fill(int** array, int m, int n);
void array_output(int** array, int m, int n);
void array_sorting(int** array, int m, int n);
void main()
{
setlocale(LC_ALL, "Russian");
int n, m, i;
std::cout << "Количество строк\tm = ";
std::cin >> m;
std::cout << "Количество столбцов\tn = ";
std::cin >> n;
int** a = array_create(m, n);
array_fill(a, m, n);
array_output(a, m, n);
array_sorting(a, m, n);
std::cout << "\n Новый массив: \n";
array_output(a, m, n);
std::cout << "\n";
for (i = 0; i < n; ++i)
{
delete a[i];
}
delete[]a;
}
int** array_create(int m, int n)
{
int** array = new int* [m];
for (int i = 0; i < m; ++i)
{
array[i] = new int[n];
}
return array;
}
void array_fill(int** array, int m, int n)
{
int i, j;
int aco;
srand((unsigned)time(NULL));
do {
std::cout << "\n Выбор способа введения массива: \n 1) Вручную; \t 2) Случнайным образом. \n Введите номер нужного способа: \n ";
std::cin >> aco;
if ((aco != 1) && (aco != 2))
{
std::cout << "\n Попытка неудачная, попробуйте ещё раз. \n ";
}
} while ((aco != 1) && (aco != 2));
std::cout << "\n Начальный массив: \n";
if (aco == 1)
{
for (i = 0; i < m; ++i)
{
for (j = 0; j < n; ++j)
{
std::cout << "a[" << i + 1 << "][" << j + 1 << "] = ";
std::cin >> array[i][j];
}
std::cout << "\n";
}
}
if (aco == 2)
{
for (i = 0; i < m; ++i)
{
for (j = 0; j < n; ++j)
{
array[i][j] = 1 + rand() % 99;
}
}
}
}
void array_output(int** array, int m, int n)
{
int i, j;
for (i = 0; i < m; ++i)
{
for (j = 0; j < n; ++j)
{
std::cout << std::setw(4) /*<< " a[" << i + 1 << "][" << j + 1 << "]="*/ << array[i][j];
}
std::cout << "\n";
}
}
void array_sorting(int** array, int m, int n)
{
int i, j, b, c, d;
b = 0;
i = m;
j = 0;
d = 0;
std::cout << "\n\n Попытки: \n";
do
{
d = 0;
for (j = 0; j < n; ++j)
{
b++;
std::cout << "\n i = " << i << "; \t j = " << j << ";\n";
std::cout << "\n1_до: \ta[" << i << "][" << j << "]=" << array[i][j] << "\ta[" << i << "][" << j + 1 << "]=" << array[i][j + 1] << ";\n";
if (j <= n - 2)
{
std::cout << "\n1_до: \ta[" << i << "][" << j << "]=" << array[i][j] << "\ta[" << i << "][" << j + 1 << "]=" << array[i][j + 1] << ";\n";
if (array[i][j] < array[i][j + 1])
{
std::cout << "\n1_до: \ta[" << i << "][" << j << "]=" << array[i][j] << "\ta[" << i << "][" << j + 1 << "]=" << array[i][j + 1] << ";\n";
std::swap(array[i][j], array[i][j + 1]);
std::cout << "1_после:\ta[" << i << "][" << j << "]=" << array[i][j] << "\ta[" << i << "][" << j + 1 << "]=" << array[i][j + 1] << ";\n";
++d;
}
}
if (j >= 1)
{
if (array[i][j - 1] < array[i][j])
{
std::cout << "\n2_до: \ta[" << i << "][" << j - 1 << "]=" << array[i][j - 1] << "\ta[" << i << "][" << j << "]=" << array[i][j] << ";\n";
std::swap(array[i][j - 1], array[i][j]);
std::cout << "2_после:\ta[" << i << "][" << j - 1 << "]=" << array[i][j - 1] << "\ta[" << i << "][" << j << "]=" << array[i][j] << ";\n";
++d;
}
}
}
for (c = 0; c < b; ++c)
{
std::cout << "\b";
}
std::cout << b;
} while (d > 0);
}