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

при выходе из функции счетчик обнуляется - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 5.00
Etudiante
0 / 0 / 0
Регистрация: 12.04.2009
Сообщений: 47
20.07.2009, 13:53     при выходе из функции счетчик обнуляется #1
Добрый день всем.

Есть такой кусок кода:

C++
1
2
3
4
5
6
7
8
9
10
int count1=1;
int count2=10;
ForwardLabeling_0(imageBin, imageLabel, k);
     while(count1 !=0 && count2!=0)
     {
         count1 = 0;
         BackwardLabeling(imageLabel, count1);
         ForwardLabeling(imageLabel, count1);
         count2--;
     }
счетчик count2 контрольный, чтобы при каких-то невероятных условиях не попасть в бесконечный цикл, на него не смотрим. В функции BackwardLabeling(imageLabel, count1)
я много раз проверяю условие. Если оно не выполняется, делаю count1++. На выходе из функции count1 равен, например, 22. Но при входе в ForwardLabeling(imageLabel, count1) он снова становится равен нулю, и я выхожу из цикла while. Понятно, что хотелось бы выходить из цикла только если счетчик равен нулю после выполнения двух функции, и чтобы он не обнулялся посередине. Функции сами длинные, но можно считать что это что-то типа:
C++
1
2
3
4
5
6
7
8
9
for(int i=0; i<10;++i)
{
for(int j=0; j<10; ++j)
{
if(imageLabel(i,j) != 0)
 
count++;
}
}
Причем матрица ImageLabel прекрасно себе изменятся при выполнении функции, и эти изменения прекрасно сохраняются при выходе из функции...
Может, попробовать делать
C++
1
2
3
4
5
int BackwardLabeling(imageLabel, count1)
{
...
return count;
}
но тогда все равно не ясно, чем же imageLabel лучше....
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.07.2009, 13:53     при выходе из функции счетчик обнуляется
Посмотрите здесь:

Диалоговое окно при выходе из программы C++
C++ Критично ли использование goto при выходе из циклов?
Обнуление содержимого класса при выходе из подменю C++
C++ ОБНУЛЯЕТСЯ ДРОБНАЯ ЧАСТЬ ПРИ СОРТИРОВКЕ МАССИВА!!!
C++ Что на выходе у функции insert ?
C++ Как передать массив в функцию так, чтобы при выходе из функции он не изменялся?
Односвязные списки: нужно ли при выходе из функции возвращать голову? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
mamedovvms
2915 / 836 / 93
Регистрация: 30.04.2009
Сообщений: 2,614
20.07.2009, 14:02     при выходе из функции счетчик обнуляется #2
а можно полностью код и задание
Etudiante
0 / 0 / 0
Регистрация: 12.04.2009
Сообщений: 47
20.07.2009, 14:07  [ТС]     при выходе из функции счетчик обнуляется #3
мне не жалко, но код реально длинный с кучей циклов. Сейчас упрощу и протестирую, и скину
mamedovvms
2915 / 836 / 93
Регистрация: 30.04.2009
Сообщений: 2,614
20.07.2009, 14:12     при выходе из функции счетчик обнуляется #4
тогда просто смысл задания то хоть что делается в тех циклах что ты написал???

Добавлено через 2 минуты 45 секунд
C++
1
2
3
4
5
6
7
8
9
10
int count1=1;
int count2=10;
ForwardLabeling_0(imageBin, imageLabel, k);
         while(count1 !=0 && count2!=0)
         {
                 [COLOR="Red"]count1 = 0;[/COLOR]// а это не влияет
             BackwardLabeling(imageLabel, count1);
             ForwardLabeling(imageLabel, count1);
                 count2--;
         }
Etudiante
0 / 0 / 0
Регистрация: 12.04.2009
Сообщений: 47
20.07.2009, 14:17  [ТС]     при выходе из функции счетчик обнуляется #5
вот например:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void ForwardLabeling(PvMatrix::Matrix<double>& imageLabel, int count1)
{
    for(int i=0; i<imageLabel.GetSize1(); ++i)
     {
         for(int j=0; j<imageLabel.GetSize2(); ++j)
            {
                    if(imageLabel(i,j)!=0)
            {
                 imageLabel(i,j)=0;
                 count1++;
             }
        }
    }
}

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void BackwardLabeling(PvMatrix::Matrix<double>& imageLabel, int count1)
{
    for(int i=imageLabel.GetSize1()-1; i>=0; --i)
    {
        for(int j=imageLabel.GetSize2()-1;j>=0; --j)
        { 
            if(imageLabel(i,j)!=0)
        {
            imageLabel(i,j)=0;
            count1++;
        }
    }
   }
}
C++
1
2
3
4
5
6
7
8
9
10
int count1=1;
     int count2=10;
         ForwardLabeling_0(imageBin, imageLabel, k);
     while(count1 !=0 && count2!=0)
     {
         count1 = 0;
         BackwardLabeling(imageLabel, count1);
         ForwardLabeling(imageLabel, count1);
         count2--;
     }
