Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> странное значение переменной 
V
    Опции темы
nmn
Дата 21.7.2010, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 593
Регистрация: 26.11.2005

Репутация: нет
Всего: 1



получил различные значения переменной

чему же она должна быть равна?

Присоединённый файл ( Кол-во скачиваний: 58 )
Присоединённый файл  strange.PNG 72,43 Kb
PM Skype   Вверх
Abyx
Дата 21.7.2010, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 601
Регистрация: 3.11.2009

Репутация: 5
Всего: 10



забавно
PM MAIL   Вверх
azesmcar
Дата 22.7.2010, 08:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(nmn @  21.7.2010,  20:20 Найти цитируемый пост)
чему же она должна быть равна? 

12

Цитата(nmn @  21.7.2010,  20:20 Найти цитируемый пост)
получил различные значения переменной

видимо debugger ошибся.
PM   Вверх
OlegSK
Дата 22.7.2010, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 17.7.2010

Репутация: нет
Всего: нет



VS 2010 при попытке присвоить переменной b значение переменной A (именно A, а не ::A), ругается на переменную A, обзывая ее неоднозначной.
PM MAIL   Вверх
azesmcar
Дата 22.7.2010, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(OlegSK @  22.7.2010,  13:17 Найти цитируемый пост)
именно A, а не ::A

И что? К чему это?
PM   Вверх
OlegSK
Дата 22.7.2010, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 17.7.2010

Репутация: нет
Всего: нет



Извените нуба, забыл задать вопрос... Хотел спросить: почему в этом случае возникает неоднозначность? Ведь это либо две разные переменные, либо переопределение одной и той же переменной...
PM MAIL   Вверх
azesmcar
Дата 22.7.2010, 14:05 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(OlegSK @  22.7.2010,  13:32 Найти цитируемый пост)
забыл задать вопрос

 smile бывает

Цитата(OlegSK @  22.7.2010,  13:32 Найти цитируемый пост)
почему в этом случае возникает неоднозначность? 

потому что тогда он не знает к какой именно обратиться.
первая переменная определена в анонимном пространстве имен, вторая в глобальном.
В случае с ::a явно указывается, что поиск должен идти в глобальном пространстве имен.
PM   Вверх
OlegSK
Дата 22.7.2010, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 17.7.2010

Репутация: нет
Всего: нет



azesmcar
Цитата
потому что тогда он не знает к какой именно обратиться.

Не понимаю, почему тогда при объявлении и инициализации переменной A в глобальном пространстве имен не возникает неоднозначности?

Это сообщение отредактировал(а) OlegSK - 22.7.2010, 15:51
PM MAIL   Вверх
Dem_max
Дата 22.7.2010, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 4
Всего: 39



собственно компилятор все правильно сделал


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
OlegSK
Дата 22.7.2010, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 17.7.2010

Репутация: нет
Всего: нет



azesmcar
Вот я и хочу понять, почему это правильно... То есть почему при объявлении и инициализации переменной A компилятор считает, что A и ::A - это одна и таже переменная (судя по тому как меняется значение переменной ::A), а при последующей попытке заюзать A компилятор уже не хочет считать, что A и ::A - это одна и таже переменная, и видит неоднозначность там где недавно (при объявлении A) ее не видел? И еще, если A и ::A - это две разные переменные, то как тогда адресоваться к переменной A чтобы не вызывать неоднозначности?

Это сообщение отредактировал(а) OlegSK - 22.7.2010, 16:16
PM MAIL   Вверх
azesmcar
Дата 22.7.2010, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



PM   Вверх
OlegSK
Дата 22.7.2010, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 17.7.2010

Репутация: нет
Всего: нет



