LG.BALUKATION's Weblog

Ничего, это тоже кое-что… А при желании из него можно сделать что угодно

Posted by LG.BALUKATION на 2011/06/07

Писал тут кое-что, для венды и студии. Но т. к. венды и студии у меня нет, писал в QtCreator и GCC на макинтоше, однако смотреть вроде как должны в студии.

Оказывается, можно вполне законно одолжить на такой небольшой срок софт. Мелкомягкие раздают на попробовать Windows Server 2008, его можно скачать и пробовать. Ещё есть пробная версия Windows 7, но что бы её скачать нужно уже иметь какую-нить венду — там забавная штука в анкете, обязательно просят указать какую ОСь используешь, а выбрать можно только из разных Windows. Вот только пока качалась эта лицензионная пробная венда (я 2008 выбрал), успел скачать с торрентов пиратскую версию, установить её в виртуальную машину и даже обновить до текущего состояния — низачёт мелкомягким за такую медленную раздачу.

Студию выбрал 2010 — просто потому, что не видел её, а вродеж как самый флагман вендовых средств разработки. Савил Express версию ибо мне много не надо, ставил по сети и… оно тут же захотело обновлений на 300 метров. Мелкомягкие до сих пор не умеют ставить по сети актуальные версии :-? Кстати даже Express версия теперь просит зарегистрироваться в течении месяца, я не пробовал ибо оно мне не надо на стока долго сейчас.

Код мой сразу не заработал. Хотя программа была и простой, но gcc допускает больше вольностей программисту. Студия собирала, но при исполнении всё падало. Нюансов заметил два, оба были с итераторами в STL.

Первый был с удалением элемента из контейнера. Т. е. код типа

for (class::iterator it = obj.begin(); it != obj.end(); ++it)
{
   ...
   if (condition) obj.erase(it);
   ...
}

Нормально работал в GCC, а в VC++ останавливался на попытке сдвинуть итератор после удаления элемента. Нюанс в том, что итератор становится не действительным, а действительный для следующего элемента возвращает erase. Что бы не было двойного инкремента, в интернетах рекомендуют делать инкремент самим. Примерно так:

for (class::iterator it = obj.begin(); it != obj.end();)
{
   ...
   ...
   if (condition) it = obj.erase(it);
   else ++it;
}

В хитром GCC оно тоже работает, хотя там работает и первый вариант, который ИМХО наглядней.

Второй нюанс был с разыменованием итератора, который уже указывает на obj::end(), решилось простой проверкой. В GCC почему-то работало и без проверки, что хотя тоже должно было бы падать по-хорошему.

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

if (some) doError("message");

Отладчик в новой студии ничё так, понравилось как он работает с выражениями, в которых есть функции (возможно оно давно так, яж не знаю, увидел в 2010 и понравилось +). Для таких выражений можно посмотреть что вернули функции, не заходя при этом в их тела.

ЗЫ: пока искал венду, оказывается уже и майлстоуны 8 пиратят, да и CE не хило обновили.

Реклама

комментария 2 to “”

  1. «рекомендуют делать инкремент самим» — угу, главное не увлекаться и понимать где ставить. Я так понимаю одна из главных ошибок виндового софта связанная с переполнением буфера растет примерно из этих краев.

    «оказывается уже и майлстоуны 8» — Так бета в сентябре выходит, значит внутренние тесторы уже получили свои версии. Но там пока неясно какая будет релизиться, а без этого не интересно. Кстати windows 7 ведь не старая, не рано ли? Хотя мне пофигу конечно. Последнее что я у них купил за свои деньги была Windows Mobile 2005 в кпк. Меня КПК устраивает, а их не устраивает то что меня устраивает :)

  2. Нет, дело не в обычных переполнениях, список например можно очень просто бесконечно наращивать пока есть память в системе. В данном случае получается как будто код бродил указателем внутри некой сложной структуры, потом внезапно указатель оказался где-то вне её и не знает как идти дальше. Кстати от переполнения в студии уже лет пять-десять есть заглушки над классическими сишными штуками типа scanf() и т. п. В никсах этого я не видел, а венда может сказать варнингом типа то не безопасно и лучше переписать вот так если не нужна совместимость с никсами и стандартами.

    Про 8 — похоже уже с зимы/весны иногда утекали версии для внешнего люда. Внутреннее интересней, ибо внутреннее обычно с сорсами утекало +)))
    Что не ясно с релизом? Делают майлстоуны, потом альфа/беты пойдут, затем кандидаты и золото.
    Про рано классная шутка — 3.11 вышла в 1993, 95 в 1995, NT4 в 1996, 98 в 1998, 2000 в 1999, XP в 2001… Так что обновлять систему раз в год-два это норма, подобно тому как выходит новая макось или новые версии линухов. Правда с вистой был косяк, но 2008/7/2008r2 вернули мелкомягких в прежний ритм. Они же не делают что-нить новое — просто исправляют ошибки да оттачивают технологии, добавляя новинки по чуть-чуть.

    Я так и не купил у них ничего. Когда хотел, не было столько лишних денег (хотел коробку с 2000, а стоила она уж слишком много для меня-школоло +), теперь вроде и не надо уже особо. На работе были за счёт фирмы ессно купленные, ноутбук я брал с макосью, нетбук с SLED (который впрочем боксовый стоит почти как венда наверное). Возможно возьму потом, если буду отдельную машинку для игр мутить.

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s