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

Не завершается метод - C++

Восстановить пароль Регистрация
 
Gomg
5 / 5 / 0
Регистрация: 28.06.2013
Сообщений: 116
23.12.2013, 17:52     Не завершается метод #1
По идее оператор return; должен завершить метод Turning(). Но через брейкпоинты я посмотрел что после выполнения return; он продолжает не даже с начала метода и не с начала цикла, а с FindMinimum(); !!!! Почему так?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void Turning(){
    if (turns == N*N)
        solutions++;
    for (int i = 0; i < 8; i++){
        FindMinimum();
        //if (Check(cur_x_pos+x_pos[i], cur_y_pos+y_pos[i]))
 
        {
            Turn(x_min, y_min);
            if (CheckSurround()) 
                return;
            Turning();
        }
    }   
}
Да и выполнение основного кода после вызова Turning() не происходит

Добавлено через 24 минуты
Блин, ребята, срочно нужно
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6165 / 2894 / 282
Регистрация: 04.12.2011
Сообщений: 7,694
Записей в блоге: 3
23.12.2013, 18:02     Не завершается метод #2
Gomg, Вы не показываете код
Цитата Сообщение от Gomg Посмотреть сообщение
FindMinimum()!!!
и приходится напрягать экстрасенсорику. Предположу, что либо FindMinimum() рекурсивна, либо она взаимно рекурсивна с Turning(), т.е. где-то опять её вызывает. Хотя циклиться в этом разе долго не должно. Стек ограничен.
Либо просто зацикливается по другим причинам, перечислять которые места не хватит. Например весело прыгает вокруг минимума.
Это нормально, скоро Новый Год!
vans37
 Аватар для vans37
35 / 19 / 1
Регистрация: 28.01.2013
Сообщений: 37
23.12.2013, 18:03     Не завершается метод #3
Цитата Сообщение от Gomg Посмотреть сообщение
По идее оператор return; должен завершить метод Turning(). Но через брейкпоинты я посмотрел что после выполнения return; он продолжает не даже с начала метода и не с начала цикла, а с FindMinimum(); !!!! Почему так?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void Turning(){
    if (turns == N*N)
        solutions++;
    for (int i = 0; i < 8; i++){
        FindMinimum();
        //if (Check(cur_x_pos+x_pos[i], cur_y_pos+y_pos[i]))
 
        {
            Turn(x_min, y_min);
            if (CheckSurround()) 
                return;
            Turning();
        }
    }   
}
Да и выполнение основного кода после вызова Turning() не происходит

Добавлено через 24 минуты
Блин, ребята, срочно нужно
В этом куске кода мало что можно рассмотреть
Ф-ия CheckSurround() что возвращает?В случае возврата не нулевого значения выполнится ваша фи-я Turning() ,иначе просто выкенет из цикла.
Вместо return попробуйте операторы Break и Continue
Он верно начинает,если вас не выкидывает из цикла,он начнет выполнять действия с изменения счетчика,затем выполнять ф-ию FindMinimum()
Gomg
5 / 5 / 0
Регистрация: 28.06.2013
Сообщений: 116
23.12.2013, 18:17  [ТС]     Не завершается метод #4
в FindMinimum() не вызывается ни единой функции. CheckSurround() возвращает bool. return; выполняется. Проверял через брейкпоинт. Но после return; он переходит опять к FindMinimum(), хотя должен просто завершить функцию и продолжить выполнять код из main()

Добавлено через 1 минуту
мне нужно немедленное завершение функции

Добавлено через 3 минуты
надпись FindMinimum() во всем коде встречается 2 раза при объявлении функции и здесь

Добавлено через 1 минуту
да и после break; туда же возвращается
vans37
 Аватар для vans37
35 / 19 / 1
Регистрация: 28.01.2013
Сообщений: 37
23.12.2013, 18:20     Не завершается метод #5
может выложите весь код?а не его кусок
Gomg
5 / 5 / 0
Регистрация: 28.06.2013
Сообщений: 116
23.12.2013, 18:22  [ТС]     Не завершается метод #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
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
const int N = 4;
bool field[N][N] = {false};
int acc[N][N];
 
