0 / 0 / 1
Регистрация: 14.02.2016
Сообщений: 2
1

Нарушение прав доступа при чтении по адресу

14.02.2016, 22:49. Показов 498. Ответов 2
Метки нет (Все метки)

В приведённом ниже коде возникает ошибка времени выполнения с текстом из названия. Проблема в том, что остановка выполнения происходит где-то в стандартной библиотеке, а так как я новичок в программировании, то понять не могу. Ошибка возникает перед return в функции main, хотя, возможно, сразу после выхода из последнего цикла. Код реализует алгоритм Форда-Фалкерсона для сети(программа работать не будет, т.к. не вызывается функция Ford_Fulkerson). Файл input.txt во вложении(на ошибку он не влияет, просто в качестве примера).
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
107
108
109
110
111
112
113
114
115
116
117
#include <iostream>
#include <list>
#include <set>
#include <fstream>
 
using namespace std;
 
struct vershina;
struct smej
{
    int c; // пропускная способность
    int f; // величина потока
    bool napravlenie; // направление дуги
    vershina* v;
};
 
struct vershina
{
    int number; // номер вершины
    list<smej> ls;
};
 
int min_potok(vershina &istok, set<int> &cep){
    // поиск минимального потока в цепи
    bool f = true;
    int min = 0;
    list<smej>::iterator ls = istok.ls.begin(); // итератор для перебора смежных вершин
    while (!cep.empty()){
        if (cep.find(ls->v->number) != cep.end()){
            if (f){ // выполняется для первой дуги, инициализирует переменную min
                min = ls->c;
                f = false;
            }
            if (ls->napravlenie && ls->c - ls->f < min) // для прямой дуги
                min = ls->c - ls->f;
            else if (!ls->napravlenie && ls->f < min) // для обратной дуги
                min = ls->f;
            cep.erase(ls->v->number);
            ls = ls->v->ls.begin(); // переходим к следующей вершине в цепи
        }
        else
            ++ls;
    }
    return min;
}
 
int DFS(vershina* v, vershina &istok, vershina &stok, set<int> &cep, set<int> &bad_set){
    if (v->number == stok.number){
        cep.insert(stok.number);
        return min_potok(istok, cep);
    }
    list<smej>::iterator ls = v->ls.begin();
    while (ls != v->ls.end()){
        if (cep.find(ls->v->number) == cep.end() && bad_set.find(ls->v->number) == bad_set.end()) // смежная вершина не принадлежит цепи и множеству вершин, из кторых нельзя попасть в сток
            if (ls->napravlenie && ls->c - ls->f > 0 || !ls->napravlenie && ls->f > 0){
                cep.insert(ls->v->number); // если двигаться по дуге возможно, добавляем её в цепь
                if (int min = DFS(ls->v, istok, stok, cep, bad_set)){ // если DFS возвращает не нулевое значение(сток достигнут)
                    if (ls->napravlenie)
                        ls->f += min;
                    else
                        ls->f -= min;
                    return min;
                }
            }
        ++ls;
    }
    bad_set.insert(v->number); // из вершины v попасть в сток нельзя
    return 0;
}
 
void Ford_Fulkerson(vershina &istok, vershina &stok){
    set<int> cep;
    set<int> bad_set;
    for (list<smej>::iterator ls = istok.ls.begin(); ls != istok.ls.end(); ++ls)
        if (ls->napravlenie && ls->c - ls->f > 0 || !ls->napravlenie && ls->f > 0)
            if (DFS(ls->v, istok, stok, cep, bad_set)) // сток достигнут, насыщение дуг произошло
                Ford_Fulkerson(istok, stok); // повтор обхода с истока
}
 
void Print_in_file(vershina s[], int n, ofstream &outp){
    for (int i = 0; i < n; ++i){
        list<smej>::iterator j = s[i].ls.begin();
        while (j != s[i].ls.end()){
            if (j->napravlenie)
                outp << i + 1 << j->v->number << j->f << endl;
        }
    }
}
 
int main(){
    setlocale(LC_ALL, "Russian");
    ifstream inp("input.txt");
    ofstream outp("output.txt");
 
    int n; // количество вершин
    inp >> n;
    vershina* s = new vershina[n];
    for (int i = 1; i <= n; ++i)
        s->number = i + 1;
 
    int v1, v2, c;
    while (!inp.eof()){
        inp >> v1 >> v2 >> c;
        smej x;
        x.c = c;
        x.f = 0;
 
        x.napravlenie = true;
        x.v = &s[v2];
        s[v1].ls.push_back(x);
        
        x.napravlenie = false;
        x.v = &s[v1];
        s[v2].ls.push_back(x);
    }
    return 0;
}
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Вложения
Тип файла: txt input.txt (93 байт, 1 просмотров)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.02.2016, 22:49
Ответы с готовыми решениями:

Вызвано исключение по адресу 0x013C1891 в Jacobi.exe: 0xC0000005: нарушение прав доступа при чтении по адресу
#include &lt;math.h&gt; const double eps = 0.001; ///&lt; желаемая точность /// N - размерность...

Необработанное исключение по адресу 0x00ED4891 в strings.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0xCCCCCCCC
Программа толком не написан, проверял ранд и возникли проблемы. Ф-ция ранд генерирует одно и тоже...

Необработанное исключение по адресу 0x001B3371 в XXX.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0xFDF
Делал консольную змейку и столкнулся вот с такой проблемой. void stena(char **arr) { int y...

Необработанное исключение по адресу 0x00105FD7 в Динамические структуры: 0xC0000005: нарушение прав доступа при чтении по адресу 0xCDCDCE09
Необработанное исключение по адресу 0x00105FD7 в Динамические структуры.exe: 0xC0000005: нарушение...

2
:)
Эксперт С++
4769 / 3263 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
14.02.2016, 22:56 2
C++
1
2
3
vershina* s = new vershina[n]; 
    for (int i = 1; i <= n; ++i)
        s->number = i + 1; // Как думаешь, что здесь происходит?
1
0 / 0 / 1
Регистрация: 14.02.2016
Сообщений: 2
15.02.2016, 00:15  [ТС] 3
Свою ошибку понял, внёс исправления.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
vershina* s = new vershina[n];
    for (int i = 0; i < n; ++i) // исправлено
        s[i].number = i + 1; // исправлено
 
    int v1, v2, c;
    while (!inp.eof()){
        inp >> v1 >> v2 >> c;
        smej x;
        x.c = c;
        x.f = 0;
 
        x.napravlenie = true;
        x.v = &s[v2 - 1]; // исправлено
        s[v1 - 1].ls.push_back(x); // исправлено
        
        x.napravlenie = false;
        x.v = &s[v1 - 1]; // исправлено
        s[v2 - 1].ls.push_back(x); // исправлено
    }
    return 0;
}
Спасибо за ответ, проблема решена.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.02.2016, 00:15

Нарушение прав доступа при чтении по адресу
Использую библиотеку SFML мне нужно подключить спрайт, но возникает такая ошибка. Кто может...

Нарушение прав доступа при чтении по адресу
Доброго времени суток. Делал задание из Лафоре, и заметил, что при попытке прочитать данные из...

Нарушение прав доступа при чтении по адресу
Всем привет, помогите пожалуйста! Вызвано исключение по адресу 0x00C329FB в...

Нарушение прав доступа при чтении по адресу
Доброго времени суток! Пишу некую прогу. Так вот у меня выпадает ошибка, на скринах показана....


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

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

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