Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/140: Рейтинг темы: голосов - 140, средняя оценка - 4.87
2 / 2 / 0
Регистрация: 13.06.2019
Сообщений: 66
1

Использование неинициализированной памяти

14.10.2019, 14:31. Показов 29252. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include <iostream>
#include <stdlib.h>
#include <fstream>
using namespace std;
 
bool used[64];
 
int j;
int r;
int i;
int k;
 
void dfs(int** iArr, int m, int n, int t) { //Обход в глубину графа, представленного матрицей инцидентности
 
    used[t] = true;
 
    int p;
 
    for (i = 0; i < n; i++)//1) Выбрать из непройденных вершин вершину с наименьшим номером.
    {
        j = r;//  ?
        if ((iArr[i][j] != 0) && (!used[i])) //1) Если непройденных вершин нет, закончить работу – конец алгоритма
        {
            used[i] = true; // пометить как посещенную 
            p = i;          // ?
            cout << i << " ";  // вывести результат
 
            for (j = 0; j < m; j++) //2)Пройти выбранную вершину и отметить её в массиве пометок как пройденную,(реализуется циклом по столбцу) ???
            {
                if (iArr[i][j] != 0) // если шаг и новая строка не ровняется 0 ( если мы тут были ? )
                {
                    r = j;  // ?
 
        /* 3) Просмотреть список инцидентности только что пройденной вершины и
        к каждой непройденной вершине из списка применить рекурсивно пункты 2 и 3 данного алгоритма
        (реализуется циклом по строке, вложенным в первый цикл по столбцу, и ещё одним циклом по столбцу, вложенным в цикл по строке).*/
                    for (k = 0; k < n; k++) // Пройти выбранную вершину и отметить её в массиве пометок как пройденную,(реализуется циклом по строке) ???
                    {
 
                        if ((iArr[k][j] != 0) && (!used[k]))
                        {
                            dfs(iArr, j, k, i); //Перейти к пункту 1                      
                        }
                    }
                }
            }
        }
    }
}
 
int main()
{
    /*Предоставляет возможности для чтения файлов.
    Открыть файл можно двумя способами: вызвав метод open() или указав путь к нему в конструкторе.*/
    ifstream in("matrix.txt");
    int m, n;
    in >> m;
    in >> n;
    // выделяем память под M строк для матрицы инцидентности 
    int** incidenceMatrix = new int* [m];
    for (int row = 0; row < m; row++)
    {
        // для каждой строки выделяем память под N элементов
        incidenceMatrix[row] = new int[n];
        // считываем значения
        for (int column = 0; column < n; column++) {
            in >> incidenceMatrix[row][column];
            cout << incidenceMatrix[row][column] << " ";
        }
        cout << endl;
    }
    in.close();
 
    cout << endl;
 
 
    int* p[4];
    for (int i = 0; i < 4; i++)
        p[i] = incidenceMatrix[i];
    /*Чтобы на экран выводился весь маршрут обхода,
    начиная с первой вершины, следует ввести значение
    переменной from (стартовая точка), на единицу меньшее
    номера первой вершины (в данном примере это " - 1 ")*/
    
 
    dfs(p, n, m, 0);
 
    cin.clear();
    cin.ignore(32767, '\n');
    cin.get();
 
}


Ошибка, строка 79:warning C6385:
Чтение недопустимых данных из "incidenceMatrix": доступный для чтения объем равен "m*8" байт, однако считать можно только "16" байт.

Однако! Если задать память вручную прописать
( int** incidenceMatrix = new int* [5];
incidenceMatrix[row] = new int[5]; )
то ошибка превращается в :
warning C6001: Использование неинициализированной памяти "*incidenceMatrix".

Подскажите как с этим бороться и как исправить
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.10.2019, 14:31
Ответы с готовыми решениями:

Использование неинициализированной памяти
Пытаюсь написать эту программу, на данный момент выдает ошибку &quot;Использование неинициализированной...

Использование неинициализированной памяти
В строке 120 вылезает ошибка &quot;Использование неинициализированной памяти *st&quot;, возможно из-за этого...

