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

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

21.02.2014, 15:43. Показов 1464. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть некоторая структура
C++
1
2
3
4
5
6
7
8
struct Person
{
    char Surname[40];
    char Name[20];
    sex Sex;
    int Age;
    char Group[5];
};
Есть средства взаимодействия с ними.
C++
1
2
3
4
5
6
struct PersonListItem
{
    Person Person;
    PersonListItem* NextItem;
    PersonListItem* PrevItem;
};
Так же в программе есть переменные хвоста и головы списка.
Все бы вроде ничего, но после вставки в этот список элемента функцией
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
void Insert(Person& person, int index, PersonListItem *&personListHead, PersonListItem *&personListTail, int i)
{
    PersonListItem* currentItem1 = personListHead;
    PersonListItem* currentItem2 = personListTail;
    PersonListItem* personListItem = new PersonListItem;
    personListItem->Person = person;
    personListItem->PrevItem = NULL;
    personListItem->NextItem = NULL;
    if (index == 0)
    {
        personListItem->NextItem = personListHead;
        personListHead->PrevItem = personListItem;
        personListHead = personListItem;
        return;
    }
    for (int j = 0; j < index; j++)
    {
        currentItem1 = currentItem1->NextItem;
    }
    personListItem->PrevItem = currentItem1;
    currentItem1 = currentItem1->NextItem;
    personListItem->NextItem = currentItem1->PrevItem;
    currentItem1 = currentItem1->PrevItem->PrevItem;
    currentItem1->NextItem = personListItem;
    currentItem1 = personListItem;
    return;
}
И при попытки отчистить список функцией
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void Clear(PersonListItem *&personListHead, PersonListItem *&personListTail)
{
    //personListHead = personListHead->NextItem;
    while (personListHead->NextItem != NULL)
    {
        delete personListHead->PrevItem;
        personListHead = personListHead->NextItem;
    }
    personListHead->NextItem = NULL;
    personListHead->PrevItem = NULL;
    personListTail->NextItem = NULL;
    personListTail->PrevItem = NULL;
    return;
}
вылетает ошибка:
Необработанное исключение по адресу 0x5023A9E8 (msvcr120d.dll) в ConsoleApplication2.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0xFEEEFEE2.
Весь день с ней бьюсь. Помогите, пожалуйста.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.02.2014, 15:43
Ответы с готовыми решениями:

Нарушение прав доступа при чтении
Приветствую! Есть файл, для которого пишу парсер. Структура файла такова: какое-то количество...

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

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

Необработанное исключение, нарушение прав доступа при чтении
Необработанное исключение по адресу 0x0F5E4654 (msvcr120d.dll) в Проект1.exe: 0xC0000005: нарушение...

6
29 / 29 / 16
Регистрация: 06.03.2013
Сообщений: 159
21.02.2014, 20:11 2
кода конечно много, но в функции Clear показалась странной вот эта строка
C++
1
delete personListHead->PrevItem;
то есть функции передается головной элемент. по логике вещей у этого головного элемента нет PrevItem, возможно стоит переделать на
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void Clear(PersonListItem *&personListHead, PersonListItem *&personListTail)
{
    //personListHead = personListHead->NextItem;
    while (personListHead->NextItem != NULL)
    {
        if(NULL != personListHead->PrevItem) delete personListHead->PrevItem;
        personListHead = personListHead->NextItem;
    }
    personListHead->NextItem = NULL;
    personListHead->PrevItem = NULL;
    personListTail->NextItem = NULL;
    personListTail->PrevItem = NULL;
    return;
}
да и еще. в функции insert есть строка
C++
1
PersonListItem* currentItem2 = personListTail;
что именно она делает? вроде поиском глянул, больше нигде не участвуют эти перменные. это я к тому, что tail вообще нужен? может в нем тоже проблема есть
1
0 / 0 / 0
Регистрация: 27.12.2012
Сообщений: 13
21.02.2014, 20:24  [ТС] 3
Спасибо вам за попытку помочь, но пока не заработало. personListTail нужен для других функций в этой программе. Здесь представлено очень мало из всего.
Смотрите в чем дело: когда он подходит к концу удаления, то в personListHead->NextItem сначала лежит всякая чушь (оюююююююююююююю...). По идее, это должен быть конец списка, но нет. А потом, при следующем проходе, он выдает ошибку. То ли где-то у меня NULL не присваивается, то ли что. Но вот пока ни в какую проблему не могу найти. Если просто по-человечески заполнять список - проблем нет. Рандомно - тоже никаких проблем. Делаю insert - не очищается.
0
29 / 29 / 16
Регистрация: 06.03.2013
Сообщений: 159
21.02.2014, 20:42 4
Лучший ответ Сообщение было отмечено SirTemerin как решение

