Форум программистов, компьютерный форум CyberForum.ru

Похождения коня - C++

Восстановить пароль Регистрация
 
kciosdse
0 / 0 / 0
Регистрация: 26.11.2012
Сообщений: 55
26.11.2012, 17:27     Похождения коня #1
Добрый день!
Пишу программу для решения шахматной задачи "Похождения коня," ( Условие : Требуется обойти конем все 64 клетки шахматной доски так, чтобы на каждой клетке конь был только один раз. Доска - 8х8 ) и возникла проблема : после хода коня нужно проверить все клетки, на которые он мог бы пойти, считать их значение и записать его в другой массив. Функцию для этого я написал, и программа выполняет всё что нужно, но после выполнения возникает ошибка APPCRASH вот описание ошибки :
Кликните здесь для просмотра всего текста
Сигнатура проблемы:
Имя события проблемы: APPCRASH
Имя приложения: tt2.exe
Версия приложения: 0.0.0.0
Отметка времени приложения: 50b364b6
Имя модуля с ошибкой: tt2.exe
Версия модуля с ошибкой: 0.0.0.0
Отметка времени модуля с ошибкой: 50b364b6
Код исключения: c0000005
Смещение исключения: 0002c7de
Версия ОС: 6.1.7600.2.0.0.256.1
Код языка: 1049
Дополнительные сведения 1: 0a9e
Дополнительные сведения 2: 0a9e372d3b4ad19135b953a78882e789
Дополнительные сведения 3: 0a9e
Дополнительные сведения 4: 0a9e372d3b4ad19135b953a78882e789

Вот код программы:
Кликните здесь для просмотра всего текста
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
118
119
120
121
#include <iostream>
 
using namespace std;
    void PrintchArrayBoard(char *pchArrayBoard,char chArrayBoard[8][8]) // Печать доски (char массив)
    {
        for (int i = 0; i < 8; i++) //вывод массива
        {
            pchArrayBoard = chArrayBoard[i];// строки
                for (int j = 0; j < 8; j++)
                {
                    std::cout <<" "<< *(pchArrayBoard+j); //столбцы
 
                }
            cout <<endl;
        }
    }
    void PrintintArrayBoard(int *pintArrayBoard,int intArrayBoard[8][8]) // Печать доски (int массив)
    {
        for (int i = 0; i < 8; i++) //вывод массива
        {
            pintArrayBoard = intArrayBoard[i];// строки
                for (int j = 0; j < 8; j++)
                {
                    std::cout <<" "<< intArrayBoard[i][j]; //столбцы
 
                }
            cout <<endl;
        }
    }
    void Move(int movex,int movey, char *pchArrayBoard,char chArrayBoard[8][8]) // Функция движения (отмечает ход в другом, символьном массиве)
    {
    pchArrayBoard = chArrayBoard[movex];
    *(pchArrayBoard+movey)= 'y';
    }
    void ReductionPossibleMoves(int movex,int movey, int *pintArrayBoard,int intArrayBoard[8][8],int *pintArrayPossibleMovement) // Инициализация возможных ходов
    {
        int mx, my, y, x;
        //Просмотр доступных ходов
        for (int i = 0;i < 8; i++)
        {
            mx=movex;my=movey;
                 if (i == 0) {x = -1; y = -2;} // перебор возможных ходов
            else if (i == 1) {x = -1; y =  2;}
            else if (i == 2) {x =  1; y = -2;}
            else if (i == 3) {x =  1; y =  2;}
            else if (i == 4) {x =  2; y =  1;}
            else if (i == 5) {x =  2; y = -1;}
            else if (i == 6) {x = -2; y =  1;}
            else if (i == 7) {x = -2; y = -1;}
            mx+=x;
            my+=y;
            if ((mx>=0) && (mx<=8) && (my>=0) && (my<=8)) // установка границы
            {
            pintArrayBoard = intArrayBoard[mx];
 
            *(pintArrayBoard + my) -= 1; // Уменьшение значения клетки(возможного хода) на 1
 
            pintArrayPossibleMovement[i] = *(pintArrayBoard + my); // Передача значения из одного массива в другой,
                                                                   // если строку закоментировать, то ошибки не будет.
 
            }
 
        }
    }
    //void ChoiceMove (int movex, int movey,int intArrayPossibleMovement[8], int *pintArrayPossibleMovement,int intArrayBoard[8][8], int *pintArrayBoard)
    //{
 
    //}