azesmcar
Как я понимаю, в результате получается две одноименные переменные (в противном случае, не может быть и речи ни о какой неоднозначности). Объясните мне: каким образом значение присваиваемое при объявлении и инициализации переменной A в глобальном пространстве имен вдруг загадочным образом оказывается присвоенным совсем другой переменной (пусть и одноименной) находящеся в анонимном пространстве имен? Может быть я туплю, но мне кажется, что в данном случае либо указанное при инициализации переменной A значение должно быть присвоенным именно ей, а ни как не переменной ::A, либо компилятор создав переменную в глобальном пространстве имен и обнаружив одноименную переменную в ананимном пространстве имен должен был уже на этом этапе (при присваевании указанного значения) пожаловаться на неоднозначность... Вообще, возникает нехорошее подозрение, что компилятор обрабатывает строку справа налево, сперва присваивая указанное при инициализации переменной A значение переменной ::A, и лишь затем создает переменную A... То есть казалось бы неделимая строка:
int a = 12;
раздергивается на две команды:
a = 12; // идет обращение к переменной ::A
int a;    // создается переменная A
Другими словами, компилятор поступает подобно некотрым журналюгам выдергивающим фразы из контекста, в итоге полностью извращая изначально сказанное, ставя все с ног на голову...

З.Ы: Я конечно приму это к сведению, но все же хотелось бы если это возможно разобраться: почему так происходит. С другой стороны, это конечно можно списать на особенности работы компилятора и воспринимать как данность...

Это сообщение отредактировал(а) OlegSK - 22.7.2010, 19:33
PM MAIL   Вверх
OlegSK
Дата 22.7.2010, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 17.7.2010

Репутация: нет
Всего: нет



Кстати, я и не знал, что значение константных переменных можно менять (без использования ссылок и указателей):
[code=cpp]
namespace
{
const int a = 10;
}

int a = 5; // в результате константной переменной ::a будет присвоено значение 5...



Это сообщение отредактировал(а) OlegSK - 22.7.2010, 19:58
PM MAIL   Вверх
nmn
Дата 22.7.2010, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 593
Регистрация: 26.11.2005

Репутация: нет
Всего: 1



Цитата(OlegSK @ 22.7.2010,  19:44)
Кстати, я и не знал, что значение константных переменных можно менять (без использования ссылок и указателей):
Код

namespace
{
const int a = 10;
}

int a = 5;

в результате константной переменной ::a будет присвоено значение 5...

ммм

Код

namespace {int a;}

эквиавалентно
Код

namespace unique_namespace_name
{
int a;
}
using namespace unique_namespace_name;


переменные в анонимном пространстве имен и глобальном пространстве имен пусть и с одинаковыми именами различны. Из за особенностей анонимного пространства имен после объявления переменной с таким же именем в глобальном пространстве имен, доступ к той что в анонимном пространстве имен пропадает
PM Skype   Вверх
OlegSK
Дата 22.7.2010, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 17.7.2010

Репутация: нет
Всего: нет



А так вообще интересно:
Код

namespace
{
const int a = 10;
}

     int a = 5; // в результате константной переменной ::a будет присвоено значение 5...

int main()
{
     ::a = 50; // в результате константной переменной ::a будет присвоено значение 50...
}



Это сообщение отредактировал(а) OlegSK - 22.7.2010, 20:00
PM MAIL   Вверх
azesmcar
Дата 22.7.2010, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



OlegSK

Ты все путаешь, от того и непонимание.
Цитата

namespace
{
const int a = 10;
}

int a = 5; // в результате константной переменной ::a будет присвоено значение 5... создается новая переменная в глобальном пространстве имен и инициализируется значением 5


PM   Вверх
OlegSK
Дата 22.7.2010, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 17.7.2010

Репутация: нет
Всего: нет



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

Это сообщение отредактировал(а) OlegSK - 22.7.2010, 20:20
PM MAIL   Вверх
azesmcar
Дата 22.7.2010, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(OlegSK @  22.7.2010,  20:08 Найти цитируемый пост)
А почему тогда приходится обращаться к этой переменной через оператор ::? 

Потому что :: указывает, что переменная находиться в глобальном пространстве имен, переменную мы обявили в глобальном пространстве имен. Все логично.

