Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
serega006
8 / 8 / 4
Регистрация: 16.10.2011
Сообщений: 389
#1

ОС Windows инициировала точку останова в программе

12.01.2016, 01:54. Просмотров 836. Ответов 4
Метки нет (Все метки)

Писал программу для нахождения минимального пути из точки start(Х) в точку finish(Y) путём обхода графа в ширину. Во время отладки программа работает исправно, но иногда без причины выдает исключение "ОС Windows инициировала точку останова в программе Это может быть вызвано повреждением кучи и указывает на ошибку в очередь.exe или в одной из загруженных им DLL." Опытным путём установил что вылет происходит на строке с объявлением переменной типа string (49 строка), а почему не понятно.
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 <string>
#include <queue>
#include <fstream>
 
using namespace std;
 
queue<int> q;
 
int N = 5;
int M = 5;
 
 
struct myStruct
{
    bool** matrix;
    bool** graph;
    int* mark;
    int* p;
}g;
 
 
int main()
{
    ifstream in("in.txt");
    int size = N*M;
 
    g.mark = new int[size];
    g.p = new int[size];
    g.matrix = new bool*[size];
    g.graph = new bool*[N];
    for (int i = 0; i < size; i++)
    {
        g.p[i] = 0;
        g.mark[i] = 0;
        g.matrix[i] = new bool[size];
        g.graph[i] = new bool[size];
        for (int j = 0; j < size; j++)
            g.matrix[i][j] = 0;
    }
    for (int i = 0; i < N; i++)
    {
        g.graph[i] = new bool[M];
        for (int j = 0; j < M; j++)
            g.graph[i][j] = 0;
    }
 
    int start, finish;
        string str;
    for (int i = 0; !in.eof(); i++)
    {
        in >> str;
        for (int j = 0; j < str.length(); j++)
            if (str[j] == '.' || str[j] == 'X' || str[j] == 'Y')
            {
                g.graph[i][j] = 1;
                if (str[j] == 'X')
                    start = M*i + j;
                if (str[j] == 'Y')
                    finish = M*i + j;
            }
    }
    for (int i = 1; i < N-1; i++)
        for (int j = 1; j < M-1; j++)
        {
            if (g.graph[i][j])
            {
                if (g.graph[i - 1][j])
                    g.matrix[M*i + j][M*(i - 1) + j] = 1;
                if (g.graph[i][j - 1])
                    g.matrix[M*i + j][M*i + j - 1] = 1;
                if (g.graph[i + 1][j])
                    g.matrix[M*i + j][M*(i + 1) + j] = 1;
                if (g.graph[i][j + 1])
                    g.matrix[M*i + j][M*i + j + 1] = 1;
            }
        }
    q.push(start);
    while (!q.empty())
    {
        int a = q.front();
        q.pop();
        for (int i = 0; i < size; i++)
            if (g.matrix[a][i] && !g.mark[i])
            {
                q.push(i);
                g.p[i] = a;
                g.mark[i] = g.mark[a] + 1;
            }
    }
    return 0;
}
Пример входных данных:
Код
#####
#..X#
#.###
#..Y#
#####
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.01.2016, 01:54
Ответы с готовыми решениями:

ОС Windows инициировала точку останова
Здравствуйте, помогите устранить ошибку при выполнении программы #include &lt;stdio.h&gt; #include...

Ошибка компиляции:ОС Windows инициировала точку останова
Доброго времени суток! Обращаюсь с наверняка очень распространенной проблемой. Суть задачи...

Ошибка. ОС Windows инициировала точку останова в файле
Доброго всем времени суток. Есть задание : Найти самое большое слово в файле и подсчитать...

Странная ошибка ОС Windows инициировала точку останова
Что могло вызвать такую ошибку ? При нажатии кнопки продолжить программа успешно работает...

ОС Windows инициировала точку останова в kursach.exe
Доброго времени суток! Проблема распространенная конечно, но в этом разобраться ни я сам, не с...

4
Perfilov
264 / 164 / 56
Регистрация: 25.02.2015
Сообщений: 435
12.01.2016, 02:09 #2
Лучший ответ Сообщение было отмечено serega006 как решение

Решение

может из-за строки 37
g.graph[i] = new bool[size];
перед которой было
g.graph = new bool*[N];
а i изменяется от 0 до size, а size == M*N, что больше N. итого выход за пределы.
зачем вы вообще с голыми указателями работаете. есть же stl в которой есть вектора например.

ну и до кучи осваивайте дебаггер своей IDE

Добавлено через 1 минуту
и еще если результаты работы зависят от содержимого каких-то файлов - то их тоже неплохо бы выкладывать. а еще лучше без файлов с данными попытаться запостить код, который крашится.
1
serega006
8 / 8 / 4
Регистрация: 16.10.2011
Сообщений: 389
12.01.2016, 02:11  [ТС] #3
Большое спасибо, не заметил. Забавно что сам отладчик указывал на стринг
0
Perfilov
264 / 164 / 56
Регистрация: 25.02.2015
Сообщений: 435
12.01.2016, 02:14 #4
при повреждениях памяти отвалится может не сразу.
если бы у вас были вектора например, вы бы ассерт словили в месте, где выход за пределы произошел.
1
serega006
8 / 8 / 4
Регистрация: 16.10.2011
Сообщений: 389
12.01.2016, 02:14  [ТС] #5
Еще раз спасибо, в будущем буду использовать их.
0
12.01.2016, 02:14
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.01.2016, 02:14

ОС Windows инициировала точку останова в stroki.exe
#include&lt;iostream&gt; #include&lt;conio.h&gt; #include&lt;string&gt; #include&lt;stdio.h&gt; #include&lt;stdlib.h&gt;...

Windows инициировала точку останова при очистке динамической памяти
Собственно код, для самообразования перебрасывал адреса динамического массива в функции и издевался...

Сортировка по возрастанию: ошибка "ОС Windows иницииализировала точку останова"
Не знаю, в чем проблема. Написал такую программу #include &lt;stdio.h&gt; int n; int *a = new int;...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru