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

    −1

    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
    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, 28 Сентября 2022

    Комментарии (27) 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)};
        Ответить
        • Почему зеленым? Тогда ведь можно вынести логику создания сьтроки в отдельную фуфцию коея получает итераторы

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

              Полагаю, ты хотел меня наибать, и сэмулировать повидение Goвна?
              Ответить
              • Естественно. 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)
      }
      Ответить

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