Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
5 / 5 / 0
Регистрация: 28.06.2013
Сообщений: 116
1

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

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

Author24 — интернет-сервис помощи студентам
По идее оператор 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.12.2013, 17:52
Ответы с готовыми решениями:

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

Асинхронный метод долго (никогда?) не завершается
Добрый день. Вызываю асинхронный метод вот так: StockOrderInfo info; ...

Батник и процесс: то завершается, но не завершается
Доброго. В общем, на свои нужды писал я батник, в котором цикл запусков/работы с...

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

15
Комп_Оратор)
Эксперт по математике/физике
8949 / 4703 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
23.12.2013, 18:02 2
Gomg, Вы не показываете код
Цитата Сообщение от Gomg Посмотреть сообщение
FindMinimum()!!!
и приходится напрягать экстрасенсорику. Предположу, что либо FindMinimum() рекурсивна, либо она взаимно рекурсивна с Turning(), т.е. где-то опять её вызывает. Хотя циклиться в этом разе долго не должно. Стек ограничен.
Либо просто зацикливается по другим причинам, перечислять которые места не хватит. Например весело прыгает вокруг минимума.
Это нормально, скоро Новый Год!
0
36 / 20 / 4
Регистрация: 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
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
36 / 20 / 4
Регистрация: 28.01.2013
Сообщений: 37
23.12.2013, 18:20 5
может выложите весь код?а не его кусок
0
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
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
23.12.2013, 18:28 7
Цитата Сообщение от Gomg Посмотреть сообщение
По идее оператор return; должен завершить метод Turning().
Завершал бы, если бы рекурсии не было.
Цитата Сообщение от Gomg Посмотреть сообщение
мне нужно немедленное завершение функции
А возврат из рекурсии куда денете?
0
36 / 20 / 4
Регистрация: 28.01.2013
Сообщений: 37
23.12.2013, 18:32 8
точно
рекурсивный вызов ведь
0
5 / 5 / 0
Регистрация: 28.06.2013
Сообщений: 116
23.12.2013, 18:38  [ТС] 9
так это как бы если он завершает returnом из функции то код должен идти дальше где я её первый раз вызвал. Да и причем тут рекурсия, т.к. он продолжает не с функции и даже не с цикла, а с непонятно какой строчки которая в коде всего 2 раза. при объявлении и тут. По сути мне надо чтобы он продолжил с 118 строки Draw()

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

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

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

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

Добавлено через 20 секунд
тут без рекурсии кажется не обойтись
0
1130 / 789 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
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();
}
Миниатюры
Не завершается метод  
0
23.12.2013, 20:16
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.12.2013, 20:16
Помогаю со студенческими работами здесь

Цикл не завершается
Столкнулся с одной очень странной для меня вещью. Имеется цикл. int cd, inmass;...

Не завершается цикл for
public static void main(String args) throws Exception { Scanner scanner= new...

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

BackgroundWorker не завершается
Народ, добрый день, выручайте, такой трабл, после выполнения BackgroundWorker и сохранения файла,...


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

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