Использование неинициализированной памяти dword
#include &quot;iostream&quot; #include &quot;stdio.h&quot; #include &quot;string.h&quot; #include &quot;windows.h&quot; using...

Уйти от глобальной переменной (получил "использование неинициализированной памяти")
Требовалось уйти от использования глобальной переменной max И сделать массив статическим ...

19
nalbe666
14.10.2019, 14:40
  #2

Не по теме:

Откуда вы берёте эту хрень? Один и тот же код с тупой ошибкой, которую не заметит только тот, кто вообще не одупляет, что там происходит.

0
2 / 2 / 0
Регистрация: 13.06.2019
Сообщений: 66
14.10.2019, 14:44  [ТС] 3
Цитата Сообщение от nalbe666 Посмотреть сообщение
Откуда вы берёте эту хрень? Один и тот же код с тупой ошибкой, которую не заметит только тот, кто вообще не одупляет, что там происходит
Я не знаю где другие его берут но я парюсь над этим заданием уже 1.5 месяца.
И только после месяца самостоятельного поиска решения я обратиться за помощью на форум.

Если бы я понимал что тут происходит я бы сюда не обращался. По моему логично
0
817 / 504 / 211
Регистрация: 19.01.2019
Сообщений: 1,196
14.10.2019, 15:14 4
Triglav86, ну вот оно. Там и ответы есть.
Передача аргументов, вывод данных
0
2 / 2 / 0
Регистрация: 13.06.2019
Сообщений: 66
14.10.2019, 15:37  [ТС] 5
Цитата Сообщение от nalbe666 Посмотреть сообщение
Там и ответы есть
выход за край массива ?
Если вам очевидна ошибка в данном коде почему просто не укажите на неё ?
0
817 / 504 / 211
Регистрация: 19.01.2019
Сообщений: 1,196
14.10.2019, 15:42 6
Triglav86, после ответов Avaddon74, nonedark2008 и Алексей1153, мне нечего добавить. Тем более, что приведенный код так и остался без изменений.
0
"C with Classes"
1646 / 1403 / 523
Регистрация: 16.08.2014
Сообщений: 5,877
Записей в блоге: 1
14.10.2019, 15:46 7
---
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
14.10.2019, 15:56 8
Цитата Сообщение от Triglav86 Посмотреть сообщение
Подскажите как с этим бороться и как исправить
Насколько я понял ты взял, в качестве образца первую же ссылку из гугла.
Вот, переделал тот код на динамический массив. Вроде работает, на их примере
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#include <iostream>
 
using namespace std;
 
bool used[1024];
 
int j = 0;
int r = 0;
int i = 0;
int k = 0;
 
void dfs(int **iArr, int n, int m, int t) {
 
    used[t] = true;
 
    int p;
 
    for (i = k; i < n; i++)
    {
        j = r;
        if ((iArr[i][j] != 0) && (!used[i]))
        {
            used[i] = true;
            p = i;
 
            cout << i << " ";
 
            for (j = 0; j < m; j++)
            {
                i = p;
                if (iArr[i][j] != 0)
                {
                    r = j;
 
                    for (k = 0; k < n; k++)
                    {
                        j = r;
 
                        if ((iArr[k][j] != 0) && (!used[k]))
                        {
                            dfs(iArr, n, m, i);
                        }
                    }
                }
            }
        }
    }
}
 
