Кресты / Говнокод #28386 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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
  34. 34
  35. 35
  36. 36
  37. 37
  38. 38
  39. 39
  40. 40
  41. 41
  42. 42
  43. 43
  44. 44
  45. 45
  46. 46
  47. 47
  48. 48
  49. 49
void RoostreamPorkser::handle(char c)
{
  switch (m_state) {
  case State0:
State0:
    if (isdigit(c)) {
      m_number = 0;
      m_state = StateNumber;
      goto StateNumber;
    } else if (isalpha(c)) {
      m_word = "";
      m_state = StateWord;
      goto StateWord;
    }
    break;
  case StateNumber:
StateNumber:
    if (isdigit(c)) {
      m_number = m_number * 10 + c - '0';
    } else {
      handleNumber(m_number);
      m_state = State0;
      goto State0;
    }
    break;
  case StateWord:
StateWord:
    if (isalpha(c)) {
      m_word += tolower(c);
    } else {
      handleWord(m_word);
      m_state = State0;
      goto State0;
    }
    break;
  /*
  // Или лучше так
  case StateNumber:
    if (!isdigit(c)) {
      handleNumber(m_number);
      m_state = State0;
      goto State0;
    }
StateNumber:
    m_number = m_number * 10 + c - '0';
    break;
  */
  }
}

Например, задача: есть поток символов, в нем встречаются числа и слова, которые нужно обработать (прочие символы игнорируются).
Не говно или всё-таки goto(с)?
Перепиши на Java?