int x_pos[] = {2, 1, -1, -2, -2, -1, 1, 2};
int y_pos[] = {1, 2,  2,  1, -1, -2,-2,-1};
int start_x_pos = 2, start_y_pos = 1;
int cur_x_pos = start_x_pos, cur_y_pos = start_y_pos;
int turns = 1;
int solutions = 0;
int x_min, y_min;
 
bool Check(int x, int y){
    if (x >= 0 && x < N && y >= 0 && y < N && !field[x][y])
        return true;
    else return false;
}
 
bool CheckSurround(){
    for (int i = 0; i < 8; i++){
        if (!field[cur_x_pos + x_pos[i]][cur_y_pos + y_pos[i]] && (cur_x_pos + x_pos[i]) >= 0 && (cur_x_pos + x_pos[i]) < N && (cur_y_pos + y_pos[i]) >= 0 && (cur_y_pos + y_pos[i]) < N)
            return false;
    }
    return true;
}
 
void Turn(int x, int y){
    field[x][y] = true;
    cur_x_pos = x; cur_y_pos = y;
    turns++;
    
}
 
void FindMinimum(){
    int min;
    int x, y;
    for (int j =0; j < 8; j++){
        if ((cur_x_pos+x_pos[j]) >=0 && (cur_x_pos+x_pos[j])<N && (cur_y_pos+y_pos[j])>=0 && (cur_y_pos+y_pos[j]) <N){
            min = acc[cur_x_pos+x_pos[j]][cur_y_pos+y_pos[j]];
            x = cur_x_pos+x_pos[j], y = cur_y_pos+y_pos[j];
            break;
        }
    }
    int i = 1;
    for (i = 1; i < 8; i++){
        if ((cur_x_pos+x_pos[i]) >=0 && (cur_x_pos+x_pos[i])<N && (cur_y_pos+y_pos[i])>=0 && (cur_y_pos+y_pos[i]) <N)
            if (min >= acc[cur_x_pos+x_pos[i]][cur_y_pos+y_pos[i]] && !field[cur_x_pos+x_pos[i]][cur_y_pos+y_pos[i]]){
                min = acc[cur_x_pos+x_pos[i]][cur_y_pos+y_pos[i]];
                x = cur_x_pos+x_pos[i];
                y = cur_y_pos+y_pos[i];
            }
    }
    x_min = x;
    y_min = y;
}
 
void Turning(){
    if (turns == N*N)
        solutions++;
    for (int i = 0; i < 8; i++){
        FindMinimum();
        Turn(x_min, y_min);
        if (CheckSurround()) 
            break;
        Turning();
    }   
}
 
void AccessibilityInit(){
    int count = 0;
    for (int i = 0; i < N; i++){
        for (int j = 0; j < N; j++){
            for (int h = 0; h < 8; h++){
                if (i + y_pos[h] >= 0 && i + y_pos[h] < N && j + x_pos[h] >= 0 &&  j + x_pos[h] < N)
                count++;
            }
            acc[i][j] = count;
            count = 0;
        }
    }
}
 
void ReInitialize(){
turns = 1;
    for (int i = 0; i < N; i++)
        for (int j = 0 ; j < N;j++)     
            field[i][j] = false;
}
 
 
 
