1. C++ / Говнокод #16276

    +19

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    wstring& delphi::IntToStr(int integer, wstring& str)
    {
    	if (0 == integer)		
    		return str = L"0";	
    	
    	str.clear();
    	wstring sign(L"");
    	if (integer < 0)
    	{
    		sign = L"-";
    		integer = -integer;
    	}
    	else
    		sign = L"";
    
    	while (integer >= 1)
    	{
    		str.push_back( (integer % 10) + 48 );  
    		integer /= 10;
    	}
    	str += sign;
    	std::reverse(str.begin(), str.end());
    			
    	return str;
    }

    Запостил: snw, 03 Июля 2014

    Комментарии (59) RSS

    • Сам когда-то так писал. Теперь обленился:
      wstring& intToStr(int integer, wstring &str) {
          wstringstream stream;
      
          stream << integer;
          str = stream.str();
      
          return str;
      }

      http://ideone.com/J73cEE
      Ответить
      • один из самых медленных способов
        Ответить
        • На ум первым пришёл вариант sprintf:
          wstring& intToStr(int integer, wstring &str) {
              wchar_t chars[20];
          
              swprintf(chars, 20, L"%d", integer);
              str = wstring(chars);
          
              return str;
          }

          http://ideone.com/DfTD5o
          А как тут будет оптимальнее?
          Ответить
          • уу
            boost::format
            boost::lexical_cast
            std::to_string
            boost::spirit::karma

            причем, первый может быть даже медленнее stringstream
            второй, четвертый - однозначно быстрее
            третий - как производитель компилятора уж реализует
            Ответить
            • Что-то по уу и std::уу ничего не гуглится. Как этот способ правильно юзать?
              Ответить
            • Не помню у кого (вроде ms), но std::to_string был реализован именно через stringstream.
              Ответить
              • ты их держишь за дебилов?
                #define _TOSTRING(buf, fmt, val)	\
                	sprintf_s(buf, sizeof (buf), fmt, val)
                
                inline string to_string(int _Val)
                	{	// convert int to string
                	char _Buf[2 * _MAX_INT_DIG];
                
                	_CSTD _TOSTRING(_Buf, "%d", _Val);
                	return (string(_Buf));
                	}
                Ответить
                • Преобразует знаковое десятичное целое число в строку с содержимым, идентичным тому, которое было бы записано в buf достаточного размера с помощью std::sprintf(buf, "%d", value)

                  Так что логичное решение ;)
                  Ответить
                • да, чо-то я напутал видать :)
                  Ответить
            • И чо?
              Ну и хер, что медленный?
              Очередной байтойоб?
              Ответить
              • в твой проект не завезли бустятинки?
                продолжай писать велосипедный IntToStr
                IntToStr сам себя не напишет
                Ответить
                • Оффтоп: а бустятинка под Божественным Шестым Крестобилдером работает?
                  Ответить
                  • кажется какая-то древняя версия собиралась, но современные - нет.
                    Ответить
                    • последняя версия, официально заявленная с поддержкой ненужно 6.1.3 (2009), ненужно 6.2.1 (2010) - это буст 1.46
                      в принципе, 1.46 не такое уж и древнее старье, уж лехикал_цаст там точно есть, и даже (господи-помилуй) спирит 2.х

                      думаю, даже некое подмножество в 1.55 при особом желании можно собрать и под текущее 32-битное ненужно

                      а 64-разрядное ненужно, насколько я помню, использует шланг - этот то поддерживается
                      Ответить
                  • что собралось:
                    libboost_exception-bcb-1_55.lib
                    libboost_exception-bcb-d-1_55.lib
                    libboost_exception-bcb-mt-1_55.lib
                    libboost_exception-bcb-mt-d-1_55.lib
                    libboost_exception-bcb-mt-s-1_55.lib
                    libboost_exception-bcb-mt-sd-1_55.lib
                    libboost_exception-bcb-s-1_55.lib
                    libboost_exception-bcb-sd-1_55.lib
                    libboost_random-bcb-1_55.lib
                    libboost_random-bcb-d-1_55.lib
                    libboost_random-bcb-mt-1_55.lib
                    libboost_random-bcb-mt-d-1_55.lib
                    libboost_random-bcb-mt-s-1_55.lib
                    libboost_random-bcb-mt-sd-1_55.lib
                    libboost_random-bcb-s-1_55.lib
                    libboost_random-bcb-sd-1_55.lib


                    из хедер-онли:
                    shared_ptr - хуй
                    functional - хуй
                    spirit - qiй

                    больше ничего не проверял, организм противится
                    Ответить
                    • что с духом?
                      Ответить
                      • Изошел. Из ануса.
                        Ответить
                      • multiple declaration для какого-то шаблона
                        при построении самого буста он больше всего ругался на макросы и шаблоны
                        Ответить
                        • я про "qiй" имел в виду :)
                          Ответить
                          • А... Ну, я из boost.spirit.qi попробовал пример скомпилировать, а букву 'й' к нему подсознание само подрисовало :)
                            Ответить
                    • > shared_ptr - хуй
                      > functional - хуй
                      Ну и нахуй такой кастрированный буст нужен? :(

                      P.S. А каким билдером собирал?
                      Ответить
                      • > кастрированный буст
                        ну в smart_ptr уже в 1.47 нет ничего для бормланда, чтобы сделать атомик каунтер
                        а более раннего буста у меня даже нет на компе, и качать влом
                        Ответить
                      • Божественным Шестым Крестобилдером тыртырпрайз эдишн, у него еще котятки в кейгене мяукают :)
                        Ответить
                        • Каждый раз, когда ты ставишь c++ builder 6.0, в мире умирает котёнок.
                          Ответить
                        • Ни разу не видел с билдера котятами. Где посмотреть можно?
                          Ответить
                          • Рядом с роддомом есть кладбище котят. Как рождается крестоблядь - умирает котенок

                            А ответ на твой вопрос - в рифме)
                            Ответить
                          • http://rutracker.org/forum/viewtopic.php?t=3638325
                            Ответить
                            • Прикольно. Не видел слышал такого кряка раньше :) Шазам мелодию угадать не смог.
                              Ответить
                            • У меня был скучный кейген. Даже до сих пор где-то лежит, наверное. Можно даже диск поискать в стопке мусорных дисков.
                              Ответить
                            • его до сих пор используют (facepalm)
                              Ответить
                              • > его до сих пор используют
                                Конечно. Это же шестой ИЕ в мире компиляторов и сред разработки.
                                Ответить
                              • cleaned
                                Ответить
                                • да потому что их портирование на нормальные фреймворки означает переписать их почти с нуля

                                  enjoy your vendor lock-in
                                  Ответить
      • cleaned
        Ответить
        • Способности не главное. Главное желание.
          Ответить
        • компьютеры интереснее
          музыка для души и для общего развития, а не для посвящения ей всей жизни
          вот если бы композиторство получалось, тогда другое дело...
          а быть просто исполнителем - не мечта, совсем
          Ответить
        • > А что, в сях тоже есть IntToStr?
          В крестобилдере есть всё, что есть в делфи. Он же вообще делфёвую либу юзает. Емнип, никто не переписывал VCL под кресты, просто ашек нагенерили. Ради этого даже сделали классы, порожденные от TObject волшебными (нельзя запилить на стеке, не работает множественное наследование, зато есть свойства).

          P.S. А еще там есть ненавистный __fastcall: "Вызывай метод быстрее, я сказал быстрее, сука!"
          Ответить
          • cleaned
            Ответить
            • > Делфя вроде, все объекты держит в куче, за исключением интерфейсов.

              В TP объекты (тип которых описывался словом object) хранились так же, как и обычные переменные. Было несколько вариантов размещения:
              1. В секции данных программы, если переменная глобальная.
              2. В стеке, если переменная локальная (объявлена внутри процедуры/функции).
              3. В куче, если переменная имеет тип указателя на объект. В этом случае нужно закатывать солнце выделять память под объект вручную.

              В Дельфи же добавили альтернативную модель, описываемую словом class, которая сама выделяет память в куче. Т. е. переменная типа class — это не сам объект, а указатель на него.
              Ответить
            • > Меня всегда смущал хвостик(__) в этой декларации
              Абсолютно все эти __что_нибудь - непортабельная хуйня, которая работает только в данном конкретном компиляторе, и которую лучше никогда не юзать без веской на то причины.

              > Делфя вроде, все объекты держит в куче, за исключением интерфейсов.
              Ну вот и в дибилдере все, что порождено от TObject, нельзя запилить на стеке, только new, только хардкор.
              Ответить
            • > fastcall не юзает стек для передачи аргументов
              Еще как юзает, если их много. Там только первые несколько штук в регистрах передаются.

              http://en.wikipedia.org/wiki/X86_calling_conventions#Borland_fastcall
              Ответить
    • >> wstring sign(L"");
      >> ...
      >> else
      >> sign = L"";

      Нахуя? ¯\(°_o)/¯
      Ответить

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