Запостил: Steve_Brown Steve_Brown, (Updated )

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

  • Яйца

    Иногда в магазине я чувствую себя единственным человеком, который разбирается в категориях яиц.

    Все яйца всегда подписаны, но создается ощущение, что люди покупают их только глядя на цену. Это пиздец!

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

    Так как на свете ни один производитель не уверен, что его продукция продастся за неделю, все сразу на упаковке пишут категорию С.

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

    Дальше самое важное - обратить внимание на сорт. Чем крупнее число, тем мельче продукт, как у устриц. 3 - яйцо третьей категории, самое мелкое. 1 - крупнее. О - еще крупнее, но означает «отборное», а не «ноль». А буква В означает высшую категорию. Это самое крупное яйцо, в два раза крупнее, чем 3.

    Есть маркетинговая байка, что самые мелкие яйца несут молодые, здоровые и бодрые курочки, а высшую категорию производят только старородящие, пожилые и разъебанные куры. Это все хуйня полная. Если бы это было так, яйцо С3 стоило бы в пять раз дороже СВ.

    Короче, в магазине ищите СВ или хотя бы СО. Потому что ДВ все равно не найти даже в Глобусе-гурме.
    Ответить
    • >Apa6cKuu
      Тогда нужно яйца ХВ
      Но они редко продаются, раз в год где-то.

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

    В русском языке порядок слов не фиксированный (в отличие, например, от германских языков) но очень важны пунктуационные знаки
    Ответить
  • не говно, а лаба

    >char
    Буквы у нас только однобайтовые?

    > State0
    Это автогенеренный код? Человек не мог же так назвать переменную, и такой копрофажской кодстайл тоже не мог

    >isalpha
    см замечание про чар

    > goto StateWord;

    Да бля, почему не сделать отдельные функции?
    Ответить
    • > Буквы у нас только однобайтовые?
      Вполне возможно, что да. Тогда код имеет смысл.

      > Это автогенеренный код? Человек не мог же так назвать переменную, и такой копрофажской кодстайл тоже не мог
      В контектсте в принципе понятное название — стартовое состояние/состояние по умолчанию. StateDefault или StateEmpty, конечно лучше бы пошли.

      > Человек не мог же так назвать переменную
      Человек не мог назвать перечислитель переменной.

      > Да бля, почему не сделать отдельные функции?
      Ещё лучше — это конечный автомат. Есть куча либ, куча книг о их реализации, нет, будем фигачить свищ с готу.
      Ответить
      • Ну он попытался сделать конечный автомат в каком-то смысле, но по идее это же просто лексер для регулярной грамматики, третий по Хуёмски, и его в любом случае ковыряют автоматом, не?

        ps: почему кстати не взять готовый генератор лексеров?
        Ответить
        • > почему кстати не взять готовый генератор лексеров?
          Спроси ОПа.

          Щас сюда набежит j123123 и скажет, что все эти генераторы, лексеры и автоматы в контроллеры не влезают.
          Ответить
          • А конечно С++ влазит
            >>RoostreamPorkser::handle
            Ответить
            • Если libstdc++ не линковать — вполне. И классы и шаблоны залазят. И работают на нескольких кб оперативки и половине мб флеш-памяти.
              Ответить
              • То есть использовать только синтаксис С++, но не её библиотеку, верно? Такой как-бы typescript для сишки?

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

                  Но и тут есть облегчённые библиотеки, которые возвращают большую часть обратно. Обычно лишаешься iostreams (потому что говно), говна, завязанного на STDIN/STDOUT (потому что этого нет), поддержки многопоточности (которой на контроллерах обычно нет), исключений и удобного дебага (потому что места нет, блджад), особо сложной математики, возможно — поддержки плавучки. Часто ещё можно отрубить динамическую аллокацию, тогда сломается всё, что её использует.
                  Ответить
                  • Шаблонное тебе вкомпилица всмысле? а коллекции? А что живет в библиотеке тогда?

                    >Часто ещё можно отрубить динамическую аллокацию
                    то есть коллекции сразу пойдут нахуй анлесс ты им свой кастомный аллохатор на аренах не сунешь?
                    Ответить
                    • > А что живет в библиотеке тогда?
                      Херня, которая соедствами абсрактной машины не выражается. Всё, что требует взаимодействия с ОС. Нешаблонные функции. Сишная либа (в принципе входит в нешаблонные функции, но похуй).

                      > то есть коллекции сразу пойдут нахуй анлесс ты им свой кастомный аллохатор на аренах не сунешь?
                      Есть единственный полезный тип данных...
                      std::array не испытывает никаких проблем.
                      Ответить
                      • понял тебя)

                        >std::array
                        Это вроде обычный аррей, но с цисгендерной семантикой валуе тайпа (копируется и пр) и не превщащается в указатель?
                        Ответить
  • Кстати, расскажу вам смешное

    Взял я буфер -- массив 4096 байт, заполнил его нолями, и считал туда немного букв в однобайтной кодировке.
    Ну вот например первые три буквы это буквы, а дальше -- ноли.

    Теперь хочу получить из него строку.

    В современных высокоуровневых языках типа С++ это делается довольно просто: пихаешь в std::string это массив, там его встречают, как сишную строку, и высасывают текст до первого ноля.

    // будет два, что логично и правильно
    	constexpr char foo[]{'a', 'b', 0, 0, 0, 0, 0, 0, 0, 0};
    	const std::string bar{foo};
    	std::cout << bar.length() << std::endl;


    В устаревших низкоуровневых языках такого прикольного сахара нет. Возьмем, скажем, Go:
    package main
    
    import "fmt"
    
    func main() {
    	data := []byte{'a', 'b', 0, 0, 0, 0, 0, 0, 0, 0, 0}
    	str := string(data)
    	fmt.Printf("String %s has length %d", str, len(str)) //String ab has length 11
    
    }

    Но можно сделать и еще смешнее
    package main
    
    import "fmt"
    
    func main() {
    	data := []byte{'a', 'b', 0, 0, 0, 0, 0, 0, 0, 0, 0, '!'}
    	str := string(data)
    	fmt.Printf("String %s has length %d", str, len(str)) // String ab! has length 12
    }


    Такой вот нежданчик. Думаю переписать утилиты с Go на С++ чтобы упростить и ускорить разработку и уменьшить количество потенциальных ошибок
    Ответить
    • А что это ты в С++ пользуешься указателями? Это не современно, пользуйся итераторами:
      const std::string bar {std::begin(foo), std::end(foo)};
      Ответить
      • Почему зеленым? Тогда ведь можно вынести логику создания сьтроки в отдельную фуфцию коея получает итераторы

        А можно взять реверснутый итератор и ьтичулоп перевернутую строку?
        Ответить
          • у меня в шпоргалке написино
            >Copies the sequence of characters in the range [first,last), in the same order.

            Полагаю, ты хотел меня наибать, и сэмулировать повидение Goвна?
            Ответить
            • Естественно. std::string может хранить в себе нулевые символы, если её об этом попросить.
              Ответить
              • Понятно. Впринципе, же нигде не сказано, что нулевой буквы не бывает

                Просто именно для кейса с указателем на чар там запилен спешл кейс для совместимости с сишкой и сишкиным литералом, да?
                Ответить
            • Естественно. std::string может хранить в себе нулевые символы, если её об этом попросить.
              Ответить
    • > Теперь хочу получить из него строку.

      Что значит "получить строку"? С точки зрения языка "Си", это у тебя и так нуль-терминированная строка. Можешь ее продублировать через фунцкию "strdup" если хочешь
      Ответить
  • Мальчик: в го строки немодифицируемые
    Мужчина: подержи моё пиво
    package main
    
    import "fmt"
    
    type myString string
    
    func (str *myString) ImproveALittle() {
    	*str = "nigger loves a watermellon ha! ha! ha! ha!"
    }
    
    func main() {
    	var wisdom myString = "Knowledge is power"
    	wisdom.ImproveALittle()
    	fmt.Print(wisdom)
    }
    Ответить

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

Переведи на "PHP", guest!

    А не использовать ли нам bbcode?


    8