void Draw(){
    for (int i = 0; i < N; i++){
        for (int j =0 ; j< N;j++){
            if (j == start_x_pos && i == start_y_pos)
                printf("S");
            else if (field[j][i])
                printf("X");
            else 
                printf("O");
        }
        printf("\n");
    }
    printf("\nNo turns. Total turns for %d(xpos) and %d(ypos) = %d; %dx%d(%d)", start_x_pos+1, start_y_pos+1, turns,N,N,N*N);
    printf("\n\n");
}
 
 
void Test(){
    AccessibilityInit();
    //for (int yp = 0 ; yp < N; yp++){
        //for (int xp = 0; xp < N; xp++){
            ReInitialize();
            start_x_pos = 1; start_y_pos = 1;
            field[start_x_pos][start_y_pos] = true;
            cur_x_pos = start_x_pos; cur_y_pos = start_y_pos;
            Turning();
            Draw();
        //}
    //}
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.12.2013, 18:28     Не завершается метод #7
Цитата Сообщение от Gomg Посмотреть сообщение
По идее оператор return; должен завершить метод Turning().
Завершал бы, если бы рекурсии не было.
Цитата Сообщение от Gomg Посмотреть сообщение
мне нужно немедленное завершение функции
А возврат из рекурсии куда денете?
vans37
 Аватар для vans37
35 / 19 / 1
Регистрация: 28.01.2013
Сообщений: 37
23.12.2013, 18:32     Не завершается метод #8
точно
рекурсивный вызов ведь
Gomg
5 / 5 / 0
Регистрация: 28.06.2013
Сообщений: 116
23.12.2013, 18:38  [ТС]     Не завершается метод #9
так это как бы если он завершает returnом из функции то код должен идти дальше где я её первый раз вызвал. Да и причем тут рекурсия, т.к. он продолжает не с функции и даже не с цикла, а с непонятно какой строчки которая в коде всего 2 раза. при объявлении и тут. По сути мне надо чтобы он продолжил с 118 строки Draw()

Добавлено через 1 минуту
да то же самое. Это по сути просто тот же код усложненный

Добавлено через 4 минуты
а я кажется понял. Тут он рекурсируется и return завершает рекурсируемый метод? Тогда как мне закрыть все рекурсировки разом?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.12.2013, 18:40     Не завершается метод #10
Цитата Сообщение от Gomg Посмотреть сообщение
Да и причем тут рекурсия, т.к. он продолжает не с функции и даже не с цикла, а с непонятно какой строчки которая в коде
После return, выход из рекурсии начнётся с 13 строки (код в первом посте).
Gomg
5 / 5 / 0
Регистрация: 28.06.2013
Сообщений: 116
23.12.2013, 18:42  [ТС]     Не завершается метод #11
на других форумах что-то пишут про throw. Может так?

Добавлено через 1 минуту
Цитата Сообщение от alsav22 Посмотреть сообщение
После return, выход из рекурсии начнётся с 13 строки (код в первом посте).
ммм... не совсем понял почему на 13
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.12.2013, 18:46     Не завершается метод #12
Цитата Сообщение от Gomg Посмотреть сообщение
не совсем понял почему на 13
Потому что в 12-й - рекурсивный вызов.
Gomg
5 / 5 / 0
Регистрация: 28.06.2013
Сообщений: 116
23.12.2013, 18:51  [ТС]     Не завершается метод #13
так что мне делать то? как мне завершить все рекурсированные функции разом?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.12.2013, 18:56     Не завершается метод #14
Цитата Сообщение от Gomg Посмотреть сообщение
так что мне делать то?
Рекурсию убрать.
Gomg
5 / 5 / 0
Регистрация: 28.06.2013
Сообщений: 116
23.12.2013, 19:13  [ТС]     Не завершается метод #15
мне нужна рекурсия

Добавлено через 11 минут
короче у меня задача написать программу чтобы считало количество решений хода конем(задача о ходе коня). Я решил делать по методу Варнсдорфа

Добавлено через 20 секунд
тут без рекурсии кажется не обойтись
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.12.2013, 20:16     Не завершается метод
Еще ссылки по теме:

Программа завершается с ошибкой Killed C++
Созданный объект Array<char> удаляется, как только метод convert завершается C++
C++ Не завершается программа

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

Или воспользуйтесь поиском по форуму:
Alex5
881 / 616 / 81
Регистрация: 12.04.2010
Сообщений: 1,552
23.12.2013, 20:16     Не завершается метод #16
Цитата Сообщение от Gomg Посмотреть сообщение
как мне завершить все рекурсированные функции разом?
Цитата Сообщение от Gomg Посмотреть сообщение
на других форумах что-то пишут про throw
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
void Turning()
{
    static int count = 0;
    ++count;
    cout << " Turning()  begin " << count << endl;
 
    // рекурсия 
    if( count < 5 ) 
    {
        cout << "\n recursion call, ";
        Turning();
    }
 
    cout << "\n throw \n";
    throw( count );
 
    cout << " Turning()  end " << count << endl;
}
 
int main()
{
    try
    {
        Turning();
    }
    catch( int n )
    {
        cout << "\n catch : " << n << endl;
    }
 
    getchar();
}
Миниатюры
Не завершается метод  
Yandex
Объявления
23.12.2013, 20:16     Не завершается метод
Ответ Создать тему
Опции темы

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