Решение

не претендую на истину, но все же
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
void Insert(Person& person, int index, PersonListItem *&personListHead, PersonListItem *&personListTail, int i)
{
    PersonListItem* currentItem1 = personListHead;
    PersonListItem* currentItem2 = personListTail;
    PersonListItem* personListItem = new PersonListItem;
    personListItem->Person = person;
    personListItem->PrevItem = NULL;
    personListItem->NextItem = NULL;
    if (index == 0)
    {
        personListItem->NextItem = personListHead;
        personListHead->PrevItem = personListItem;
        personListHead = personListItem;
        return;
    }
    for (int j = 0; j < index; j++)
    {
        currentItem1 = currentItem1->NextItem;
    }
 
    currentItem1->PrevItem->NextItem = personListItem;
    personListItem->PrevItem = currentItem1->PrevItem;
    personListItem->NextItem = currentItem1;
    currentItem1->PrevItem = personListItem;
}
Добавлено через 3 минуты
немного не по теме, но все же. сам делал подобные задачи лет 9 назад в универе. Вот реально в жизни ни разу не пришлось делать что-то подобное. Для общего развития может ви полезно, но на практике таких своих велосипедов не придумывают, используют стандартные средства =))
1
0 / 0 / 0
Регистрация: 27.12.2012
Сообщений: 13
21.02.2014, 20:43  [ТС] 5
Все заработало. Огромное спасибо! Можно вас еще и попросить прокомментировать то, что вы сделали? Что-то уже голова не варит.
Сам сейчас учусь в универе. Пока только велосипедами и занимаемся. Тяжело эта тема дается. Трудно логику происходящего уследить. Дальше будет только хуже...
0
29 / 29 / 16
Регистрация: 06.03.2013
Сообщений: 159
21.02.2014, 20:48 6
допустим нужно вставить на позицию 1. соответственно currentItem1 - это элемент на позиции 1
C++
1
2
3
4
5
6
7
8
9
10
11
// элемент с позицей 0 теперь ссылается вперед на новый объект
currentItem1->PrevItem->NextItem = personListItem;
 
// новый объект назад ссылается на элемент 0
personListItem->PrevItem = currentItem1->PrevItem;
 
// новый объект ссылается вперед на элемент, который раньше был на позции 1
personListItem->NextItem = currentItem1;
 
// элемент, который раньше был на позиции 1 теперь назад ссылается на новый объект
currentItem1->PrevItem = personListItem;
ну как то так
1
0 / 0 / 0
Регистрация: 27.12.2012
Сообщений: 13
21.02.2014, 20:51  [ТС] 7
Большое вам спасибо. Вы меня очень выручили!
0
21.02.2014, 20:51
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.02.2014, 20:51
Помогаю со студенческими работами здесь

Ошибка: нарушение прав доступа при чтении из файла
Реализовал функцию считывания объектов класса из файла. Функция прекрасно считывает из файла, но...

(C++, asm, winapi) Readfile: Нарушение прав доступа при чтении
Задача: нужно из С++ в ассемблерной вставке обработать текстовый файл, используя функции WinAPI. ...

Необработанное исключение: 0xC0000005: Нарушение прав доступа при чтении
Программа складывает и вычитает матрицы произвольной размерности, читаемые ею с файла. На самом...

Необработанное исключение в "0x1000bc48" в "*.exe": 0xC0000005: Нарушение прав доступа при чтении
Выдает ошибку после запуска приложения. Указывает на строчку : glutPassiveMotionFunc(MM);. Код: ...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru