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

    +164

    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
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    void Attr::setConvertedValue(std::string pValue)
    {
        /* ............. - BEGIN - Place the HTML code instead of the */
        /* plain values. This is needed since special XML characters      */
        /* might exist.                                                   */
        for(int i = 0; i < pValue.length(); i++)
        {
            int ascii = (int)pValue[i];
    
            if(!( (ascii == 32 ) ||
                  (ascii >= 48 && ascii <= 57) ||
                  (ascii >= 65 && ascii <= 90) ||
                  (ascii >= 97 && ascii <= 122) ) )
            {
                if( ascii < 0 )
                    ascii += 256;
    
                std::ostringstream stream;
                stream << ascii;
    
                std::string newString = stream.str();
                newString = "&#" + newString + ';';
    
                pValue.replace(i, 1, newString);
    
                i += newString.length() - 1;
            }
        }
        /* ............. - END - Place the HTML code instead of the */
        /* plain values. This is needed since special XML characters      */
        /* might exist.                                                   */
        mConvertedValue = pValue;
    }

    я стою на асфальте, ноги в лыжы абуты.

    мы эскайпим значения для ХМЛ.

    вы тут посмейтесь, а я пошел головой об стенку стучатся.

    ЗЫ пысано в Бразилии.

    Запостил: Dummy00001, 11 Января 2011

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

    • > if(!( (ascii == 32 ) ||
      (ascii >= 48 && ascii <= 57) ||
      (ascii >= 65 && ascii <= 90) ||
      (ascii >= 97 && ascii <= 122) ) )

      Бедняги, у них же нет возможности написать
      if not (ascii in [32, 48..57, 65..90, 97..122]) then...
      Ответить
      • собственно такая возможность и не нужна, потому что следует использовать isalpha(), isdigit() и прочее, а не привязываться к конкретной таблице.
        Ответить
        • На все символы однострочных функций не напасёшься.
          А попки у сишников болят, я смотрю... Больной вопрос у них - убогость некоторых конструкций.
          Ответить
          • киса, ASCII это кусок семибитного говна из 1980ых, и вообще, set constructors субоптимальны с точки зрения производительности
            Ответить
            • Киса, какие конструкторы, i in [s] для константного S компилируется в простую проверку i-го бита у константы.
              Это как лиса и виноград, сишники сочиняют сказки о неоптимальности конструкций, которых у них нет.
              Ответить
              • >>>i in [s] для константного S компилируется в простую проверку i-го бита у константы

                да ты что?
                Т.е. if (65534 in [65533, 65534, 65535]) будет создавать в памяти константу на 64 кбит?
                Ответить
                • Да я что.
                  Это не скомпилится. Только для перечислимых типов и чисел до 255.
                  Ответить
                  • ну и много ли проку от такого обрезка до 255 ?
                    Ответить
                    • В большинстве случаев множества из перечислимых типов и составляются.
                      Хочешь больше - используй свои карты.
                      Либо пиши
                      if i-65500 in [33,34,35]
                      Ответить
                      • Вы так утверждаете, что как будто в Си нельзя так сделать. Можно создать эту табличку, только потребность в этом не настолько велика ,чтобы делать это как в паскале. Иными словами в подавляющем числе случаев имеются более подходящие решения.
                        Ответить
                        • Конечно, можно.
                          Берёшь, и пишешь
                          if ((1 << i) & ((1 << 32)|(1<<48)|итд))
                          Только писанины намного больше.
                          Ещё можно написать так:
                          case i of
                          65533, 65534, 65535: begin
                          ...
                          end;
                          end;
                          Ответить
                          • Я говорил про табличную реализацию.
                            Ответить
                      • а если нужно [1,2, 512, 30000..32000, 12541212..12545000] че писать будешь?
                        Ответить
                        • case i of
                          1,2, 512, 30000..32000, 12541212..12545000: begin
                          end;
                          end;
                          Ответить
                      • >В Delphi это не скомпилится. Только для перечислимых типов и чисел до 255.
                        >Хочешь больше - используй свои карты.

                        В С++ так же можно. :)
                        Раз есть ограничение в 255, то скорее всего и там и там придётся писать велосипед, так что эта дельфовская возможность не защитана...

                        Тем более, в С++ есть готовые удобные оптимизированные и проверенные годами тестирования и эксплуатации библиотеки.

                        В дельфи, если и удастся найти компонент, то он будет очень не проверенный и написаный абы как. (Так называемая проблема языка из не крупнопроизводственных отраслей).
                        Ответить
                        • >в С++ есть готовые удобные "библиотеки".
                          Оговорился. Не только С++, а во всех крупнопроизводственных меинстримовых языках (к коим дельфи, наверное к счастью, не относится).

                          Впрочем, думаю, это было и так понятно, извиняюсь за КЭПерство.
                          Ответить
                        • > В С++ так же можно. :)

                          Ага,
                          if ((1 << i) & ((1 << 32)|(1<<48)|итд))
                          Ответить
                          • Вам сто раз писали, что можно сделать по нормальному, а не так как вы показываете.
                            Ответить
                            • Ну что-ж Вы. Приведите пример. Человек не верит. :)
                              Ответить
                              • char check_mas[] = { 0, 0, 0, 1, 0, 1 };
                                
                                if (mas[val])
                                {
                                ...
                                }

                                не удобно, но без глупых ограничений...

                                можно еще тоже самое сделать на битовых таблицах, будет медленнее но съест меньше памяти и опять таки без ограничений
                                Ответить
                                • ага, иногда помогает еще так не совсем в тему говнокода, но все же:
                                  int tbl[] = {1056, 8701, 1800, 29, 889, 7769, 9105};
                                  if(mas[tbl[val]] == number) //вот для этого в паскале тоже нет стандартных средств
                                  {
                                  //...
                                  }
                                  Ответить
                                  • if mas[tbl[val]] = number then
                                    Чем не стандартное средство? :)
                                    Ответить
                                    • Я имел ввиду нечто подобное как любит пользоваться TarasB . Ну то есть тоже придется вручную писать.
                                      Ответить
                                • mas, ORLY?
                                  Ответить
                                • И будет как в 69023, офигеть удобно.
                                  Ответить
                      • >(65534 in [65533, 65534, 65535])
                        Часто такое решается на более высоком уровне, например фабриками или полиморфизмом.

                        Эта конструкция просто становится не нужна.
                        Ответить
                        • показать все, что скрытоНа более высоком уровне писанины лишней много, не кажется?
                          Ответить
                          • Как раз наоборот, а главное легче потом разобрать и серьёзно исправить свой код через 10ток лет за 5 минут.

                            А если Вам понадобиться исправить этот код в будующем - с вашим подходом потратите несколько недель, отлаживая код и разбираясь в нем.
                            Ответить
                            • Код через case отлаживать почти не придётся.
                              Ответить
                              • Да. Лучше просто его выкинуть и переписать полностью заного, если понадобится его отрефакторить или найти в нём ошибки. Многостраничные кейсы разрушают нервные клетки быстрее, чем те успевают востанавливаться. Понимаю. :)
                                Ответить
                                • Ну конечно, одна строчка в кейсе намного страшнее, чем многострочный набор условий в if
                                  Ответить
                                  • Я говорил про многостраничный кейс, кои могут получаться в тех случаях, когда лучше применить другой более подходящий паттерн.
                                    Ответить
                                    • А в таких случаях действительно лучше применить что-то ещё.
                                      Но вот вместо if ((i > 1 && i<1000) || итд
                                      куда проще сделать нормальный паскалевский case
                                      Ответить
                  • А, ты про паскаль...
                    Ответить
              • совсем разжЫрел...
                Ответить
                • Бля, сишники, вы реально дебилы. Пиздоболите тут, о чём не знаете, минусы ставите за правильные посты. Хоть бы проверяли свой пиздёж.
                  Ответить
                  • а в питоне можно так
                    if i in [float(x*y+x/y) for x in range(0,10,2) for y in range(2,5)]:
                    что еще раз доказывает что паскаль - говно!
                    Ответить
                    • даже в питоне...
                      Ответить
                    • показать все, что скрытоЧто доказывает, что С++ ещё большее говно.
                      Ответить
                      • которое в 1.7 раза производителнее. а когда нужна именно производительность, то выбор невелик и паскаль в этом выборе не участвует...
                        Ответить
                        • >в 1.7 раза
                          Откуда такие цифры? Всё зависит от задачи, компилятора и метода её решения.

                          На С++ можно так наговнякать... И легче, чем в дельфи.
                          Ответить
                          • и на делфи можно так наговнячить... так наговнячить можно даже на питоне и пхп...
                            цифра от Тараса, он в последнее время жирнеет продвигая делфи...
                            Ответить
                            • >Тарас в последнее время жирнеет продвигая делфи...
                              Помоему он просто над нами стебётся, естественно зная, что дельфи УГ.
                              Ответить
                              • Дельфи7 действительно УГ, даже битовые сдвиги неправильные делает. Но проблема в том, что большая часть сишников делится на 2 группы - те, кто думают, что Паскаль - это только Д7 (Пушков из таких), и ещё более дремучие, кто думает, что Паскаль - это ТП7.
                                На самом деле Паскаль, как язык, превосходит Си/Си++ во всех отношениях. То, что слов больше надо писать - это полная фигня по сравнению со временем отладки. Отсутствие мощных оптимизирующих компиляторов - тоже не вина языка.
                                Распространение Си - это большая историческая ошибка. Надо было убить Ритчи в 70м.
                                Ответить
                                • >Надо было убить Ритчи в 70м.
                                  Изобретите машину времени и исправьте эту досадную ошибку. :D
                                  Ответить
                                • >Дельфи7 действительно УГ
                                  >На самом деле Паскаль, как язык, превосходит Си/Си++ во всех отношениях
                                  Вывод из ваших слов:
                                  Си++ - УГешное УГ?

                                  :D
                                  Ответить
                            • Наговнякать можно даже на ПХП? ЧТО, ПРАВДА?!
                              Ответить
                        • Разница в производительности такая только из-за политики Ботланда. Паскаль - это не скриптовый язык с динамической типизацией, у него нет объективных причин тормозить.
                          Ответить
          • >На все символы однострочных функций не напасёшься.
            Тем более, что это не требуется. Если нужен конкретный символ, то его и следует проверить, обычным символьным сравнением, а не через ascii-коды. А если нужен диапазон, то в адекватных случаях используются функции, о которых я говорил выше.
            Такие же варианты как в ГК или в твоем примере изобилуют магическими числами, что не есть гуд.
            Ответить
            • if ascii in [' ', '0' .. '9', 'A' .. 'Z', 'a' .. 'z'] then begin...
              Ответить
              • В том-то и дело, что буквы могут НЕ лежать в одном диапазоне.
                Ответить
                • лол) а какого болта прогер должен об этом задумываться? есть инварианты 'a' < 'b' < ...< 'z' и они должны выполняться независимо от того, как они хранятся.
                  Ответить
                  • Как раз чтоб не задумываться и есть функции типа isalpha().
                    Инварианты такие от лукавого, особенно для символов, не принадлежащих латинице.
                    Ответить
                  • Такого не видел, но мне интересно. Давайте порассуждаем.

                    1)Есть ли такие языки, где это реализовано, при этом для различных лингвистических языков и для разных платформ?

                    2)Как выглядит такой инвариант при сравнении, скажем, 'а' и 'A' или латинской 'A' и русской 'А'?

                    (xXx_totalwar, Вы, наверное, помните о моём хобби, поэтому знаете, что мне это может пригодиться. :)
                    Ответить
                    • >Такого не видел, но мне интересно. Давайте порассуждаем.
                      в лингвистике как бы не поощряется рассуждать. это вполне формально определенная область.
                      1) конечно есть. любой язык имеющий алфавит (с логографией отдельные истории). все идет с времен зарождения письменностей, когда литерам соответствовали еще и числовые значения. следовательно, порядок следования важен или господа отрицают, что числовые множества обладают отношением порядка?
                      странно, что многие не стесняясь называющие себя программистами, не знают даже тривиальных основ лингвистики.
                      2) по большому счету эти величины не могут быть сравнимы, т.к. принадлежат разным множествам. но на практике это может быть реализовано, например в соответствии с ISO-14651 / DUCET
                      Ответить
                      • >1)конечно есть
                        Вы же понимаете, что я жду примера языка программирования, где реализован данный порядок?
                        Ответить
                        • вообще любой имеющий символьный тип. в чем проблемы?
                          python
                          >>> 'a' < 'b' < 'c'
                          True

                          ml
                          # 'a' < 'b' && 'b' < 'c';;
                          - : bool = true

                          haskell
                          > 'a' < 'b' &&  'b' < 'c'
                          True
                          Ответить
                          • 1)Хоть один из них используется на встроенных платформах?

                            >'a' < 'b' && 'b' < 'c'
                            2)Подобное сравнение верно и для национальных алфавитов на всех платформах?
                            Ответить
                            • 1) 'a' < 'b' это и в pure c верное выражение
                              2) проблемы разработчиков платформ. если не способны для алфавита реализовать отношение порядка, нечего им в этой профессии ошиваться.
                              Ответить
                              • >в pure c верное выражение
                                Насколько я помню, в стандарте языка Си это не указано, значит не верное.
                                Ответить
                                • си - все-таки низкоуровненый язык, у него и система типов крайне слабая.
                                  Ответить
                                • ISO C использует ASCII, т.е. верно.

                                  В С 'a'/'b'/etc это есть просто целочисленные константы, со значением соответствующим коду символа в ASCII. (В С++ - char константы, но с тем же значением.)
                                  Ответить
                                  • >C использует ASCII, т.е. верн
                                    Верно лишь утверждение 1)
                                    2)ое не верно, т к для национальных алфавитов аски не стандартизирует такое.
                                    Ответить
                                    • "2)ое не верно, т к для национальных алфавитов аски не стандартизирует такое."

                                      верно, потому что по стандарту ты и не можешь написать например 'ё'. С и С++ гарантируют только ASCII. в новых версиях языков для этого есть U'~'/L'~' (U'' - 32bit Unicode, L'' - 16bit Unicode).

                                      Для С, смотри в стандарте 6.4.4.4 - Character constants. Для С++ - 2.14.3 - Character literals. К слову, рекомендую почитать, сам много нового узнал ;)
                                      Ответить
                                      • >ты и не можешь написать например 'ё'
                                        Что-то мне кажется, что могу.
                                        Даже если не могу, но в char лежит "йо" и мне его надо сравнить с другими символами, то что тогда? Где выполняется?
                                        Или Вы предлагаете выкинуть интернациональные кодовые страницы только из-за того, что в Си по стандарту только ASCII?
                                        Ответить
                          • поэкспериментируйте с буквой "йо" (на мак клаве нет символа е с двумя точками)...
                            Ответить
                            • да знаю. и это напрягает
                              Ответить
                              • Тоесть на данный момент, как и ожидалось, с 'ё ' проблема во всех языках?
                                Ответить
                            • нажми Alt-\
                              Ответить
                              • неполучилось
                                Ответить
                                • Alt - залип? )
                                  Ответить
                                • наверное ты жмешь Alt+\, а надо Alt-\ :)
                                  Ответить
                                • мля. точно. на моем старом лаптопе (10.4) Alt+\ печатает ё - на новом (10.6) ё не нашел... :(

                                  ЗЫ гугл, искать "мак буква ё" - альтернативная раскладка с буквой ё.
                                  Ответить
                                  • в другой раскладке эта комбинаия работает, но там че-то с точками и запятыми...
                                    Ответить
                • Извращенская кодировка?
                  Ответить
                  • Например Юникод для всех русских символов
                    Ответить
                  • Это реалии компьютерного мира; наследие, от которого, теперь, уйти очень тяжело. Привыкайте.
                    Ответить
      • А оно нам и не надо
        Ответить
    • в строке 24 надо 1 заменить на newString.length() или закомментить строку 26

      а так на говнокод не тянет. задора нет
      Ответить
      • ага. куча ненужного копирования. два ненужных (пере)выделения памяти. потому что в XML в принципе только три символа имеют специальное значение: &, >, <.

        ну и самое главное достижение этого кода: превращение utf-8 в мусор. как собственно этот шедевр и попал мне на радар.
        Ответить
    • еще используя unsigned можно было бы не писать if( ascii < 0 ) ascii += 256;
      Ответить
      • температура поверхности планеты Нибиру -4°K
        Ответить
        • > -4°K ??
          > - ??!
          o_O
          Планету Нибиру на говнокод, срочно!
          Ответить
          • http://www.youtube.com/watch?v=3Q07LC_eh6E 5:16
            Ответить
            • Напомнили... Ну теперь ясно...
              А я-то, наивный, всю сознательную жизнь думал, что 0°K - это абсолютный ноль, так сказать...
              Ответить

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