Цитата(OlegSK @  22.7.2010,  20:08 Найти цитируемый пост)
Разве он не указывает на переменную находящуюся в анонимном пространстве имен?

Кто?
PM   Вверх
OlegSK
Дата 22.7.2010, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 17.7.2010

Репутация: нет
Всего: нет



Цитата
Кто?

Оператор :: ...

Добавлено @ 20:25
В общем, до меня дошло... Благодарю за помощь!!!


Это сообщение отредактировал(а) OlegSK - 22.7.2010, 20:52
PM MAIL   Вверх
OlegSK
Дата 22.7.2010, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 17.7.2010

Репутация: нет
Всего: нет



Цитата(azesmcar @ 22.7.2010,  14:05)
Цитата(OlegSK @  22.7.2010,  13:32 Найти цитируемый пост)
почему в этом случае возникает неоднозначность? 

потому что тогда он не знает к какой именно обратиться.
первая переменная определена в анонимном пространстве имен, вторая в глобальном.
В случае с ::a явно указывается, что поиск должен идти в глобальном пространстве имен.

Почему компилятор не знает к какой именно переменной обратиться, если переменая из глобального пространства имен скрывает переменную из ананимного пространства имен и по сути остается единственной доступной программе? По крайней мере я так понял из следующего поста:
Цитата(nmn @ 22.7.2010,  19:52)
переменные в анонимном пространстве имен и глобальном пространстве имен пусть и с одинаковыми именами различны. Из за особенностей анонимного пространства имен после объявления переменной с таким же именем в глобальном пространстве имен, доступ к той что в анонимном пространстве имен пропадает

... В обычной функции я тоже могу сделать локальную переменную одноименную глобальной (которая при этом будет скрыта), и никаких неоднозначностей при обращении к ней не возникает... Чего я еще недопонимаю? Или тут дело в том, что в моем примере с функцией одна из переменных локальная а другая глобальная, в то время как в выше рассмотренной ситуации обе переменных были глобальными (по крайней мере, в пределах единицы трансляции, т.е. в одном файле)?

Это сообщение отредактировал(а) OlegSK - 22.7.2010, 21:18
PM MAIL   Вверх
nmn
Дата 22.7.2010, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 593
Регистрация: 26.11.2005

Репутация: нет
Всего: 1



Цитата(OlegSK @  22.7.2010,  20:51 Найти цитируемый пост)
В обычной функции я тоже могу сделать локальную переменную одноименную глобальной (которая при этом будет скрыта), и никаких неоднозначностей при обращении к ней не возникает...

в функциях не возникает, а тут возникает, так как в общем случае может быть несколько пространств имен с одинаковыми переменными и компилятор не знает из какого пространства брать переменную
PM Skype   Вверх
OlegSK
Дата 23.7.2010, 05:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 17.7.2010

Репутация: нет
Всего: нет



[QUOTE=nmn,22.7.2010,  22:30]
Цитата(OlegSK @  22.7.2010,  20:51 Найти цитируемый пост)
в функциях не возникает, а тут возникает, так как в общем случае может быть несколько пространств имен с одинаковыми переменными и компилятор не знает из какого пространства брать переменную

Это в общем-то понятно, но так и не объясняет ситуацию... Если бы имелось две одноименные переменные, которые были бы одновременно доступны программе, то обращение к такой переменной действительно создавало бы неоднозначность - это очевидно. Однако в вышерассмотренном случае переменная A из ананимного пространства имен становится недоступной программе, т.к. перекрывается переменной A из глобального пространства имен. Поэтому я не понимаю: от куда взялась неоднозначность, если программе на момент обращения к переменной A доступна только одна из этих переменных.

Это сообщение отредактировал(а) OlegSK - 23.7.2010, 05:54
PM MAIL   Вверх
Dem_max
Дата 23.7.2010, 07:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 4
Всего: 39