int _src[12][14] = 
{
    {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
    {0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
    {0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
    {0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0},
    {1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0},
    {0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0},
    {0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},
    {0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0},
    {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0},
    {0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0},
    {0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1},
    {0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1}
};
 
int main()
{
    int n = std::size(_src);
    int m = std::size(*_src);
    int **iArr= new int *[n];
    for (int i = 0; i < n; ++i)
    {
        iArr[i] = new int[m];
        std::copy(std::begin(_src[i]), std::end(_src[i]), iArr[i]);
    }
 
    for (int i = 0; i < n; i++)
    {
        used[i] = false;
        for (int j = 0; j < m; j++)
            cout << " " << iArr[i][j];
        cout << endl;
    }
 
 
    int from = -1;
    //cout << "From >> ";
    //cin >> from;
 
    cout << "Order: " << endl;
 
    dfs(iArr, n, m, from);
 
    cout << endl;
    for (int i = 0; i < n; ++i)
        delete[] iArr[i];
 
    delete[] iArr;
    return 0;
}
1
2 / 2 / 0
Регистрация: 13.06.2019
Сообщений: 66
14.10.2019, 16:09  [ТС] 9
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Насколько я понял ты взял, в качестве образца первую же ссылку из гугла.
На самом деле я взял 3 разных кода и пытаюсь их объединить ( изначально их было около 8, но по мере разбирательства большинство отсеялись )
Требуется чтоб данные матрицы брались из внешнего файла : ifstream in("matrix.txt");

Но всё равно спасибо за помощь
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
14.10.2019, 16:11 10
Цитата Сообщение от Triglav86 Посмотреть сообщение
Требуется чтоб данные матрицы брались из внешнего файла : ifstream in("matrix.txt");
Это у тебя вроде работало. Проблема была с функцией dfs
1
2 / 2 / 0
Регистрация: 13.06.2019
Сообщений: 66
15.10.2019, 08:27  [ТС] 11
Цитата Сообщение от nalbe666 Посмотреть сообщение
мне нечего добавить
Всё таки если голова под вечер не варит лучше отложить работу и пойти отдохнуть. Утром на свежую голову, не включая компьютер, понял как все ошибки исправить
0
43 / 39 / 5
Регистрация: 16.09.2019
Сообщений: 285
15.10.2019, 10:20 12
Цитата Сообщение от Triglav86 Посмотреть сообщение
// выделяем память под M строк для матрицы инцидентности
* * int** incidenceMatrix = new int* [m];
А вот эту мототу, разве, не иначе надо делать?
0
2 / 2 / 0
Регистрация: 13.06.2019
Сообщений: 66
15.10.2019, 11:36  [ТС] 13
Цитата Сообщение от БедолагаЖека Посмотреть сообщение
А вот эту мототу, разве, не иначе надо делать?
я так сделал:

int** incidenceMatrix = new int* [n,m];
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
15.10.2019, 11:44 14
Цитата Сообщение от Triglav86 Посмотреть сообщение
я так сделал:
int** incidenceMatrix = new int* [n,m];
Это ты выделил массив указателей, размером m.
Потом всё равно нужно для каждого из них делать new int[n];

Добавлено через 49 секунд
Цитата Сообщение от БедолагаЖека Посмотреть сообщение
А вот эту мототу, разве, не иначе надо делать?
Например как?
1
2 / 2 / 0
Регистрация: 13.06.2019
Сообщений: 66
15.10.2019, 11:48  [ТС] 15
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Это ты выделил массив указателей, размером m.
Потом всё равно нужно для каждого из них делать new int[n];
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#include <iostream>
#include <stdlib.h>
#include <fstream>
using namespace std;
 
bool used[64];
 
int j;
int r;
int i;
int k;
 
void dfs(int** iArr, int n, int m, int t) {
 
    used[t] = true;
 
    int p;
 
    for (i = k; i < n; i++)
    {
        j = r;
        if ((iArr[i, j] != 0) && (!used[i]))
        {
            used[i] = true;
            p = i;
 
            cout << i << " ";
 
            for (j = 0; j < m; j++)
            {
                i = p;
                if (iArr[i, j] != 0)
                {
                    r = j;
 
                    for (k = 0; k < n; k++)
                    {
                        j = r;
 
                        if ((iArr[k, j] != 0) && (!used[k]))
                        {
                            dfs(iArr, n, m, i);
                        }
                    }
                }
            }
        }
    }
}
 
int main()
{
    /*Предоставляет возможности для чтения файлов.
    Открыть файл можно двумя способами: вызвав метод open() или указав путь к нему в конструкторе.*/
    ifstream in("matrix.txt");
    int n, m;
    in >> n;
    in >> m;
    // выделяем память под M строк для матрицы инцидентности 
    int** incidenceMatrix = new int* [n, m];
 
    for (int row = 0; row < m; row++)
    {
        // для каждой строки выделяем память под N элементов
        incidenceMatrix[row] = new int[m];
 
        // считываем значения
        for (int column = 0; column < n; column++) {
            in >> incidenceMatrix[row][column];
            cout << incidenceMatrix[row][column] << " ";
        }
        cout << endl;
    }
    in.close();
 
    cout << endl;
 
 
    int* p[4];
    for (int i = 0; i < 4; i++)
        p[i] = incidenceMatrix[-1];
    /*Чтобы на экран выводился весь маршрут обхода,
    начиная с первой вершины, следует ввести значение
    переменной from (стартовая точка), на единицу меньшее
    номера первой вершины (в данном примере это " - 1 ")*/
 
    int from = -1;
    cout << "From >> ";
    cin >> from;
 
    cout << "Order: " << endl;
 
    dfs(p, n, m, from);
 
    cout << endl;
    for (int i = 0; i < n; ++i)
        delete[] incidenceMatrix[i];
 
 
    delete[] incidenceMatrix;
 
    cin.clear();
    cin.ignore(32767, '\n');
    cin.get();
 
}


Таким образом сделал.
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
15.10.2019, 11:52 16
Цитата Сообщение от Triglav86 Посмотреть сообщение
Таким образом сделал.
Цитата Сообщение от Triglav86 Посмотреть сообщение
int** incidenceMatrix = new int* [n, m];
Это ошибка. Попробуй сделать n больше, чем m (или наоборот). Снова всё валиться начнёт

Добавлено через 16 секунд
Цитата Сообщение от Triglav86 Посмотреть сообщение
Таким образом сделал.
Цитата Сообщение от Triglav86 Посмотреть сообщение
int** incidenceMatrix = new int* [n, m];
Это ошибка. Попробуй сделать n больше, чем m (или наоборот). Снова всё валиться начнёт
1
2 / 2 / 0
Регистрация: 13.06.2019
Сообщений: 66
15.10.2019, 11:57  [ТС] 17
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Попробуй сделать n больше, чем m
Не понял. Объём памяти больше сделать ?
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
15.10.2019, 12:04 18
Цитата Сообщение от Triglav86 Посмотреть сообщение
Не понял. Объём памяти больше сделать ?
Цитата Сообщение от Triglav86 Посмотреть сообщение
int n, m;
* * in >> n;
* * in >> m;
Веди с клавиатуры 10 и 5. Чтоб n стала равной 10, а m - 5
1
2 / 2 / 0
Регистрация: 13.06.2019
Сообщений: 66
15.10.2019, 12:13  [ТС] 19
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Веди с клавиатуры 10 и 5. Чтоб n стала равной 10, а m - 5
Исправил.
Ещё раз спасибо что не отказали в помощи нуждающемуся.


Не хочу в будущем повторять ошибки, по этому не могли бы объяснить почему тут именно так надо сделать ?
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
15.10.2019, 12:28 20
Цитата Сообщение от Triglav86 Посмотреть сообщение
Не хочу в будущем повторять ошибки, по этому не могли бы объяснить почему тут именно так надо сделать ?
Тебе нужно сдесь сделать матрицу из n строк и m столбцов (по-моему так). Поэтому сначала выделяешь память под строки
C++
1
int** incidenceMatrix = new int* [n];
Потом в цикле - под столбцы, и заполняешь их во вложенном цикле от нуля до m
C++
1
2
3
4
5
6
7
   for (int row = 0; row < n; row++)
    {
        // для каждой строки выделяем память под m элементов
        incidenceMatrix[row] = new int[m];
 
        // считываем значения
        for (int column = 0; column < m; column++) {
1
15.10.2019, 12:28
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.10.2019, 12:28
Помогаю со студенческими работами здесь

Использование неинициализированной переменной
Товарищи! Столкнулся с таким феноменом: обычно если объявленную, но неинициализированную переменную...

Использование неинициализированной локальной переменной
#include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;math.h&gt; using namespace std; ...

Выдается сообщение о том, что возможно использование неинициализированной переменной
Помогите разобраться. Вроде все правильно, а выдает ошибку: maybe used uninitialized in this...

Использование оперативной памяти (вылетают игры из-за нехватки памяти)
Перезагружаю комп, играю часа 3-4 и вся память пропадает куда-то в результате чего игры...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru