Используется потенциально неинициализированная локальная переменная-указатель "matrix"
int i, j, n, m;
char d;//для меню
float** matrix;//объявляем двойной указатель на матрицу
kt:
// cout << "1- manual input ";
cout << "1- ручной ввод ";
cout << endl;
cout << "2- ввод из файла ";
cout << endl;
cout << "3- выход ";
cout << endl;
cout << "введите: ";
cin >> d;
cout << endl;
if (d > '3' || d < '1')
{
cout << "правильно выберите пункт меню и введите число ";
cout << endl;
goto kt;
}
if (d == '3') { return 0; }
if (d == '2') { ... }
if (d == '1') {//ручной ввод данных в матрицу
cout << "Количество уравнений: ";
cin >> n;//
cout << "Количество переменных: ";
cin >> m;//
m += 1;
//создаем массив
float** matrix = new float* [n];
for (i = 0; i < n; i++) { matrix[i] = new float[m]; }
//инициализируем
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
{
cout << " Элемент " << "[" << i + 1 << " , " << j + 1 << "]: ";
cin >> matrix[i][j];
}
}
}
//выводим массив
cout << "расширенная матрица" << endl;
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
cout << matrix[i][j] << " "; // Здесь возникает ошибка из вопроса
cout << endl;
}
cout << endl;
Комментарием отметил, где возникает ошибка (внизу кода). Как её исправить, почему она неинициализированна?
Ответы (2 шт):
Ну тут проблема с областью видимости и двойным объявлением переменной.
Вот в начале функции Вы объявляете float** matrix; - всё хорошо, всё логично.
А потом в при обработке выбора Вы объявляете ещё одну локальную переменную, выделяете память, инициализируете.
if (d == '1') //ручной ввод данных в матрицу
{
//создаем массив
float** matrix = new float* [n]; // вот тут объявляется новая переменная, это не та же самая переменная, что в начале функции!!!
for (i = 0; i < n; i++) { matrix[i] = new float[m]; }
//инициализируем
for (i = 0; i < n; i++)
for (j = 0; j < m; j++)
{
cout << " Элемент " << "[" << i + 1 << " , " << j + 1 << "]: ";
cin >> matrix[i][j];
}
} // вот тут закончилась область видимости локальной переменной `float** matrix`, объявленной внутри оператора if
А потом у нее заканчивается область видимости, которая ограничена оператором if, и эта локальная переменная уничтожается. Выделенная память утекает.
И потом, когда Вы начинаете выводить массив, вы обращаетесь по адресу, записанному в переменную float** matrix, объявленную в начале функции. А она указывает в никуда, память не выделялась - у Вас появляется ошибка.
Лечится просто - в операторе if уберите объявление. Вот так:
if (d == '1') //ручной ввод данных в матрицу
{
//создаем массив
matrix = new float* [n];
И да, компилятор Вас правильно предупредил, эта переменная не инициализировалась.
Вопрос непонятен. Вот так всё работает правильно.
int main()
{
int i, j, n, m;
char d = '9'; //для меню
float** matrix = nullptr;
while(d > '3' || d < '1')
{
cout << " 1- ручной ввод \n 2- ввод из файла \n 3- выход \n введите: ";
cin >> d;
cout << endl;
if (d > '3' || d < '1')
cout << "правильно выберите пункт меню и введите число " << endl;
}
if (d == '3') { return 0; }
if (d == '2') { return 0; }
if (d == '1') //ручной ввод данных в матрицу
{
cout << "Количество уравнений: ";
cin >> n;
cout << "Количество переменных: ";
cin >> m;
m += 1;
//создаем массив
matrix = new float* [n];
for (i = 0; i < n; i++)
matrix[i] = new float[m];
for (i = 0; i < n; i++) //инициализируем
for (j = 0; j < m; j++)
{
cout << " Элемент " << "[" << i + 1 << " , " << j + 1 << "]: ";
cin >> matrix[i][j];
}
}
//выводим массив
cout << "расширенная матрица" << endl;
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
cout << matrix[i][j] << " "; // Здесь возникает ошибка из вопроса
cout << endl;
}
cout << endl;
// освобождаем выделенную память
for (int i = 0; i < n; i++)
delete[] matrix[i];
delete[] matrix;
return 0;
}