Здравствуйте, kfmn, Вы писали:
K>Столкнулся со странным поведением проги на простейшем коде (под MS Visual Studio 2010 Professional). Помогите разобраться!
Это запросто может быть причудой дебаггера, если в твоей сборке включена оптимизация. Проверь флаги компилятора и убедись, что там /Od, и что вообще сборка дебажная, и что отладочная информация актуальная.
Потому что других причин я просто не вижу. Даже какие-то макросы — ну я не знаю, разве что for и if переопределены, и то — как?!
Если под дебажной сборкой будет глючить — попробуй распечатать результат препроцессора. Может, действительно макросы.
(Project — properties — C++ — preprocessor — preprocess to file)
Перекуём баги на фичи!
Re: Ход исполнения простого кода не соответствует ожидаемому
Здравствуйте, kfmn, Вы писали:
K>Что я делаю не так?
Посмотри по шагам скомпилированный ассебмлерный код под отладчиком? Я в непонятных ситуациях всегда так делаю, вся мистика разрешается очень быстро, а заодно можно изучить, как всякие конструкции языка, невидимо для глаз реализованные на нижнем уровне
Тоже интересно, что там у тебя происходит
Re: Ход исполнения простого кода не соответствует ожидаемому
Здравствуйте, 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[9]: Ход исполнения простого кода не соответствует ожидаем
Здравствуйте, Ops, Вы писали:
EP>>Да, и в результате чего может изменить ход визуализации выполнения под отладчиком. Ops>Ну я рядом писал, что стоит посмотреть результирующий код. Однако первое подозрение на оптимизацию цикла.
Ну да, оптимизация. Нам нужно показать что результат эквивалентен написанному, хотя и отладчик показывает другой ход.
Или у ТС и результат неправильный(а не только ход)?
Ход исполнения простого кода не соответствует ожидаемому
Столкнулся со странным поведением проги на простейшем коде (под 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[2]: Ход исполнения простого кода не соответствует ожидаемому
Здравствуйте, Кодт, Вы писали:
К>Потому что других причин я просто не вижу. Даже какие-то макросы — ну я не знаю, разве что 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[2]: Ход исполнения простого кода не соответствует ожидаемому
Здравствуйте, Ops, Вы писали:
EP>>Добавь элементарную отладочную печать. Ops>А лучше барьер. Похоже на оптимизацию цикла.
Смысл отладочной печати тут в том, чтобы показать что ход выполнения эквивалентный (если не баг конечно), пусть и выглядит под отладкой по-другому.
Барьер же может изменить ход под отладкой.
Re[6]: Ход исполнения простого кода не соответствует ожидаемому
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Смысл отладочной печати тут в том, чтобы показать что ход выполнения эквивалентный (если не баг конечно), пусть и выглядит под отладкой по-другому. EP>Барьер же может изменить ход под отладкой.
Барьер работает на компилятор.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re[7]: Ход исполнения простого кода не соответствует ожидаем
Здравствуйте, Ops, Вы писали:
EP>>Смысл отладочной печати тут в том, чтобы показать что ход выполнения эквивалентный (если не баг конечно), пусть и выглядит под отладкой по-другому. EP>>Барьер же может изменить ход под отладкой. Ops>Барьер работает на компилятор.
Да, и в результате чего может изменить ход визуализации выполнения под отладчиком.
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Ну да, оптимизация. Нам нужно показать что результат эквивалентен написанному, хотя и отладчик показывает другой ход. EP>Или у ТС и результат неправильный(а не только ход)?
ТС вряд ли смотрел, что получилось.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re[11]: Ход исполнения простого кода не соответствует ожидаем
Здравствуйте, Ops, Вы писали:
EP>>Ну да, оптимизация. Нам нужно показать что результат эквивалентен написанному, хотя и отладчик показывает другой ход. EP>>Или у ТС и результат неправильный(а не только ход)? Ops>ТС вряд ли смотрел, что получилось.
Об этом и речь. Здесь задача показать ему, что результат эквивалентен коду, несмотря на "странный" ход под отладчиком.
Добавление же барьера может привести к обычному ходу под отладчиком, что не интересно.
Re[12]: Ход исполнения простого кода не соответствует ожидаем
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Об этом и речь. Здесь задача показать ему, что результат эквивалентен коду, несмотря на "странный" ход под отладчиком.
Но... EP>Добавление же барьера может привести к обычному ходу под отладчиком, что не интересно.
Барьер выпрямит, а дальше пусть сам думает.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re: Ход исполнения простого кода не соответствует ожидаемому
Здравствуйте, kfmn, Вы писали:
K>Столкнулся со странным поведением проги на простейшем коде (под MS Visual Studio 2010 Professional). Помогите разобраться! K>Что я делаю не так?
В 2010-ой студии были глюки с дебагером. Поробуй апдейты на нее поставить, если еще не ставил.