int main()
{
    srand(time(NULL));
    int movex = 2 + rand() % 4, movey = 2 + rand() % 4;// Случайный первый ход
    cout<<movex<<movey<<endl<<endl<<endl;
        char chArrayBoard[8][8] =
        {
            {'x','x','x','x','x','x','x','x'},
            {'x','x','x','x','x','x','x','x'},
            {'x','x','x','x','x','x','x','x'},
            {'x','x','x','x','x','x','x','x'},
            {'x','x','x','x','x','x','x','x'},
            {'x','x','x','x','x','x','x','x'},
            {'x','x','x','x','x','x','x','x'},
            {'x','x','x','x','x','x','x','x'}
        };
        int intArrayBoard[8][8] =
        {
            {2,3,4,4,4,4,3,2},
            {3,4,6,6,6,6,4,3},
            {4,6,8,8,8,8,6,4},
            {4,6,8,8,8,8,6,4},
            {4,6,8,8,8,8,6,4},
            {4,6,8,8,8,8,6,4},
            {3,4,6,6,6,6,4,3},
            {2,3,4,4,4,4,3,2}
        };
 
        int intArrayPossibleMovement[8] = {0,0,0,0,0,0,0,0}; // массив для хранения значений клеток возможных ходов.
        int *pintArrayPossibleMovement;
 
    char *pchArrayBoard;
    int *pintArrayBoard;
 
 
    ReductionPossibleMoves(movex, movey,pintArrayBoard,intArrayBoard,pintArrayPossibleMovement);
 
    //ChoiceMove(movex, movey,intArrayPossibleMovement,pintArrayPossibleMovement,intArrayBoard, pintArrayBoard);
 
    Move(movex,movey,pchArrayBoard,chArrayBoard);
 
    PrintintArrayBoard(pintArrayBoard,intArrayBoard);
 
    PrintchArrayBoard(pchArrayBoard,chArrayBoard);
 
    for (int i = 0;i<8;i++)
    {
        if (pintArrayPossibleMovement[i]>=0 && pintArrayPossibleMovement[i]<8)
        cout<<pintArrayPossibleMovement[i];
    }
 
    return 0;
    }

Хотелось бы узнать, в чём проблема, и как её решить. Буду благодарен за помощь!

Добавлено через 12 минут
Ошибка в строке 58 , если её закомментировать - ошибки не будет.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.11.2012, 17:27     Похождения коня
Посмотрите здесь:

Путешесвтие коня. C++
Ходы шахматного коня C++
Головоломка о путешествии коня C++
Кратчайший путь коня с++ C++
Задачка про Коня и Короля C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ps10n1ck
 Аватар для ps10n1ck
53 / 47 / 2
Регистрация: 10.11.2010
Сообщений: 132
26.11.2012, 17:44     Похождения коня #2
по всей видимости, в этой части
C++
1
*(pintArrayBoard + my)
my неверно считается, что приводит к выходу за пределы массива и завершению программы - но это чисто теория, программу пока до конца не разобрал, посмотрю может что и найду =)
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11811 / 6790 / 767
Регистрация: 27.09.2012
Сообщений: 16,840
Записей в блоге: 2
Завершенные тесты: 1
26.11.2012, 17:45     Похождения коня #3
А где выделяется память под pintArrayPossibleMovement?
В упор не вижу. Если не выделяется, то Вы пишите в никуда.
kciosdse
0 / 0 / 0
Регистрация: 26.11.2012
Сообщений: 55
26.11.2012, 17:47  [ТС]     Похождения коня #4
строка 98
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11811 / 6790 / 767
Регистрация: 27.09.2012
Сообщений: 16,840
Записей в блоге: 2
Завершенные тесты: 1
26.11.2012, 17:48     Похождения коня #5
Цитата Сообщение от kciosdse Посмотреть сообщение
строка 98
Это объявление указателя, но нет его инициализации - в результате указатель указывает не пойми куда, поэтому и происходит ошибка.
kciosdse
0 / 0 / 0
Регистрация: 26.11.2012
Сообщений: 55
26.11.2012, 17:51  [ТС]     Похождения коня #6
Проблема в том что значения успешно передаются из одного массива, во второй, потом из второго выводится (пока для проверки) а уже потом программа вылетает.

Добавлено через 1 минуту
Цитата Сообщение от Croessmah Посмотреть сообщение
Это объявление указателя, но нет его инициализации - в результате указатель указывает не пойми куда, поэтому и происходит ошибка.
Ну... в таком случае я вообще нигде не выделял память) просто только начал делать динамические массивы, и ещё не совсем всё понял.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11811 / 6790 / 767
Регистрация: 27.09.2012
Сообщений: 16,840
Записей в блоге: 2
Завершенные тесты: 1
26.11.2012, 17:54     Похождения коня #7
C++
1
2
3
    int *pintArrayPossibleMovement=intArrayPossibleMovement; 
    char *pchArrayBoard=&(chArrayBoard[0][0]);
    int *pintArrayBoard=&(intArrayBoard[0][0]);
kciosdse
0 / 0 / 0
Регистрация: 26.11.2012
Сообщений: 55
26.11.2012, 18:00  [ТС]     Похождения коня #8
Большое спасибо за помощь! Только хотелось бы уточнить - вы указателю присвоили значение адреса статического массива? И ещё, где-то читал что память выделяется функцией "new".
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.11.2012, 18:25     Похождения коня
Еще ссылки по теме:

C++ программа шахматы (маршрут коня)
Задача о ходе коня. Опять C++
C++ Задача - Путешествие коня

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

Или воспользуйтесь поиском по форуму:
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11811 / 6790 / 767
Регистрация: 27.09.2012
Сообщений: 16,840
Записей в блоге: 2
Завершенные тесты: 1
26.11.2012, 18:25     Похождения коня #9
Цитата Сообщение от kciosdse Посмотреть сообщение
Только хотелось бы уточнить - вы указателю присвоили значение адреса статического массива? И ещё, где-то читал что память выделяется функцией "new".
Я просто не знаю, зачем Вам нужны данные указатели, поэтому инициализировал их адресами массивов. Если же, Вам нужно выделение памяти, то необходимо выделять память с помощью new (malloc)
Yandex
Объявления
26.11.2012, 18:25     Похождения коня
Ответ Создать тему
Опции темы

Текущее время: 03:19. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru