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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.86
Etudiante
0 / 0 / 0
Регистрация: 12.04.2009
Сообщений: 47
#1

две переменные с одинаковым именем - C++

16.07.2009, 15:33. Просмотров 1878. Ответов 24
Метки нет (Все метки)

Вопрос скорее теоретический:

Использую Visual C++ , запускаю debug и в окошечке переменных вижу, например, две переменные с именем i. Возникает такая ситуация, если в коде встречается несколько циклов типа for(int i = 0; ...). Причем, например, если цикл двойной, то вторая переменная не дублируется (по крайней мере, не всегда). Можно конечно для каждого цикла называть переменный по разному, но ведь по и идее они на то и локальные, чтобы не было конфликтов? Есть ли смысл с этим бороться? Если да, то как? Может ли хотя бы теоретически случится, что эти переменные перепутаются?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.07.2009, 15:33
Здравствуйте! Я подобрал для вас темы с ответами на вопрос две переменные с одинаковым именем (C++):

Задание нескольких #region с одинаковым именем. Нормально ли это? - C++
Могу ли я указывать несколько #region с одинаковыми именами в рамках одного файла или в рамках некоторого проекта. Не противоречит ли это...

Виртуальные функции с одинаковым именем и разным набором аргументов - C++
Есть абстрактный базовый класс и пара наследников. class Base { public: vurtual void Func(int a); vurtual void Func(int...

fputs и две переменные - C++
Всем здравствуйте. Не ругайте сильно ибо туплю по страшному. Видимо из-за полусонного состояния. Подскажите как правильно записать две...

Нужно приравнять две переменные - C++
Помогите пожалуйста, никак не могу приравнять рандомное число к a.nom. Создается рандомное число которое потом должно приравняться к a.nom...

Не меняются местами две переменные - C++
Пытаюсь поменять местами две переменные через ассемблерные вставки. Почему нет результата? #include <iostream> using namespace std; ...

Даны две переменные целого типа: A и B. - C++
Даны две переменные целого типа: A и B. Если их значения не равны, то присвоить каждой переменной сумму этих значений, а если равны, то...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
16.07.2009, 15:40 #2
Цитата Сообщение от Etudiante Посмотреть сообщение
Использую Visual C++
версия MSVC какая?
Цитата Сообщение от Etudiante Посмотреть сообщение
g и в окошечке переменных вижу
окошечко переменных как называется? Watch?
0
Paulie
Айхрень...
306 / 174 / 4
Регистрация: 02.06.2009
Сообщений: 1,078
16.07.2009, 15:40 #3
Перепутаться скорее всего могут только, если цикл будет внутри другого цикла. А так в целом всё должно быть тип-том. Конечно, тогда нежелательно, чтобы одна из них была глобальной...
0
Etudiante
0 / 0 / 0
Регистрация: 12.04.2009
Сообщений: 47
16.07.2009, 16:04  [ТС] #4
циклы отдельно, все переменные локальные. По идее ничего не должно путаться, но настораживает. Решила спросить специалистов...

Добавлено через 5 минут 11 секунд
Цитата Сообщение от zim22 Посмотреть сообщение
версия MSVC какая?

окошечко переменных как называется? Watch?
студия 2005, окошечко называется locals. Это важно? мне не ясно, почему локальная переменная при выходе из цикла не уничтожается, вернее, уничтожается не всегда. Или на самом деле она уничтожается, но остается запись в окне?
0
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
16.07.2009, 16:09 #5
Цитата Сообщение от Etudiante Посмотреть сообщение
Это важно?
да. на вкладке Watch вы можете дублировать названия переменных.
Цитата Сообщение от Etudiante Посмотреть сообщение
Или на самом деле она уничтожается, но остается запись в окне?
это очень легко проверить. вместо переменной встроенного типа создайте переменную класса. в его деструкторе выводите диагностическое сообщение на экран. и сами увидите - уничтожается, или нет.
кстати, приведите пример проблемного кода.
***
вполне возможно, что это баг студии. она у вас не самая новая.
1
schdub
2946 / 1291 / 238
Регистрация: 19.01.2009
Сообщений: 3,397
Завершенные тесты: 1
16.07.2009, 16:20 #6
Цитата Сообщение от Etudiante Посмотреть сообщение
Может ли хотя бы теоретически случится, что эти переменные перепутаются?
Нет они никогда не перепутаются, т.к. в С/С++ есть такое понятие, область видимости переменной. Если говорить о функция, то проще сказать, что ее область видимости распростаняется на весь блок от начальной { до конечной }, в котором она объяевлена. Но есть и такое понятие, как перекрытие. Вот пример:
C++
1
2
3
4
5
6
7
8
void foo() {
  int i;
  i = 1;
  for (int i=0; i<10; i++) {
       printf("%d\n", i);
  }
  printf("%d", i);
}
Второе объяление переменной i перекрывает первую и компилятор уже работает с этой переменной, но когда цикл заканчивается, то под i понимается уже первая переменная.
1
Etudiante
0 / 0 / 0
Регистрация: 12.04.2009
Сообщений: 47
16.07.2009, 16:37  [ТС] #7
Цитата Сообщение от zim22 Посмотреть сообщение
да. на вкладке Watch вы можете дублировать названия переменных.

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

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
void CellIndexation(const PvMatrix::Matrix<double>& imageBin, PvMatrix::Matrix<double>& imageLabel)
{
     int k = 1;
     int d = 0;
     int count1=1;
     int count2=10;
     ForwardLabeling_0(imageBin, imageLabel, k);
 
     while(count1 !=0 && count2!=0)
     {
         count1 = 0;
         BackwardLabeling(imageLabel);
 
         ForwardLabeling(imageLabel, count1);
         count2--;
     }
 
         int  Number_cell=1;
     CellLabel labelCell;
     bool flag = false;
 
    for (int i = 0, cont = 1; cont &&  i < imageLabel.GetSize1(); i++)
        for (int j = 0; j < imageLabel.GetSize2(); j++)
            if (imageLabel(i, j)) 
            {
                  labelCell.push_back(imageLabel(i, j));
                  cont = 0;
                  break;
            }
 
 
 
    
         int z = 0;
    for(int i=0; i<imageLabel.GetSize1(); ++i)
    {
         for(int j=0; j<imageLabel.GetSize2(); ++j)
         {
              if(imageLabel(i,j)!=0)
              {
                  z=0;
                  for(int k = 0; k<labelCell.size(); ++k)
                  {
                      if(imageLabel(i,j)==labelCell.at(k))
                      {
                          z=1;
                          break;
                      }
                      
                  }
                  if(z==0)
                      {
                      labelCell.push_back(imageLabel(i,j));
                      Number_cell++;
                      imageLabel(i,j)= Number_cell;
                       }
                      }
              }
         }
    }
 
        
}
тут "дублируются " i и k (с k я уже вижу, что один раз объявила ее глобально, второй раз локально. Сейчас исправлю). Но не дублируется, например, j.
0
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
16.07.2009, 16:58 #8
Цитата Сообщение от Etudiante Посмотреть сообщение
например при выполнении вот такой вот функции:
отличная функция, большая
не могли бы вы локализовать проблему, придумав маааленькую функцию/кусок кода, в котором возникает проблема.
0
Etudiante
0 / 0 / 0
Регистрация: 12.04.2009
Сообщений: 47
16.07.2009, 17:17  [ТС] #9
Цитата Сообщение от zim22 Посмотреть сообщение
отличная функция, большая
не могли бы вы локализовать проблему, придумав маааленькую функцию/кусок кода, в котором возникает проблема.
действительно, чего это я.... сорри.
Вот тут та же проблема (2 i , но 1 j в окошке locals):

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
void Test(int s)
{
    for(int i =0; i<10; ++i)
    {
        for(int j=0; j<10; j++)
        {
            ++s;
        }
    }
 
    for(int i =0; i<10; ++i)
    {
        for(int j=0; j<10; j++)
        {
            --s;
        }
    }
}
 
int main()
{
printf("%d", s);
return 0;
}
0
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
16.07.2009, 17:27 #10
Цитата Сообщение от Etudiante Посмотреть сообщение
Вот тут та же проблема (2 i , но 1 j в окошке locals):
у меня такой же глюк. ок, я сообщу Microsoft о баге.
2
Etudiante
0 / 0 / 0
Регистрация: 12.04.2009
Сообщений: 47
16.07.2009, 17:37  [ТС] #11
значит, так быть таки не должно? но это только проблема отображения и никак не влияет на выполнение программы?
0
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
16.07.2009, 17:39 #12
Цитата Сообщение от Etudiante Посмотреть сообщение
значит, так быть таки не должно?
конечно не должно. переменные локальные. при выходе из области видимости они больше не должны быть видны в окне отладки.
Цитата Сообщение от Etudiante Посмотреть сообщение
? но это только проблема отображения и никак не влияет на выполнение программы?
да. это только проблема отображения.
0
Etudiante
0 / 0 / 0
Регистрация: 12.04.2009
Сообщений: 47
16.07.2009, 17:54  [ТС] #13
Ок, еще раз спасибо
0
Alexandoros
228 / 66 / 4
Регистрация: 02.06.2009
Сообщений: 280
16.07.2009, 18:00 #14
Цитата Сообщение от Etudiante Посмотреть сообщение
Есть ли смысл с этим бороться?
Нет никакого смысла, это предрешено.

а можно еще и не плодить переменных

C++
1
2
3
4
5
6
7
{
   int i;
 
  for(i = 0;;)...
   for(i = 0;;)...
   for(i = 0;;)...
}
0
Etudiante
0 / 0 / 0
Регистрация: 12.04.2009
Сообщений: 47
16.07.2009, 18:02  [ТС] #15
тогда переменная уже не будет локальной, а меня учили что этого стоит избегать?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.07.2009, 18:02
Привет! Вот еще темы с ответами:

Как сравнить две переменные string - C++
Есть две переменные типа string в одной записано string X=&quot;AB BA AS AX&quot;; В другой string Y=&quot;AB&quot;; В строке X cимволы...

Нужно сравнить две переменные типа string - C++
Мне нужно сравнить 2 переменные типа string,нашел эту функцию,но почему то у меня выдает ошибку Error:class &quot;std...

Сравнить две переменные и изменить их значения по результатам сравнения - C++
Даны две переменные целого типа: A и B. Если их значения не равны, то присвоить каждой переменной сумму этих значений, а если равны, то...

Определить массив, создать две переменные типа указатель и сравнить - C++
Определить одномерный массив размерностью 10 элементов, * значение которых целого типа (заполнять вручную). * Создать две переменные...


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

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

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