Столкнулся со странным поведением проги на простейшем коде (под MS Visual Studio 2010 Professional). Помогите разобраться!
Есть код
std::vector<SSegmHeader> hdr_arr(hdr_list.begin(), hdr_list.end());
std::vector<SSegmHeader> hdr_arr_phone;
for (size_t i=0; i<hdr_arr.size(); i++)
{
if (hdr_arr[i].state==0)
hdr_arr_phone.push_back(hdr_arr[i]);
}
Перед циклом вектор hdr_arr имеет 80 элементов, после цикла новый вектор hdr_arr_phone имеет 28 элементов. Тут все ОК. Мистика начинается дальше.
Если убрать операторные скобки от for'а, т.е. сделать его таким:
for (size_t i=0; i<hdr_arr.size(); i++)
if (hdr_arr[i].state==0)
hdr_arr_phone.push_back(hdr_arr[i]);
то цикл (под дебаггером) выполняется только 1 раз, для нулевого элемента вектора условие выполняется, делается push_back и на этом все заканчивается, hdr_arr_phone имеет только 1 скопированный элемент.
Если же добавить к if'у пустой else:
for (size_t i=0; i<hdr_arr.size(); i++)
if (hdr_arr[i].state==0)
hdr_arr_phone.push_back(hdr_arr[i]);
else
{
}
то опять все работает, как должно.
Ести еще одна странность: переменная i в этом коде объявляется первый раз по телу функции. Дальше есть другие аналогичные объявления i, но это первое. И все последующие объявления именно такие — в теле цикла.
Тем не менее в неправильно работающем (среднем) варианте после выхода из цикла дебаггер показывает значение i=0 (а не пишет, что она out-of-scope или не определена). Это, конечно, может быть причудой дебаггера, но сам ход исполнения меня приводит в полное недоумение.
Что я делаю не так?
Re: Ход исполнения простого кода не соответствует ожидаемому
Здравствуйте, kfmn, Вы писали:
K>Столкнулся со странным поведением проги на простейшем коде (под MS Visual Studio 2010 Professional). Помогите разобраться!
Это запросто может быть причудой дебаггера, если в твоей сборке включена оптимизация. Проверь флаги компилятора и убедись, что там /Od, и что вообще сборка дебажная, и что отладочная информация актуальная.
Потому что других причин я просто не вижу. Даже какие-то макросы — ну я не знаю, разве что for и if переопределены, и то — как?!
Если под дебажной сборкой будет глючить — попробуй распечатать результат препроцессора. Может, действительно макросы.
(Project — properties — C++ — preprocessor — preprocess to file)
Перекуём баги на фичи!
Re: Ход исполнения простого кода не соответствует ожидаемому
Здравствуйте, Кодт, Вы писали:
К>Потому что других причин я просто не вижу. Даже какие-то макросы — ну я не знаю, разве что for и if переопределены, и то — как?!
Кстааати! А что, если там идиома из VC6 — борьба против вылезания переменной цикла из области видимости:
#define for if(false) {} else for
только криво сделанная?
(Мне всё равно трудно сообразить, как же её нужно так криво написать, чтобы она была чувствительна к {} и else — но чем чёрт не шутит?)
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, kfmn, Вы писали:
K>>Столкнулся со странным поведением проги на простейшем коде (под MS Visual Studio 2010 Professional). Помогите разобраться!
К>Это запросто может быть причудой дебаггера, если в твоей сборке включена оптимизация. Проверь флаги компилятора и убедись, что там /Od, и что вообще сборка дебажная, и что отладочная информация актуальная. К>Потому что других причин я просто не вижу. Даже какие-то макросы — ну я не знаю, разве что for и if переопределены, и то — как?!
К>Если под дебажной сборкой будет глючить — попробуй распечатать результат препроцессора. Может, действительно макросы. К>(Project — properties — C++ — preprocessor — preprocess to file)
Оптимизация выключена. Сборка полностью дебажная.
Да и проект относительно несложный, я там специально никаких изменений по сравнению с дефолтовыми настройками не делал...
С препроцессором попробую, но что-то верится с трудом
Re[3]: Ход исполнения простого кода не соответствует ожидаемому
Здравствуйте, kfmn, Вы писали:
K>Оптимизация выключена. Сборка полностью дебажная. K>Да и проект относительно несложный, я там специально никаких изменений по сравнению с дефолтовыми настройками не делал... K>С препроцессором попробую, но что-то верится с трудом
Добавь элементарную отладочную печать.
Re: Ход исполнения простого кода не соответствует ожидаемому
Здравствуйте, kfmn, Вы писали:
K>Что я делаю не так?
Посмотри по шагам скомпилированный ассебмлерный код под отладчиком? Я в непонятных ситуациях всегда так делаю, вся мистика разрешается очень быстро, а заодно можно изучить, как всякие конструкции языка, невидимо для глаз реализованные на нижнем уровне
Тоже интересно, что там у тебя происходит
Re[2]: Ход исполнения простого кода не соответствует ожидаемому
Здравствуйте, kfmn, Вы писали:
K>Добрый день, коллеги!
K>Столкнулся со странным поведением проги на простейшем коде (под MS Visual Studio 2010 Professional). Помогите разобраться!
Эта ситуация повторяется так же на других версиях Visual Studio: например MSVS 2013?
P.S. А может просто установленная на Вашей машине MSVS нуждается в переустановке?
Здравствуйте, kfmn, Вы писали:
K>Столкнулся со странным поведением проги на простейшем коде (под MS Visual Studio 2010 Professional). Помогите разобраться!
это очень старая бага, я её ещё вроде в 2005 ловил.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[4]: Ход исполнения простого кода не соответствует ожидаемому
Здравствуйте, Ops, Вы писали:
EP>>Добавь элементарную отладочную печать. Ops>А лучше барьер. Похоже на оптимизацию цикла.
Смысл отладочной печати тут в том, чтобы показать что ход выполнения эквивалентный (если не баг конечно), пусть и выглядит под отладкой по-другому.
Барьер же может изменить ход под отладкой.
Re[6]: Ход исполнения простого кода не соответствует ожидаемому
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Смысл отладочной печати тут в том, чтобы показать что ход выполнения эквивалентный (если не баг конечно), пусть и выглядит под отладкой по-другому. EP>Барьер же может изменить ход под отладкой.
Барьер работает на компилятор.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re[7]: Ход исполнения простого кода не соответствует ожидаем
Здравствуйте, Ops, Вы писали:
EP>>Смысл отладочной печати тут в том, чтобы показать что ход выполнения эквивалентный (если не баг конечно), пусть и выглядит под отладкой по-другому. EP>>Барьер же может изменить ход под отладкой. Ops>Барьер работает на компилятор.
Да, и в результате чего может изменить ход визуализации выполнения под отладчиком.
Здравствуйте, Ops, Вы писали:
EP>>Да, и в результате чего может изменить ход визуализации выполнения под отладчиком. Ops>Ну я рядом писал, что стоит посмотреть результирующий код. Однако первое подозрение на оптимизацию цикла.
Ну да, оптимизация. Нам нужно показать что результат эквивалентен написанному, хотя и отладчик показывает другой ход.
Или у ТС и результат неправильный(а не только ход)?
Re[10]: Ход исполнения простого кода не соответствует ожидаем
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Ну да, оптимизация. Нам нужно показать что результат эквивалентен написанному, хотя и отладчик показывает другой ход. EP>Или у ТС и результат неправильный(а не только ход)?
ТС вряд ли смотрел, что получилось.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re[11]: Ход исполнения простого кода не соответствует ожидаем
Здравствуйте, Ops, Вы писали:
EP>>Ну да, оптимизация. Нам нужно показать что результат эквивалентен написанному, хотя и отладчик показывает другой ход. EP>>Или у ТС и результат неправильный(а не только ход)? Ops>ТС вряд ли смотрел, что получилось.
Об этом и речь. Здесь задача показать ему, что результат эквивалентен коду, несмотря на "странный" ход под отладчиком.
Добавление же барьера может привести к обычному ходу под отладчиком, что не интересно.