@tuzovrr

Почему используется потенциально неинициализированная локальная переменная-указатель «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;


Комментарием отметил, где возникает ошибка (внизу кода). Как её исправить, почему она неинициализированна?
  • Вопрос задан
  • 200 просмотров
Решения вопроса 1
mayton2019
@mayton2019
Bigdata Engineer
Если у вас d не равно 1 тогда возникает flow который приводит к matrix которая не аллоцирована.

Кстати вы используете не матрицу а так называемый Jagged Array (зубастый массив). В этом нет смысла т.к. у вас матрица всегда прямоугольная и рациональнее выделить один большой массив и распределять его ячейки как элементы прямоугольной матрицы (i,j) формула смещения - очень простая. Ширину умножить на один индекс плюс второй.

Я-бы делал так

float* matrix = new float[n * m]
ну и формулы доступа дальше подправить надо соотвественоо.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@Miron11
Пишу sql 20 лет. Срок :)
When code reaches this line:
if (d == '1') {//ручной ввод данных в матрицу
it sees curly brace "{" and opens, what is called, a new scope of automatic variable.
Subsequently this line:
//создаем массив
float** matrix = new float* [n];
is the place where the above feature allows for mistake to occur.
If it wasn't for new scope, compiler would have notified you of error, something like "attempt to declare variable, variable matrix already declared"
provided you with error message, line number, and later edition even notify users of possible fix.
All you need to do is to remove
float** inside this if condition
--if (d == '1') {//ручной ввод данных в матрицу--
and error would be mended.
Here is link from wikipedia. I have red its section "In specific programming languages", subsection "C, C++", and I can confirm that it is speaking truth.
Ответ написан
Комментировать
vt4a2h
@vt4a2h Куратор тега C++
Senior software engineer (C++/Qt/boost)
У вас же C++, поэтому можно и нужно сильно упростить код.
#include <vector>

// ...

std::vector<std::vector<float>> matrix(n, std::vector<float>(m));
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы