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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Gomg
5 / 5 / 0
Регистрация: 28.06.2013
Сообщений: 116
#1

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

23.12.2013, 17:52. Просмотров 413. Ответов 15
Метки нет (Все метки)

По идее оператор 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 минуты
Блин, ребята, срочно нужно
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.12.2013, 17:52
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не завершается метод (C++):

Созданный объект Array<char> удаляется, как только метод convert завершается - C++
Есть простенькая оболочка над массивом Array&lt;T&gt;: template&lt;typename T&gt; class Array { private: T* data; public: const...

СЛАУ. Метод обратной матрицы, метод Гаусса, метод Крамера, метод Зейделя - C++
Помогите ребят. Не могу построить алгоритмы для этих методов Язык C++

Не завершается программа - C++
После ввода массива консоль не закрывается, почему? #include &quot;stdafx.h&quot; #include &lt;fstream&gt; #include &lt;stdlib.h&gt; #include &lt;iomanip&gt; ...

Программа не завершается - C++
Здравствуйте! 1) Моя программа на первом же тесте превышает положенное время (она не долго работает, она просто не завершается)....

Программа не завершается корректно - C++
Написал программу, определяющую наибольшее из двух введённых пользователем чисел. Решил усложнить её и завершить её только нажатия,...

Программа сразу завершается - C++
Здравствуйте! Я написал программу с конфигурацией решения Release, при запуске exe-файла программа тут же закрывается, а то что она выводит...

15
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6486 / 3130 / 307
Регистрация: 04.12.2011
Сообщений: 8,644
Записей в блоге: 5
23.12.2013, 18:02 #2
Gomg, Вы не показываете код
Цитата Сообщение от Gomg Посмотреть сообщение
FindMinimum()!!!
и приходится напрягать экстрасенсорику. Предположу, что либо FindMinimum() рекурсивна, либо она взаимно рекурсивна с Turning(), т.е. где-то опять её вызывает. Хотя циклиться в этом разе долго не должно. Стек ограничен.
Либо просто зацикливается по другим причинам, перечислять которые места не хватит. Например весело прыгает вокруг минимума.
Это нормально, скоро Новый Год!
0
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()
0
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; туда же возвращается
1
vans37
35 / 19 / 1
Регистрация: 28.01.2013
Сообщений: 37
23.12.2013, 18:20 #5
может выложите весь код?а не его кусок
0
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();
        //}
    //}
0
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.12.2013, 18:28 #7
Цитата Сообщение от Gomg Посмотреть сообщение
По идее оператор return; должен завершить метод Turning().
Завершал бы, если бы рекурсии не было.
Цитата Сообщение от Gomg Посмотреть сообщение
мне нужно немедленное завершение функции
А возврат из рекурсии куда денете?
0
vans37
35 / 19 / 1
Регистрация: 28.01.2013
Сообщений: 37
23.12.2013, 18:32 #8
точно
рекурсивный вызов ведь
0
Gomg
5 / 5 / 0
Регистрация: 28.06.2013
Сообщений: 116
23.12.2013, 18:38  [ТС] #9
так это как бы если он завершает returnом из функции то код должен идти дальше где я её первый раз вызвал. Да и причем тут рекурсия, т.к. он продолжает не с функции и даже не с цикла, а с непонятно какой строчки которая в коде всего 2 раза. при объявлении и тут. По сути мне надо чтобы он продолжил с 118 строки Draw()

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

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

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

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

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

программа завершается аварийно - C++
запускаю компилятор, все запустилось, работает (меню из кучи условий if-else). выбираю любой пункт меню и он работает, после этого надо...

Метод медиан из трех элементов VS улучшенный быстрый метод сортировки(метод Бентли-Макилроя) - C++
Здравствуйте! Дали весьма интересное задание. Сравнить два вышеуказанных метода сортировки для массива из 10000 элементов, результаты...

WDK7000 компиляция не завершается успешно - C++
Доброго времени суток.Помогите с элементарной вещью) Установил windows driver kit 7000.Компилирую исходник драйвера через &quot;windows xp&gt;x86...

Цикл не завершается при 2х условиях - C++
Пробовал как цикл while, Так и цикл do while. Цикл не хочет прекращаться при 2х условиях, закрывается только при одном. int main() ...


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
23.12.2013, 19:13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru