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

    +8

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    int wordLen(const char* word) 
    { 
        int i=-1; 
        while(word[++i]!='\0'&&word[i]!='\n'); 
        return i; 
    }

    Типичная лаба, но как же смешно это увидеть спустя некоторое время

    Запостил: iofjuupasli, 29 Июня 2013

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

    • А что тут не так? Ну разве что вот так переписать:
      int wordLen(const char * word) 
      { 
          int i = 0; 
          while (word[i] != '\0' && word[i] != '\n')
              ++i; 
          return i; 
      }
      Хотя оно и в исходном варианте, имхо, понятное и простое.

      P.S. Ну хотя да, говно есть, и оно таится в названии функции - это же не wordLen, а lineLen.
      Ответить
      • smallfix
        size_t wordLen(const char * word) 
        { 
            size_t i = 0; 
            while (word[i] != '\0' && word[i] != '\n')
                ++i; 
            return i; 
        }


        эх, вам про const говорили, я писал лабы без него
        Ответить
      • Что же тут нитак, ах да - перечислю: Тормазит как говно. Такпишут только питухи. Сравнивает с нулём, а потом с \n. Питух не осилил указатели, юзает инты для счётчиков и возвратов, как питух.


        inline uint64_t wordLen(char * str) {  
          return (strchrnul(str, '\n') - str);
        }


        В четыре раза компактней - в 10раз быстрее и выглядит не как говно.
        Ответить
        • > в 10раз быстрее
          Судя по исходнику в либцах да, для длинных строк будет на порядок быстрее, чем посимвольно.

          > В четыре раза компактнее
          > выглядит не как говно
          Ну тут полностью согласен. Еще бы в стандарт этот strchrnul протащили, функция то годная. Кстати, я не знал про нее, спасибо за инфу.

          > uint64_t
          size_t всё-таки. Пожалей 32-битников.

          > char
          const то чем помешал? Скорость от него уж точно не упадет.
          Ответить
          • >Ну тут полностью согласен. Еще бы в стандарт этот strchrnul протащили, функция то годная. Кстати, я не знал про нее, спасибо за инфу.
            Ну логически - strchr() доходит до нулла, значит поидее оно знает адрес конца и 100% кто-то сделал модификацию( как с мемкопи), которая возвращает адрес конца.

            Зря пацантры не юзают strchr() - на ней выходят просто в хламину быстрее парсеры, но пацаны любят по старинке. Мне нужна была модификация, в которой нулевой символ можно было менять на произвольный. strchr(str, 'a', '\n'); Искать 'а' - остановится на '\n'. Обычно я когда парсил файлецы делал что-то типа *strchr(str, '\n') = 0; и уже обрабатывал строку, но я так её и не нашел, а искать было лень. Зато *strchr(str, '\n') = 0; почти бесплатно, ибо это префетч и я как-то подзабил, но надо будет запилить или найти.

            >const то чем помешал? Скорость от него уж точно не упадет.
            Я не люблю ставить конст там, где он не упал. Один хрен там ассемблер, а я в своей обёртке данные никак не меняю. Я обычно хреначу тайпдефы, ибо мне лень писать.
            Ответить
            • > а я в своей обёртке данные никак не меняю

              Зато в твою обёртку константную строку нельзя передавать, какого хуя?
              Ответить
              • У меня всё работает. Даже с const char * const. В чём твоя проблема? О5 плюсыпроблемы?
                Ответить
                • Скорее сишкопроблемы, оставленные для совместимости с высерами обезьян, неспособных лишний раз нажать 6 клавиш, и которые приводят к граблям на пустом месте.
                  Ответить
                  • показать все, что скрытоТы упоротый питух. Конпелятор клал на твой конст - он нуникак не может не работать. Какраз-таки обезъянки везде пихают конст, не понимания его семантики. Если тебе, питуху заедушному, нужно пихать везде конст - мне не упало.


                    Нука, питух, обрисуй мне семантику конста, акромя защиты от питуха-идиота, вроде тебя.


                    Выкладывай выхлоп конпелятора.
                    Ответить
                    • > Ты упоротый питух

                      Нет ты.

                      > Нука, питух, обрисуй мне семантику конста, акромя защиты от питуха-идиота, вроде тебя.

                      Это не тольк защита, но и возможности. Возможности передавать в функцию константные объекты, например, полученные как выхлоп другой функции. И вместо
                      smth tmp = f();
                      g(tmp);
                      можно написать g(f());
                      Нормальные люди не пишут на объектах "всё можно", они продумывают, что с объектом можно делать, а что нельзя. И часто ограничения в одном месте освобождают от рассмотрения лишних случаев в другом.
                      Ответить
                      • показать все, что скрыто>Это не тольк защита, но и возможности. Возможности передавать в функцию константные объекты, например, полученные как выхлоп другой функции. И вместо
                        Т.е. по твоему мой стиль программирования, который состоит из 20-30 вызовов функций на 100строк кода не может у меня работать без коснта? Но он работает.

                        Нет никаких константных объектов - это тебе не С++, плюсовой питушок. Тут нет никакаких констант, объектов и прочего. Сдесь есть инлайн и алиасы, и поцан, который знает как это работает - ему не упали твои консты и прочая байдаа.

                        Кстануть в функции твой конст для меня ничего не стоит, поэтому если я захочу убивать твои данные - я их убью.


                        Обычное питушачье ко-ко-ко, не более. Тупые аргументы идиота, аля "без конста я не могу передавать выхлоп одной функции на влод другой" и т.п.


                        Перестань оправдываться - конст в Си не имеет семантики - это просто синтаксическая проверка, не более. В местах, где конпелятор без конста тупит, аля массивы указателей на функции - я пишу конст, но там, где он не упла - я не пишу.
                        Ответить
            • > значит поидее оно знает адрес конца
              Посмотрел сейчас, в либцовых strchr и strchrnul код одинаковый. Отличаются только куски с return'ами.
              Ответить
      • > Хотя оно и в исходном варианте, имхо, понятное и простое
        В исходном варианте питушня, и даже не потому, что i два раза встречается в выражении, и один из них с экскрементом (тут можно отмазаться точками следования), а просто по несимметричности. Ну и -1 - это костыль, очевидно.
        Ответить
    • Ну и где здесь с++?
      Ответить
      • А нету ;) Видимо в остальных частях проекта.
        Ответить
      • ++ видишь? c++ это с с оператором ++. По крайней мере, я так раньше думал.
        Ответить
        • В си, внезапно, тоже есть оператор ++. И даже -- там есть.
          Ответить
          • показать все, что скрытоНу теперь-то я знаю.

            А в яваскрипте для сложения чисел используется оператор - -

            Какая сука и за что меня минусует?
            Ответить
            • > Какая сука?
              Ты не с хабра случаем? Что-еще за кармодрочерские хабрабатхерты с переходом на личности за ёбаный минус? Нельзя было, не повышая тона, спокойно спросить за что минуснули?

              Первый твой коммент я минуснул поторопившись, т.к. не распознал шутки в твоей фразе про "c++ это с с оператором ++". Показалось, что пишешь на полном серьезе.

              Второй коммент минусанул за суку. Еще вопросы есть?
              Ответить
              • Потому что заебало. Каждый раз вижу свои коменты с минусами, а тех, кто мне отвечает - с плюсами, вот и показалось, что это система.

                И да, это была не совсем шутка, когда-то я действительно так думал :)
                Ответить
                • > Потому что заебало
                  Как говорил Карлсон: Спокойствие, только спокойствие.

                  > а тех, кто мне отвечает - с плюсами
                  Ну теперь и у меня тоже минус есть :)

                  > это система
                  ZOG не дремлет
                  Ответить
            • > А в яваскрипте для сложения чисел используется оператор - -
              Ересь, нет такого оператора. Это комбо, основанное чисто на математике. Отнять от n число, равное -a -- то же, что прибавить a к n. Парсер парсит первый минус как инфиксный бинарный оператор между токенами, второй - как префиксный унарный ко второму токену.
              Ответить
              • Спасибо, кеп. Главное - нельзя использовать +, ибо "5"+3 = "53" или что-то в таком духе. Вот и получаем два набора операторов, как в перле - один для сложения строк, другой - для чисел, только через жопу.
                Ответить
                • Что значит ваше "спасибо, кеп"? Поциент утверждал, что есть оператор такой - -, я аргументированно опроверг. Не подходит же по стандарту под кэпство.
                  Ответить
        • А Sphinx C-- — это Си с оператором --?
          Ответить
    • Больше агра, питушки-неосиляторы )))
      Ответить
      • Если тебя в следующий раз приспичит кукарекнуть, попробуй выключить комп.
        Ответить
    • лаба же
      Ответить

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