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

    +991

    1. 1
    unsigned long long int value=Bin<unsigned long long int>("1111111111111111111111111111111111111111111111111111111111111111");

    Запостил: AnimeGovno-_-, 02 Ноября 2011

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

    • показать все, что скрытоgcc давно поддерживает 0b01001110, но это не стандарт.
      И как после этого Си и С++ можно использовать как низкоуровневый язык для контроллеров? Одни тормоза и пустая трата памяти на строки бинарных чисел.
      Ответить
      • если ты настолько туп, что не можешь каждые 4 бинарных разряда переписать как один шестнадцатеричный, то тебе уже нихера не поможет
        говнокод в сабже намекает, что требуемое число влезает в uint64_t
        в чем проблема то? написать LL в конце?
        даю подсказку - число из говнокода можно определить не менее чем тремя другими способами
        Ответить
        • >не можешь каждые 4 бинарных разряда переписать как один шестнадцатеричный
          О понятиях декларативности, самодокументирующемся коде, ты конечно же слышал?
          И выполнять часть работы компилятора, ты видимо считаешь, почетным делом?
          Ответить
          • здесь, очевидно, должен быть перечислен список языков, более пригодных для низкоуровневых контроллеров, особенно в свете записи чисел в бинарной форме
            и да, если уж говорить о бинарных числах для контроллеров - расскажи, зачем необходимо объявить именно 0b01001110, а не 0x4e. Что за самодокументирующийся хардкод? А потом удивляются, почему у нас такая мощная тихоокеанская группировка спутников
            Ответить
            • >список языков, более пригодных для низкоуровневых контроллеров,
              Cи пригоден, но добавить бинарную форму записи числа в язык, используемый для программирования контроллеров, просто необходимо.
              Хоть создатели gcc об этом догадались.

              >зачем необходимо объявить именно 0b01001110, а не 0x4e
              Например, битовые маски, установленные сигналы и тд. Очень часто в контроллерах на один и тот же порт параллельно приходится вешать много различных устройств, например на 8ми битах порта висит 5 устройств, каждому выделены свои биты.
              Ответить
              • об этом я и говорю
                только баклан будет писать 0b01001110 чтобы передать заданному набору устройств сигнал
                enum {
                		device1 = 0x01,
                		device2 = device1 << 1,
                		device3 = device2 << 1,
                		device4 = device3 << 1,
                		device5 = device4 << 1,
                	};
                
                	unsigned char mask = device1 | device3 | device5;

                синтаксический сахар в виде 0b... нужен либо ленивым, либо неграмотным
                Ответить
                • показать все, что скрытоdevice2 = 1 << 1 | 1 << 2 | 1 << 3 | 1 << 5 | 1 << 7;
                  Да, чувак, клево делать таким образом битовую маску под device2, а потом таким же образом под все остальные девайсы
                  Ответить
                  • битовую маску под девайс2 ты не обломаешься сделать через 0x...
                    теоретик?
                    Ответить
                    • показать все, что скрытосамодокументируемость где? и зачем я должен выполнять часть работ по переводу форматов чисел за компилятор языка?
                      Ответить
                      • где самодокументируемость в твоей гипотетической маске?
                        к.о. какбе намекает, что она может быть непростой только по одной причине - в ней есть независимые области, каждая из которых что то да значит
                        никакой разницы в самодокументируемости между 0b01001110 и 0x4e нет совсем, они равноправны с этой точки зрения
                        а вот хардкодить такие вещи в любом проекте, не только для приведённых тобой "низкоуровневых микроконтроллеров" - плохой зайка
                        если маска сложная, разбей её на логические части, следующие из целей этих частей, и пиши код в виде value1 & block1_mask | value2 & block2_mask
                        не делай за компилятор его работу, а программист, который будет разбираться че за хуйня это ваше 01001110, тебе спасибо скажет
                        Ответить
                        • >а вот хардкодить такие вещи в любом проекте, не только для приведённых тобой "низкоуровневых микроконтроллеров" - плохой зайка

                          Ты из XML собрался загружать, если не хардкодить что ли на контрллере?
                          Ответить
                        • >если маска сложная, разбей её на логические части

                          device2 = 1 << 1 | 1 << 2 | 1 << 3 | 1 << 5 | 1 << 7;
                          Вот, я это сделал. Получилось говно. Один девайс - одна маска.
                          Ответить
                          • что это за мейджик хардкод?
                            что означают эти биты? каждый из них?
                            это id устройства? это маска? что это?
                            Ответить
                            • Это информационные биты устройства device2, которые к нему относятся.
                              Остальные биты относятся к другим устройствам.

                              Я так и понял, что вы низкоуровневым программированием не занимались. :\
                              Ответить
                              • > Я так и понял, что вы низкоуровневым программированием не занимались
                                Интересная у вас логика.

                                Приходилось работать в проекте, где была куча подобного кода, и у меня был жуткий баттхёрт по этому поводу. Подобные куски были разбросаны тут и там, часто встречалась копипаста. Понять без поллитры такие вещи мог только автор кода.
                                В том случае можно было инкапсулировать логику в нескольких макросах, и код стал бы гораздо более понятным и читаемым.
                                Ответить
                                • показать все, что скрыто>Приходилось работать в проекте, где была куча подобного кода, и у меня был жуткий баттхёрт по этому поводу.

                                  В высокоуровневом программировании это бы и у меня вызвало батхерт. А в программировании контроллеров по другому особо не сделаешь. Ограничения платформы.


                                  >В том случае можно было инкапсулировать логику в нескольких макросах

                                  А кто запрещает? Поддержка бинарного формата чисел не мешает инкапсулировать логику в макросы или функции.
                                  Ответить
                                  • > В высокоуровневом программировании
                                    стек протоколов SS7 в OSE-Delta. Не особо высокий уровень.
                                    По мне так C даёт достаточно средств, чтобы даже самый, казалось бы, низкоуровневый код выглядел читабельно и работал при этом достаточно эффективно.
                                    Ответить
                                    • показать все, что скрытоЯ знаю. И? Я уже написал про вынос в функции или макросы. В чем проблема была сделать ещё чуть-чуть? Бинарный формат чисел? Это так сильно усложнит код компилятора? Если приходится извращаться, то почему до сих пор не добавили?

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

                                          Я понимаю. :(
                                          Ответить
                              • что значит информационные биты устройства? это маска, по которой девайс2 слушает шину и выявляет нужную для себя информацию, или это адрес устройства девайс2 на шине?
                                вывод неверный
                                Ответить
                                • я так понял, что это всё таки маска.
                                  почему она не сплошная? может есть какая то разумная причина, по которой в маске есть дырки в середине? мне кажется, от нас что то скрывают
                                  может эту разумную причину стоит кодить разумным образом, а не хардкодом?
                                  Ответить
                                  • показать все, что скрыто>почему она не сплошная?
                                    Это вопрос к схематехниками, а не к программистам. Может напутали чего. Или напутали, но серию устройств уже выпустили и переделывать не станут. Или были зарезервированные биты, потом чтобы не переразводить устройство или не пересобирать устройство - использовали этот зарезервированный бит. По хорошему биты должны стоять вместе, но реальность диктует свои условия. Часто заменить все устройства у заказчика или пересобрать дороже, чем добавить пару строк кода, немного усложнив код, вынеся бит отдельно от всех остальных битов устройства.
                                    Ответить
                                    • ну раз это такое требование и "так задумано изначально", тогда не вижу принципиальной разницы между #define device2_mask 0x4e и #define device2_mask 0b..., раз это должно делаться один раз во всем коде
                                      меня просто умилили набросы в стиле "поэтому си невозможно использовать для низкоуровневого языка", 40 лет возможно и удобно, а тут бида бида
                                      Ответить
                                      • показать все, что скрыто>поэтому си невозможно использовать для низкоуровневого языка

                                        Где я такое написал? Регулярно использую. И вообще, я вас конечно понял, но предложение похоже на несвязанный бред.


                                        >тогда не вижу принципиальной разницы между #define device2_mask 0x4e и #define device2_mask 0b...,

                                        А разница есть и это большинству очевидно.
                                        Ответить
                                        • > Где я такое написал?
                                          > И как после этого Си и С++ можно использовать как низкоуровневый язык для контроллеров?
                                          Ответить
                                          • А ты что показал?
                                            >поэтому си невозможно использовать для низкоуровневого языка

                                            Язык Си не возможно использовать для низкоуровнего языка. На си написано столько компиляторов низкоуровневых языков, что тебе и не снилось. Не нужно меня обвинять в своем бреде.
                                            Ответить
                                            • неудачная попытка троллинга - переход на орфографические ошибки оппонента
                                              но у спортсмена обязательно будет еще одна бонусная попытка
                                              Ответить
                                              • показать все, что скрыто>переход на орфографические ошибки оппонента
                                                Ты ещё школьный курс русского языка не закончил? Это семантическая ошибка, а не орфографическая.
                                                Ответить
                                                • аниме, лучше скажи для каких контроллеров ты пишешь свои магические хардкоды, чтобы я знал, чего мне следует сторониться
                                                  Ответить
                                • >что значит информационные биты устройства?

                                  ввод или\и вывод на устройство производится через них.
                                  Ответить
                        • показать все, что скрыто>пиши код в виде value1 & block1_mask | value2 & block2_mask
                          Покажи код на примере с дивайсами
                          Ответить
              • Битовые поля в структурах не для этого ли были придуманы в языке, используемом для программирования микроконтроллеров?
                Ответить
                • показать все, что скрытоdevice2 = ...| 1 << 5 | 1 << 7;
                  Я бы посмотрел, как ты это написал через битовые поля
                  Ответить
                  • struct something_type {
                      unsigned char dumb1: 5;
                      unsigned char mean1: 1;
                      unsigned char dumb2: 1;
                      unsigned char mean2: 1;
                    };
                    something_type something;
                    something.mean1 = 1;
                    something.mean2 = 1;

                    Порядок бит, говорят, зависит от реализации, но мы же, программируя микроконтроллер, воспользуемся компилятором, генерирующим код для этого микроконтроллера, в котором этот порядок так или иначе определён.
                    Ответить
                    • показать все, что скрыто>something.mean1 = 1;
                      something.mean2 = 1;

                      Фи. Хочу
                      const char cm=0b101;
                      ...
                      something.mean=cm;
                      , а не по отдельности все биты устройства выставлять или читать. Так придется править код везде, где я общаюсь с mean, если у неё появятся новые биты или они перекочуют.
                      Ответить
                      • показать все, что скрытоА как, вы guestGovno будете отправлять эти данные в порт ввода-вывода, типа unsigned char или другого целочисленного типа? Через union? Через "reinterpret_cast"? Зачем мне одни костыли заменять на другие?
                        Ответить
                        • Ну привести же к нужному типу. reinterpret_cast это с++, но по сути верно.
                          Ответить
                          • показать все, что скрыто>reinterpret_cast это с++
                            У меня это ключевое слово в кавычках не случайно. Семантически reinterpret_cast в Си есть, только используется по другому.
                            Ответить
                          • >Ну привести же к нужному типу.
                            Костыль. Во время компиляции вообще проверки на совпадение типов не будет. Это как минимум, дает лишние места для возможных ошибок.

                            На производительности и объёмах занимаемой памяти - использование структур, битовых полей и приведений типов сказывается отрицательно. Иногда для контроллеров это не допустимо.
                            Ответить
                        • Почитай что-ли, на досуге, как организован доступ к пинам МК Atmel AVR у IAR EWB.
                          Ответить
                      • > device2 = ...| 1 << 5 | 1 << 7
                        ...
                        > а не по отдельности все биты

                        А это было не по отдельности?

                        > если у неё появятся новые биты или они перекочуют.

                        А все const char-ы не придётся пересматривать в таком случае? В случае структур нужно будет переставить местами поля в определении. А если захардкодить — тогда беда.

                        something_type something_special;
                        something_special.mean1 = 1;
                        something_special.mean2 = 1;
                        ...
                        memcpy(something_dst, something_special, sizeof(something_special));

                        А ещё, скажу по секрету, для этих действий можно сделать функции с говорящими названиями, и абстрагироваться от внутреннего устройства, если, конечно, хочется грасоты.
                        Ответить
                        • показать все, что скрыто>А это было не по отдельности?
                          Это маска, а не биты. Вы просто забыли, что такое маска или вам никогда ей не приходилось пользоваться.

                          >А все const char-ы не придётся пересматривать в таком случае?
                          Константы в одном месте и их не так много. Это не весь гигантский код проекта пересмотреть. За этим константы и заводят, для легкости рефакторинга.

                          >something_special.mean1 = 1;
                          something_special.mean2 = 1;
                          Я уже сказал, что это не удобно и требует изменять код в многих/нескольких местах в случае необходимости каких-то изменений.

                          >memcpy(something_dst, something_special, sizeof(something_special));
                          Так отправлять данные в порт ввода/вывода нельзя.

                          >А ещё, скажу по секрету
                          Я уже это сказал много выше.
                          Ответить
                          • > Это маска, а не биты.

                            Это мощно.

                            something_special создаётся в одном месте, потом используется по мере необходимости.

                            А с memcpy косяк, да. Действительно же нельзя так в порт. Ну вот, вся затея к чертям, увы мне.

                            Только...

                            если...

                            может быть...

                            ... out вместо memcpy?... нет, это было бы слишком очевидно.


                            Ах да, у out же нет третьего параметра. Опять ничего не получается, обидно.
                            Ответить
                            • показать все, что скрыто>Это мощно.
                              Если вы не поняли, то я говорил про маску информационных битов, а не про информационные биты.
                              Ответить
                              • Маска строится путём установки значимых бит, то есть создаёт структуру, у которой нужные битовые поля установлены, это и будет маска после приведения к unsigned char или int, или какая там нужна длина слова. Ну что в самом деле...
                                да, 0b.... было бы замечательно, но его нет. Увы. Но можно и вот так. Ага.
                                Ответить
                                • показать все, что скрыто>создаёт структуру, у которой нужные битовые поля установлены
                                  Я уже показал, что это не работает нормально с разнесенными битами одного устройства.
                                  Требует приведений типов, что костыльно, если можно было сделать по человечески.
                                  Ответить
                            • показать все, что скрыто>out вместо memcpy
                              Он отправляет только целочисленные типы, а не структуры.

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

            > использовать как низкоуровневый язык для контроллеров...

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

              Красота ещё и улучшит производительность. Посмотри на код выше - там строка, а это уже идиотизм. Пришлось придумать такой костыль какому-то говнокодеру. Это на скорости\памятипотреблении микроконтроллера только бы отрицательно сказалось.
              Ответить
              • > Красота ещё и улучшит производительность.

                Ага, и спасет мир... Знаем, плавали. Понимабельность низкоуровневого кода улучшают комментарии и только они. А строка Bin<101110101101010> выглядит столь же красиво и понятно как и 0b101110101101010 или 0x5D6A. И если у тебя в коде объявлено столько констант, что перевод их в другую систему занимает больше времени, чем флейм здесь, то архитектору нужно руки оторвать. Не, ну серьезно - в этой теме текста в 100500 раз больше, чем в perl-скрипте, который бы перевел все константы в исходниках из вида 0bXXXX... в вид 0xXXXX... (если компилятор на это не способен).
                Ответить
                • показать все, что скрыто>Понимабельность низкоуровневого кода улучшают комментарии и только они.
                  Про самодокументирующийся код не знаете? ок.

                  >А строка Bin<101110101101010> выглядит столь же красиво и понятно как и 0b101110101101010 или 0x5D6A.
                  Ну Bin<101110101101010> это костыль, поэтому я не предлагаю его использовать. Нужен просто нормальный стандарт языка, дабы исключить такие костыли.

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

                  >perl-скрипте, который бы перевел все константы в исходниках из вида 0bXXXX... в вид 0xXXXX...
                  Тоже костыль.

                  >(если компилятор на это не способен).
                  Да в том то и проблема языка.


                  Но автора данного ГК я не оправдываю.
                  Ответить
                  • > Про самодокументирующийся код не знаете?
                    Знаю, пишу. Ынтерпрайз сектор, где накладные расходы на красивую архитектуру бизнес-логики пренебрежимо малы по сравнению с основными задачами.

                    > Да в том то и проблема языка.
                    Прежде всего, это проблема того, кто делает из этого проблему. Лично я предпочитаю задавать битмапы hex-ом, даже если пишу под gcc. Это даже удобнее, ибо биты сразу рабиты на блоки по 4.
                    Ответить
                    • >Знаю, пишу
                      А говорите в комменте выше так, как будто не знаете.

                      >накладные расходы на красивую
                      Только не нужно мне говорить, что из-за 0b011001 возрастут накладные расходы. Они возрастают, если писать так, как написал автор данного говнокода.

                      >я предпочитаю задавать
                      Это, исключительно дело вкуса и выполняемых вами задач.

                      >Это даже удобнее, ибо биты сразу рабиты на блоки по 4.
                      Это далеко не для всех задач удобно. Часто в мк io-порт делится не на 2 части.
                      Ответить
          • > О понятиях декларативности, самодокументирующемся коде, ты конечно же слышал?

            Это же Си!
            ТОЛЬКО ХАРДКОД!!! ТОЛЬКО ХАРДКОР!!!
            Ответить
            • Да ладно, даже на Си можно писать понятный и красивый код. Также как на Pascal можно писать невменяемую кашу. Правда, в Сях способов написать невменяемую кашу на порядок больше....
              Ответить
              • Ну это-то само собой понятно, но короче, в общих чертах, примерно вот как-то так, так сказать.
                Ответить
        • показать все, что скрыто>число влезает в uint64_t
          >написать LL в конце?
          >число из говнокода можно определить не менее чем тремя другими способами
          Зачем говорить очевидные вещи? Я знаю, что автор кода - говнокодер.
          Ответить
        • показать все, что скрыто>если ты настолько туп, что не можешь каждые 4 бинарных разряда переписать как один шестнадцатеричный

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

        >compile-time переводчик?
        Пример приведете? Что-то типа: Bin<UINT64,'1','0','0','1'...> ? Неудобно же. Прятать в макрос? Все равно это в лучшем случае Bin(UINT64,1,0,0,1...). Неудобно.
        Ответить
      • >запомнить 16 вариантов для каждого символа в 16ричной системе счисления ой как не сложно
        Это очевидное решение, которое первым приходит в голову, но это не удобно. За меня такое вполне может сделать компиль.

        >бинарное значение можно в комменте дописать.
        Ага, а после рефакторинга бинарное значение в комменте начнет отличаться от реального и будешь ловить ошибки и батхерт, пытаясь найти место появления ошибки.
        Ответить
    • ну и срааач...
      Ответить
    • мне было интересно таки решить эту задачу compile-time
      ругайте
      http://pastebin.com/seuTAXR6
      Ответить
    • AnimeGovno-_- конечно мудак, но я тоже считаю, что в c/c++, и в любом другом языке, нужна возможность записи чисел в двоичной форме.
      Ответить
      • В каком, например, любом другом языке, есть эта возможность ?
        Кроме ацма MSC 51 ничо не вспоминается.
        Ответить
        • В старом добром Бейсик-Вильнюс на БК-0010-01 такая возможность была :).
          &Bxxx - двоичные,
          &Oxxx - восьмеричные,
          &Hxxx - шестнадцатеричные.
          И, как уже было тут упомянуто, в некоторых компиляторах c/c++ это есть, например, в Tiny C.
          Ответить
        • Perl, Python, Ruby,..
          Ответить
    • уныло
      Ответить
    • Мой код благодаря тебе, самый популярный после твоего за весь месяц.
      Ответить
    • Товарищи, разыскивается аниме-говно. Признавайтесь, кто его знает?
      Ответить
    • Такой-то срач был, а в C++11 взяли и ввели 0b.
      Ответить

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