не делай анонимные namespace тогда и проблем у тебя не будет в этом случае с пониманием.


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
OlegSK
Дата 23.7.2010, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 17.7.2010

Репутация: нет
Всего: нет



Цитата(Dem_max @ 23.7.2010,  07:48)
не делай анонимные namespace тогда и проблем у тебя не будет в этом случае с пониманием.

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

Это сообщение отредактировал(а) OlegSK - 23.7.2010, 10:07
PM MAIL   Вверх
mes
Дата 23.7.2010, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Код

namespace A1 {   int i; }
using namespace A1;
namespace A2 {   int i; }
using namespace A2;

++i;

 а этот код на Ваш взгляд однозначен или нет ?



--------------------
PM MAIL WWW   Вверх
Dem_max
Дата 23.7.2010, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 4
Всего: 39



тут однозначен ибо к переменным мы обращаемся через

Код


namespace A1 {   int i; }
using namespace A1;
namespace A2 {   int i; }
using namespace A2;

int i;

int main()
{
   int i;
   A1::i++;
   A2::i++;
   ::i++;
   i++;
}


Это сообщение отредактировал(а) Dem_max - 23.7.2010, 11:36


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
OlegSK
Дата 23.7.2010, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 17.7.2010

Репутация: нет
Всего: нет



mes, в вашем примере, из-за объявлений using namespace A1 и using namespace A2, при обращении к переменной i возникнет неоднозначность... Однако, как я понял, особенность интересующей меня проблемы в том, что там используется ананимное пространство имен, особенностью которого является то, что переменные находящиеся в нем перекрываются переменными из глобального пространства имен, в случае их совпадений (то есть в случае перекрытия уже не удастся обратитья к переменной находящейся в ананимном пространстве имен). По этой причине, мне кажется что неоднозначности быть не должно (раз доступной остается только одна из двух одноименных переменных), и С обычными (именованными) пространствами имен такого не происходит; чтобы решить неоднозначность в вашем примере достаточно уточнить с помощью имени пространства имен к какой именно переменной i происходит обращение...

З.Ы: Неоднозначность в интересующем меня примере может возникнуть только в том случае, если компилятор не учитывает, что к перекрытой переменной из ананимного пространства имен больше нельзя обратиться и зачем-то продолжает ее учитывать. Видимо это и есть ответ на мой вопрос...

Это сообщение отредактировал(а) OlegSK - 23.7.2010, 12:14
PM MAIL   Вверх
nmn
Дата 23.7.2010, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 593
Регистрация: 26.11.2005

Репутация: нет
Всего: 1



Цитата(nmn @ 22.7.2010,  19:52)
Код

namespace {int a;}

эквиавалентно
Код

namespace unique_namespace_name
{
int a;
}
using namespace unique_namespace_name;

unique_namespace_name - некоторое уникальное имя которое генерирует компилятор
PM Skype   Вверх
OlegSK
Дата 23.7.2010, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 17.7.2010

Репутация: нет
Всего: нет



Я кажется понял, почему возникает интересующая меня ситуация. Компилятор обрабатывает ананимное пространство имен как обычное, не учитывая то, что его перекрытые переменные перестают быть доступными для кода программы (программе же не известно unique_namespace_name заданное компилятором для этого пространства имен)...

Это сообщение отредактировал(а) OlegSK - 23.7.2010, 12:27
PM MAIL   Вверх
OlegSK
Дата 23.7.2010, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 17.7.2010

Репутация: нет
Всего: нет



Благодарю, всех отвечавших мне за помощь! 
PM MAIL   Вверх
mes
Дата 23.7.2010, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(OlegSK @  23.7.2010,  11:20 Найти цитируемый пост)
Компилятор обрабатывает ананимное пространство имен как обычное, не учитывая то, что его перекрытые переменные перестают быть доступными для кода программы (

с ударением на первую часть сказанного 
smile



--------------------
PM MAIL WWW   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0751 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.