mamedovvms
2915 / 836 / 93
Регистрация: 30.04.2009
Сообщений: 2,614
20.07.2009, 14:27     при выходе из функции счетчик обнуляется #6
а ты попробуй сделать так
C++
1
2
3
 BackwardLabeling(imageLabel, count1);
  cout << count1;
  ForwardLabeling(imageLabel, count1);
я почему то думаю что тебе не будет выведено что то кроме 0
Patch
2276 / 491 / 11
Регистрация: 01.04.2009
Сообщений: 2,178
20.07.2009, 14:59     при выходе из функции счетчик обнуляется #7
Etudiante,
э-э-э-э...
мне помнится, что при объявлении вида
C++
1
void BackwardLabeling(PvMatrix::Matrix<double>& imageLabel, int count1)
переменная count1 является локальной.
само собой, при выходе из функции, ее изменения теряются.
чтобы значение сохранялось и при выходе из функции, нужно делать в объявлении указатель.
вроде такого:
C++
1
2
3
4
void BackwardLabeling(PvMatrix::Matrix<double>& imageLabel, int * count1)
{
...
}
C++
1
2
3
4
5
6
7
8
9
10
int count1=1;
         int count2=10;
         ForwardLabeling_0(imageBin, imageLabel, k);
         while(count1 !=0 && count2!=0)
         {
                 count1 = 0;
             BackwardLabeling(imageLabel, &count1);
             ForwardLabeling(imageLabel, &count1);
                 count2--;
         }
Etudiante
0 / 0 / 0
Регистрация: 12.04.2009
Сообщений: 47
20.07.2009, 15:18  [ТС]     при выходе из функции счетчик обнуляется #8
Цитата Сообщение от mamedovvms Посмотреть сообщение
а ты попробуй сделать так
C++
1
2
3
 BackwardLabeling(imageLabel, count1);
  cout << count1;
  ForwardLabeling(imageLabel, count1);
я почему то думаю что тебе не будет выведено что то кроме 0
ну так а я о чем говорю...

Добавлено через 1 минуту 51 секунду
[QUOTE=Patch;220434]Etudiante,
э-э-э-э...
мне помнится, что при объявлении вида
C++
1
void BackwardLabeling(PvMatrix::Matrix<double>& imageLabel, int count1)
переменная count1 является локальной.
само собой, при выходе из функции, ее изменения теряются.
чтобы значение сохранялось и при выходе из функции, нужно делать в объявлении указатель.

спасибо, сейчас проверю. Похоже, что проблема как раз в этом была. Это и объясняет, почему изменения в imageLabel сохраняется, я ведь передаю не матрицу а указатель на нее

Добавлено через 7 минут 24 секунды
работает....
только вместо
C++
1
void ForwardLabeling(PvMatrix::Matrix<double>& imageLabel, int* count1)
я сделала
C++
1
void ForwardLabeling(PvMatrix::Matrix<double>& imageLabel, int& count1)
mamedovvms
2915 / 836 / 93
Регистрация: 30.04.2009
Сообщений: 2,614
20.07.2009, 16:53     при выходе из функции счетчик обнуляется #9
а может просто в конце функции можно поставить return count1, я конечно не могу точно сказать , но вроде тоже должно работать
Etudiante
0 / 0 / 0
Регистрация: 12.04.2009
Сообщений: 47
20.07.2009, 17:57  [ТС]     при выходе из функции счетчик обнуляется #10
Цитата Сообщение от mamedovvms Посмотреть сообщение
а может просто в конце функции можно поставить return count1, я конечно не могу точно сказать , но вроде тоже должно работать
Да, так тоже работает. Но а если бы мне нужно было 2 счетчика возвращать? Было интересно, почему такая ерунда вообще происходит. Ответ любезно подсказал Patch (см.выше). За что ему еще раз большое спасибо, ситуация достаточно стандартная и таких ошибок больше постараюсь не делать
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.07.2009, 03:08     при выходе из функции счетчик обнуляется
Еще ссылки по теме:

C++ При запуске программы содержимое файла, с которым она работает, обнуляется
C++ Ошибка при выходе из программы
C++ Выполенение функции при выходе из программы
C++ Ошибка доступа к памяти при выходе из программы
Почему при выходе из цикла while переменная счетчик увеличивается на единицу? C++

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

Или воспользуйтесь поиском по форуму:
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
21.07.2009, 03:08     при выходе из функции счетчик обнуляется #11
Можно вместо использования указателя передавать переменную по ссылке, в прототипе указать int &count1.
Yandex
Объявления
21.07.2009, 03:08     при выходе из функции счетчик обнуляется
Ответ Создать тему
Опции темы

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