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

Нарушение прав доступа при чтении по адресу, указатели

16.11.2016, 00:08. Показов 1550. Ответов 6

Author24 — интернет-сервис помощи студентам
Доброго времени суток, дорогие форумчане! Проблема в следующем: мне дано было задание сделать игру Го(кто не знает это что-то вроде китайских шахмат-шашек) в консоли с возможностью играть с компьютером! Словом у меня есть класс element, который представляет собой набор данных где есть 4 ссылки на соседние элементы(right, left, top, down), значение(value), координаты на доске 19х19(x, y), дыхания(breathes - соседние места где ничего не стоит). После того, как я реализовал возможность сделать ход со стороны игрока, мне нужно проверить, не хочет ли поставить фишку в место окруженное вражескими(по правилам это запрещено). Эта проверка выглядит так:
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
bool checkForRools(unint irow, unint icolumn, char whoIsValue)
{
    if (board[irow][icolumn].top->value == whoIsValue && board[irow][icolumn].right->value == whoIsValue && board[irow][icolumn].down->value == whoIsValue && board[irow][icolumn].left->value == whoIsValue)//ВОТ ТА МНОГОСТРАДАЛЬНАЯ СТРОКА
    {
        cout << "Your motion doesn't match with rool N_1 - " << rools[0] << board[irow][icolumn].value;
        return false;
    }
    else
    {
        return true;
    }
}
//--------------------------------------------
//А вот определения класса элемент
class element
{
public:
    unint id;
    char value;
    element *top;
    element *left;
    element *right;
    element *down;
    unint x, y, breathes;
    void givingValue(char irow, char icolumn, char ivalue);
    element()
    {
        id = 0;
        value = ' ';
        x = 0;
        y = 0;
        breathes = 4;
    }
    ~element()
    {
        id = 0;
        value = ' ';
        x = 0;
        y = 0;
        breathes = 0;
    }
};
//--------------------------------------------------------------------------------
// Это функция, которая инициализирует указатели на соседние фишки
void element::givingValue(char irow, char icolumn, char ivalue)
{
    x = irow;
    y = icolumn;
    value = ivalue;
    top = &board[irow - 1][icolumn];
    left = &board[irow][icolumn + 1];
    right = &board[irow][icolumn - 1];
    down = &board[irow + 1][icolumn];
}
Вот что выводит:
Миниатюры
Нарушение прав доступа при чтении по адресу, указатели  
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.11.2016, 00:08
Ответы с готовыми решениями:

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

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

Вызвано исключение по адресу 0x00B31BEF в Project.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0xFDFDFE0
Написал программу, но выдает ошибку: Вызвано исключение по адресу 0x00B31BEF в Project.exe:...

C++ Вызвано исключение по адресу 0x00346786 в Smooth_.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0x00
void getvector(string file_, vector&lt;double&gt; mass) { ifstream fin; fin.open(file_); if...

6
0 / 0 / 0
Регистрация: 23.05.2016
Сообщений: 22
16.11.2016, 00:10  [ТС] 2
Если что ошибка в самой длинном условии if вначале!
0
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
16.11.2016, 00:17 3
А вы уверены, что на момент обращения все указатели типа board[irow][icolumn].top/right/down действительны?
C++
1
if (board[irow][icolumn].top && board[irow][icolumn].top->value->value == ...)
Зайдите в отладку, посмотрите значения irow, icolumn. Нет ли выхода за границы массива.
1
0 / 0 / 0
Регистрация: 23.05.2016
Сообщений: 22
16.11.2016, 16:42  [ТС] 4
Я с помощью точки останова обнаружил что:
C++
1
board[irow][icolumn].top = board[irow][icolumn].right = board[irow][icolumn].down = board[irow][icolumn].left | 0x00000000 | NULL
Я просто не пойму, почему инициализируя все указатели в функции givingValue они остаются нулевыми?(Я точно вызываю эту функцию)

Добавлено через 6 минут
Один из моих преподавателей сказал, что решением проблемы может быть инициализация в цикле, но как по мне это ничего не поменяет! Ведь итак им всем даются значения и зачем это еще делать в цикле?... Могу еще выложить код функции, которая получает значения координат нового хода и как раз вызывает функцию инициализации указателей... Вот она:
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
void userTurns(void)
{
    row = 0;
    CHcolumn = 0;
    char answer = ' ';
    bool check = true;
    if (userMotions == 160)
    {
        cout << "Do you want to pass your turn? (y/n)";
        cin >> answer;
        if (answer == 'y')
        {
            userPass++;
        }
    }
    if (answer != 'y')
    {
        bool result1 = true;
        bool result2 = true;
        do
        {
            cout << "\nEnter coords for your new element:\n\t";
            cout << "1) row = ";
            while (!(cin >> row) || (cin.peek() != '\n') || row < 1 || row > 19)
            {
                cin.clear();
                cin.sync();
                while (cin.get() != '\n');
                cout << "\t1) row = ";
            }
            cout << "\t2) column = ";
            while (!(cin >> CHcolumn) || (cin.peek() != '\n') || CHcolumn < 65 || CHcolumn > 83)
            {
                cin.clear();
                cin.sync();
                while (cin.get() != '\n');
                cout << "\t1) column = ";
            }
            --row;
            column = CHcolumn - 65;
            result1 = checkForPosition(row, column);
            result2 = checkForRools(row, column, computerColor);
        } while (!result1 || !result2);
            currentElement = board[row][column].id;
            board[row][column].givingValue(row, column, userColor);
        userMotions++;
    }
Если есть еще вопросы - задавайте, разьясню все что угодно!
0
0 / 0 / 0
Регистрация: 23.05.2016
Сообщений: 22
16.11.2016, 16:55  [ТС] 5
Вот подробнее об ошибке:
Нарушение прав доступа при чтении по адресу, указатели
0
59 / 54 / 34
Регистрация: 18.04.2014
Сообщений: 122
16.11.2016, 17:03 6
Лучший ответ Сообщение было отмечено metrovlad2033 как решение

Решение

metrovlad2033,
C++
1
2
3
4
5
            result1 = checkForPosition(row, column);
            result2 = checkForRools(row, column, computerColor);
        } while (!result1 || !result2);
            currentElement = board[row][column].id;
            board[row][column].givingValue(row, column, userColor);
у тебя функция checkForRools вызывается раньше givingValue.
1
0 / 0 / 0
Регистрация: 23.05.2016
Сообщений: 22
16.11.2016, 20:24  [ТС] 7
БОЛЬШОЕ ВАМ СПАСИБО!!!
0
16.11.2016, 20:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.11.2016, 20:24
Помогаю со студенческими работами здесь

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

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

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

Нарушение прав доступа при чтении по адресу
Ошибка &quot;Вызвано исключение по адресу 0x515EF6BC (ucrtbased.dll) в l2_2.exe: 0xC0000005: нарушение...

Нарушение прав доступа при чтении по адресу
#define _CRT_SECURE_NO_WARNINGS #include &lt;stdio.h&gt; #include &lt;string.h&gt; void Palindrome(char...

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


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

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

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