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

Крашиться программа

13.06.2017, 18:53. Показов 494. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Почему после того как я ввожу размерность доски ввожу координаты начальной позиции коня к примеру (1, 1), то вылазит окошко "программа не отвечает"?
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
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <time.h>
 #include <conio.h>
using namespace std;
 
#define move_types 8
 
int possible_moves[move_types][2]  = {
        {-1, -2}, {-2, -1}, {-2,  1}, { 1, -2},
        {-1,  2}, { 2, -1}, { 1,  2}, { 2,  1} 
};
 
int **global;       
int size_x, size_y;          
int max_moves, back_ret;
 
 
/*Функция проверяет может ли быть сделан ход на клетку с координатами x,y*/
int move_possible(int x, int y) 
{
        return x >= 0 && y >= 0 && x < size_x && y < size_y && global[x][y] == 0;
}
 
 
int find_path(int cur_x, int cur_y, int move_num)
{
        int next_x = 0, next_y = 0;
        global[cur_x][cur_y] = move_num;
        
        if(move_num > max_moves)
                return 1;
 
        for(int i = 0; i < move_types; i++)
        {       next_x = cur_x + possible_moves[i][0];
                next_y = cur_y + possible_moves[i][1];
                if(move_possible(next_x, next_y) && find_path(next_x, next_y, move_num + 1))
                return 1;
        }
 
        global[cur_x][cur_y] = 0;
        back_ret++;
        move_num++;
        return 0;
}
 
 
 
/*главная функция*/
int main() 
{
setlocale (LC_ALL,"");
 
int i,nrows,ncols,sy,sx,**desc = NULL;
time_t start,end;
//вводим данные
cout<<"Введите размерность доски (от 2 до 8) :"<<endl
 <<"по оси "X"\t"; cin>>size_x;
cout<<"по оси "Y"\t";cin>>size_y;
if(size_x>8||size_x<2||size_y>8||size_y<2)
{
cout<<"Неверный размер"; 
getch(); 
}
//проверяем размерность
cout<<"Введите начальные координаты:"<<endl
 <<"Координата по оси"X"\t";cin>>sx;
cout<<"Координата по оси"Y"\t";cin>>sy;
//проверяем координаты
 
 
start=time(NULL);//стартуем
//инициализируем увзвтель и выделяем память
desc = (int **)malloc(sizeof(int) * size_x);
for(i = 0; i < size_x; ++i) 
        desc[i] = (int *)malloc(sizeof(int) * size_y);
 
//инициализируем другие переменные
back_ret = 0;
global = desc;
max_moves = size_x * size_y - 1;
 
//зануляем массив
for(int i = 0; i < size_x; ++i) {
        for(int j = 0; j < size_y; ++j)
                global[i][j] = 0;
}
 
 
//поиск решения
if(find_path(sx, sy, 1)){
 cout<<"___________________________________________"<<endl
  <<"\t***Решение***"<<endl
  <<"___________________________________________"<<endl;
 for(int i = 0; i < size_x; ++i) {
  cout<<endl;
  for(int j = 0; j < size_y; ++j)
    cout<<global[i][j]<<"\t";
    cout<<endl;} 
 cout<<"___________________________________________"<<endl;
}
else cout<<"Нет решения"<<endl;
 
 
//освобождаем память
for(i = 0; i < size_x; ++i)
        free(desc[i]);
free(desc);
end=time(NULL);//время конца цикла
 
//время поиска решения
cout<<"время поиска решения "<<difftime(end, start) <<" сек."<<endl;
cout<<"___________________________________________"<<endl;
getch(); 
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.06.2017, 18:53
Ответы с готовыми решениями:

Крашиться код при запуске
Код компилиться, все ок, но после крашиться и завершает роботу. Код вставляет матрицу начиная с...

Зависает/Крашиться Windows Media
Без какой либо понятной причины стал зависать,долго открывать,и тупо крашиться при старте сей...

Крашиться при запросе String number = c.getString(c.getColumnIndex("address");
http://rghost.ru/6FKfffYZG крашится на 88 строке почему? проект -...

Программа не может быть запущена, т.к. на Вашем компьютере установлена программа-эмулятор
При запуске лицензионной детской игровой программы выскакивает сообщение: Программа не может быть...

7
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
13.06.2017, 19:22 2
Цитата Сообщение от Croix Посмотреть сообщение
Почему
Найди, с помощью отладчика, место в коде, где вылет происходит.
0
2 / 2 / 0
Регистрация: 18.12.2016
Сообщений: 61
13.06.2017, 19:40  [ТС] 3
Нашел ошибку в строке
C++
1
free(desc);
скрин ошибки ниже.
Крашиться программа
0
MrGluck
13.06.2017, 19:43
  #4
 Комментарий модератора 
Картинки заливайте на форум
0
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
13.06.2017, 19:46 5
Цитата Сообщение от Croix Посмотреть сообщение
global = desc;
Память отдельно под global выделять надо и копировать в цикле. У вас два указателя указывают на один и тот же участок памяти.
0
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
13.06.2017, 19:46 6
Цитата Сообщение от Croix Посмотреть сообщение
C++
1
desc = (int **)malloc(sizeof(int) * size_x);
Здесь sizeof() нужно передавать указатель на int, а не int. На 32-х битных платформах - это одинаковая величина, но, всё равно, нужно правильно написать, мало ли что...
0
2 / 2 / 0
Регистрация: 18.12.2016
Сообщений: 61
13.06.2017, 20:21  [ТС] 7
Короче написал так все заработало. Зачем этот malloc тогда там писали? Если можно и проще и понятнее? Есть ли какая-то разница?
C++
1
2
3
desc = new int*[size_x];
for(i = 0; i < size_x; ++i) 
        desc[i] = new int[size_y];
0
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,939
13.06.2017, 20:33 8
Croix, естественно разница есть. Если так поменял, то в конце функции вместо
C
1
2
3
4
//освобождаем память
for(i = 0; i < size_x; ++i)
        free(desc[i]);
free(desc);
должно быть
C++
1
2
3
4
//освобождаем память
for(i = 0; i < size_x; ++i)
        delete[] desc[i];
delete[] desc;
Просто malloc - это выделение памяти в языке C, а new - в языке С++ . Но С++ поддерживает многое из С, в том числе такие функции как malloc/free.
0
13.06.2017, 20:33
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.06.2017, 20:33
Помогаю со студенческими работами здесь

Программа циков с неизвестным число повторений и программа с внутренним ветвлением
1.Дано натуральное число n. Получить наименьшее натуральное число вида m в степени 2, превосходящее...

Не могу понять почему программа не выводит результат (простейшая программа)
Здравствуйте уважаемые форумчане! Я начал изучать C++ при помощи книги. На днях я столкнулся со...

Программа подсчета числа неуспевающих и программа поиска владельца автомобиля...
Помогите пожалуйста решить 2 задачи: Составьте программу подсчета числа неуспевающих по...

Квин-программа, или программа, печатающая свой исходный текст
Задаю этот вопрос под влиянием этой темы и предлагаю решение: Sub Kvin() Dim A(1 To 13) As...


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

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

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