- 1
unsigned long long int value=Bin<unsigned long long int>("1111111111111111111111111111111111111111111111111111111111111111");
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+991
unsigned long long int value=Bin<unsigned long long int>("1111111111111111111111111111111111111111111111111111111111111111");
AnimeGovno-_- 02.11.2011 23:10 # −8
И как после этого Си и С++ можно использовать как низкоуровневый язык для контроллеров? Одни тормоза и пустая трата памяти на строки бинарных чисел.
defecate-plusplus 02.11.2011 23:45 # +6
говнокод в сабже намекает, что требуемое число влезает в uint64_t
в чем проблема то? написать LL в конце?
даю подсказку - число из говнокода можно определить не менее чем тремя другими способами
AnimeGovno-_- 03.11.2011 00:15 # −3
О понятиях декларативности, самодокументирующемся коде, ты конечно же слышал?
И выполнять часть работы компилятора, ты видимо считаешь, почетным делом?
defecate-plusplus 03.11.2011 00:45 # +2
и да, если уж говорить о бинарных числах для контроллеров - расскажи, зачем необходимо объявить именно 0b01001110, а не 0x4e. Что за самодокументирующийся хардкод? А потом удивляются, почему у нас такая мощная тихоокеанская группировка спутников
AnimeGovno-_- 03.11.2011 10:10 # −2
Cи пригоден, но добавить бинарную форму записи числа в язык, используемый для программирования контроллеров, просто необходимо.
Хоть создатели gcc об этом догадались.
>зачем необходимо объявить именно 0b01001110, а не 0x4e
Например, битовые маски, установленные сигналы и тд. Очень часто в контроллерах на один и тот же порт параллельно приходится вешать много различных устройств, например на 8ми битах порта висит 5 устройств, каждому выделены свои биты.
defecate-plusplus 03.11.2011 10:21 # −1
только баклан будет писать 0b01001110 чтобы передать заданному набору устройств сигнал
синтаксический сахар в виде 0b... нужен либо ленивым, либо неграмотным
AnimeGovno-_- 03.11.2011 10:27 # −6
Да, чувак, клево делать таким образом битовую маску под device2, а потом таким же образом под все остальные девайсы
defecate-plusplus 03.11.2011 10:29 # 0
теоретик?
AnimeGovno-_- 03.11.2011 10:31 # −5
defecate-plusplus 03.11.2011 10:35 # 0
к.о. какбе намекает, что она может быть непростой только по одной причине - в ней есть независимые области, каждая из которых что то да значит
никакой разницы в самодокументируемости между 0b01001110 и 0x4e нет совсем, они равноправны с этой точки зрения
а вот хардкодить такие вещи в любом проекте, не только для приведённых тобой "низкоуровневых микроконтроллеров" - плохой зайка
если маска сложная, разбей её на логические части, следующие из целей этих частей, и пиши код в виде value1 & block1_mask | value2 & block2_mask
не делай за компилятор его работу, а программист, который будет разбираться че за хуйня это ваше 01001110, тебе спасибо скажет
AnimeGovno-_- 03.11.2011 11:00 # −4
Ты из XML собрался загружать, если не хардкодить что ли на контрллере?
AnimeGovno-_- 03.11.2011 11:02 # −4
device2 = 1 << 1 | 1 << 2 | 1 << 3 | 1 << 5 | 1 << 7;
Вот, я это сделал. Получилось говно. Один девайс - одна маска.
defecate-plusplus 03.11.2011 11:24 # 0
что означают эти биты? каждый из них?
это id устройства? это маска? что это?
AnimeGovno-_- 03.11.2011 11:27 # −4
Остальные биты относятся к другим устройствам.
Я так и понял, что вы низкоуровневым программированием не занимались. :\
roman-kashitsyn 03.11.2011 11:33 # 0
Интересная у вас логика.
Приходилось работать в проекте, где была куча подобного кода, и у меня был жуткий баттхёрт по этому поводу. Подобные куски были разбросаны тут и там, часто встречалась копипаста. Понять без поллитры такие вещи мог только автор кода.
В том случае можно было инкапсулировать логику в нескольких макросах, и код стал бы гораздо более понятным и читаемым.
AnimeGovno-_- 03.11.2011 11:46 # −6
В высокоуровневом программировании это бы и у меня вызвало батхерт. А в программировании контроллеров по другому особо не сделаешь. Ограничения платформы.
>В том случае можно было инкапсулировать логику в нескольких макросах
А кто запрещает? Поддержка бинарного формата чисел не мешает инкапсулировать логику в макросы или функции.
roman-kashitsyn 03.11.2011 11:50 # +1
стек протоколов SS7 в OSE-Delta. Не особо высокий уровень.
По мне так C даёт достаточно средств, чтобы даже самый, казалось бы, низкоуровневый код выглядел читабельно и работал при этом достаточно эффективно.
AnimeGovno-_- 03.11.2011 11:59 # −5
Кстати, на каком то контроллере видел библиотеку с набором макросов, который позволяет задавать числа в бинарной форме, не смотря на ограничение компилятора. Ни это ли костыли? Не это ли глупо? Почему это до сих пор не внесли в стандарт языка?
roman-kashitsyn 03.11.2011 12:06 # +1
Отсутствие бинарной формы - не самый большой недостаток языка C.
AnimeGovno-_- 03.11.2011 12:11 # −4
>Отсутствие бинарной формы - не самый большой недостаток языка C.
Я понимаю. :(
defecate-plusplus 03.11.2011 11:33 # 0
вывод неверный
defecate-plusplus 03.11.2011 11:39 # 0
почему она не сплошная? может есть какая то разумная причина, по которой в маске есть дырки в середине? мне кажется, от нас что то скрывают
может эту разумную причину стоит кодить разумным образом, а не хардкодом?
AnimeGovno-_- 03.11.2011 11:54 # −5
Это вопрос к схематехниками, а не к программистам. Может напутали чего. Или напутали, но серию устройств уже выпустили и переделывать не станут. Или были зарезервированные биты, потом чтобы не переразводить устройство или не пересобирать устройство - использовали этот зарезервированный бит. По хорошему биты должны стоять вместе, но реальность диктует свои условия. Часто заменить все устройства у заказчика или пересобрать дороже, чем добавить пару строк кода, немного усложнив код, вынеся бит отдельно от всех остальных битов устройства.
defecate-plusplus 03.11.2011 11:59 # 0
меня просто умилили набросы в стиле "поэтому си невозможно использовать для низкоуровневого языка", 40 лет возможно и удобно, а тут бида бида
AnimeGovno-_- 03.11.2011 12:03 # −6
Где я такое написал? Регулярно использую. И вообще, я вас конечно понял, но предложение похоже на несвязанный бред.
>тогда не вижу принципиальной разницы между #define device2_mask 0x4e и #define device2_mask 0b...,
А разница есть и это большинству очевидно.
defecate-plusplus 03.11.2011 12:07 # +1
> И как после этого Си и С++ можно использовать как низкоуровневый язык для контроллеров?
AnimeGovno-_- 03.11.2011 12:10 # −4
>поэтому си невозможно использовать для низкоуровневого языка
Язык Си не возможно использовать для низкоуровнего языка. На си написано столько компиляторов низкоуровневых языков, что тебе и не снилось. Не нужно меня обвинять в своем бреде.
defecate-plusplus 03.11.2011 12:12 # 0
но у спортсмена обязательно будет еще одна бонусная попытка
AnimeGovno-_- 03.11.2011 12:18 # −5
Ты ещё школьный курс русского языка не закончил? Это семантическая ошибка, а не орфографическая.
defecate-plusplus 03.11.2011 12:21 # +2
AnimeGovno-_- 03.11.2011 12:28 # −6
Вам? От всего.
guest 04.11.2011 19:15 # 0
AnimeGovno-_- 03.11.2011 11:48 # −4
ввод или\и вывод на устройство производится через них.
AnimeGovno-_- 03.11.2011 11:03 # −5
Покажи код на примере с дивайсами
AnimeGovno-_- 03.11.2011 11:13 # −5
guestGovno 03.11.2011 10:22 # +1
AnimeGovno-_- 03.11.2011 10:28 # −5
Я бы посмотрел, как ты это написал через битовые поля
guestGovno 03.11.2011 11:40 # +1
Порядок бит, говорят, зависит от реализации, но мы же, программируя микроконтроллер, воспользуемся компилятором, генерирующим код для этого микроконтроллера, в котором этот порядок так или иначе определён.
AnimeGovno-_- 03.11.2011 12:15 # −6
something.mean2 = 1;
Фи. Хочу
const char cm=0b101;
...
something.mean=cm;
, а не по отдельности все биты устройства выставлять или читать. Так придется править код везде, где я общаюсь с mean, если у неё появятся новые биты или они перекочуют.
AnimeGovno-_- 03.11.2011 13:22 # −7
guestGovno 03.11.2011 18:30 # +1
AnimeGovno-_- 03.11.2011 18:32 # −6
У меня это ключевое слово в кавычках не случайно. Семантически reinterpret_cast в Си есть, только используется по другому.
AnimeGovno-_- 03.11.2011 18:42 # −4
Костыль. Во время компиляции вообще проверки на совпадение типов не будет. Это как минимум, дает лишние места для возможных ошибок.
На производительности и объёмах занимаемой памяти - использование структур, битовых полей и приведений типов сказывается отрицательно. Иногда для контроллеров это не допустимо.
guest 04.11.2011 19:18 # +3
AnimeGovno-_- 04.11.2011 19:24 # −5
AnimeGovno-_- 04.11.2011 19:51 # −3
guestGovno 03.11.2011 13:27 # 0
...
> а не по отдельности все биты
А это было не по отдельности?
> если у неё появятся новые биты или они перекочуют.
А все const char-ы не придётся пересматривать в таком случае? В случае структур нужно будет переставить местами поля в определении. А если захардкодить — тогда беда.
something_type something_special;
something_special.mean1 = 1;
something_special.mean2 = 1;
...
memcpy(something_dst, something_special, sizeof(something_special));
А ещё, скажу по секрету, для этих действий можно сделать функции с говорящими названиями, и абстрагироваться от внутреннего устройства, если, конечно, хочется грасоты.
AnimeGovno-_- 03.11.2011 14:05 # −5
Это маска, а не биты. Вы просто забыли, что такое маска или вам никогда ей не приходилось пользоваться.
>А все const char-ы не придётся пересматривать в таком случае?
Константы в одном месте и их не так много. Это не весь гигантский код проекта пересмотреть. За этим константы и заводят, для легкости рефакторинга.
>something_special.mean1 = 1;
something_special.mean2 = 1;
Я уже сказал, что это не удобно и требует изменять код в многих/нескольких местах в случае необходимости каких-то изменений.
>memcpy(something_dst, something_special, sizeof(something_special));
Так отправлять данные в порт ввода/вывода нельзя.
>А ещё, скажу по секрету
Я уже это сказал много выше.
guestGovno 03.11.2011 14:21 # 0
Это мощно.
something_special создаётся в одном месте, потом используется по мере необходимости.
А с memcpy косяк, да. Действительно же нельзя так в порт. Ну вот, вся затея к чертям, увы мне.
Только...
если...
может быть...
... out вместо memcpy?... нет, это было бы слишком очевидно.
Ах да, у out же нет третьего параметра. Опять ничего не получается, обидно.
AnimeGovno-_- 03.11.2011 14:38 # −6
Если вы не поняли, то я говорил про маску информационных битов, а не про информационные биты.
guestGovno 03.11.2011 18:32 # 0
да, 0b.... было бы замечательно, но его нет. Увы. Но можно и вот так. Ага.
AnimeGovno-_- 03.11.2011 18:53 # −5
Я уже показал, что это не работает нормально с разнесенными битами одного устройства.
Требует приведений типов, что костыльно, если можно было сделать по человечески.
AnimeGovno-_- 03.11.2011 14:40 # −5
Он отправляет только целочисленные типы, а не структуры.
Вообще, обычно он не используется в мк, а порты оформляются в виде переменных целочисленного типа для удобства.
SIGSEGV 03.11.2011 10:49 # +3
> использовать как низкоуровневый язык для контроллеров...
Ты уж определись - либо к умным, либо к красивым.
Lure Of Chaos 03.11.2011 10:57 # +1
вот как интеллигентно обозвать мартышкой = )
AnimeGovno-_- 03.11.2011 11:09 # −6
И туда и туда. Какие у тебя противоречия возникают? Сделать при программировании контроллера более читабильный код, если это не повредит производительности, можно и нужно.
Красота ещё и улучшит производительность. Посмотри на код выше - там строка, а это уже идиотизм. Пришлось придумать такой костыль какому-то говнокодеру. Это на скорости\памятипотреблении микроконтроллера только бы отрицательно сказалось.
SIGSEGV 03.11.2011 17:24 # 0
Ага, и спасет мир... Знаем, плавали. Понимабельность низкоуровневого кода улучшают комментарии и только они. А строка Bin<101110101101010> выглядит столь же красиво и понятно как и 0b101110101101010 или 0x5D6A. И если у тебя в коде объявлено столько констант, что перевод их в другую систему занимает больше времени, чем флейм здесь, то архитектору нужно руки оторвать. Не, ну серьезно - в этой теме текста в 100500 раз больше, чем в perl-скрипте, который бы перевел все константы в исходниках из вида 0bXXXX... в вид 0xXXXX... (если компилятор на это не способен).
AnimeGovno-_- 03.11.2011 18:37 # −6
Про самодокументирующийся код не знаете? ок.
>А строка Bin<101110101101010> выглядит столь же красиво и понятно как и 0b101110101101010 или 0x5D6A.
Ну Bin<101110101101010> это костыль, поэтому я не предлагаю его использовать. Нужен просто нормальный стандарт языка, дабы исключить такие костыли.
>И если у тебя в коде объявлено столько констант, что перевод их в другую систему занимает больше времени, чем флейм здесь, то архитектору нужно руки оторвать.
Это верно только для высокоуровнего кода, а не для кода для мк.
>perl-скрипте, который бы перевел все константы в исходниках из вида 0bXXXX... в вид 0xXXXX...
Тоже костыль.
>(если компилятор на это не способен).
Да в том то и проблема языка.
Но автора данного ГК я не оправдываю.
SIGSEGV 03.11.2011 21:24 # 0
Знаю, пишу. Ынтерпрайз сектор, где накладные расходы на красивую архитектуру бизнес-логики пренебрежимо малы по сравнению с основными задачами.
> Да в том то и проблема языка.
Прежде всего, это проблема того, кто делает из этого проблему. Лично я предпочитаю задавать битмапы hex-ом, даже если пишу под gcc. Это даже удобнее, ибо биты сразу рабиты на блоки по 4.
AnimeGovno-_- 03.11.2011 21:52 # −4
А говорите в комменте выше так, как будто не знаете.
>накладные расходы на красивую
Только не нужно мне говорить, что из-за 0b011001 возрастут накладные расходы. Они возрастают, если писать так, как написал автор данного говнокода.
>я предпочитаю задавать
Это, исключительно дело вкуса и выполняемых вами задач.
>Это даже удобнее, ибо биты сразу рабиты на блоки по 4.
Это далеко не для всех задач удобно. Часто в мк io-порт делится не на 2 части.
TarasB 09.11.2011 13:57 # −1
Это же Си!
ТОЛЬКО ХАРДКОД!!! ТОЛЬКО ХАРДКОР!!!
roman-kashitsyn 09.11.2011 14:04 # +1
TarasB 09.11.2011 14:16 # 0
AnimeGovno-_- 03.11.2011 00:19 # −5
>написать LL в конце?
>число из говнокода можно определить не менее чем тремя другими способами
Зачем говорить очевидные вещи? Я знаю, что автор кода - говнокодер.
AnimeGovno-_- 03.11.2011 11:17 # −5
Обычно только тупые делают ту работу, которую можно автоматизировать.
AnimeGovno-_- 03.11.2011 11:15 # −7
AxisPod 03.11.2011 13:38 # 0
AnimeGovno-_- 03.11.2011 13:57 # −7
Да на С++ то ладно, через шаблоны. Ещё возможно. Но вот на C для контроллеров то как быть? Хотя, как я уже и говорил, в одном компиле я видел библиотеку костыль на макросах, что позволяла записывать в бинарной форме числа, но если это так нужно, то зачем костыли? Не помню, как там это было реализовано и как это можно использовать.
>compile-time переводчик?
Пример приведете? Что-то типа: Bin<UINT64,'1','0','0','1'...> ? Неудобно же. Прятать в макрос? Все равно это в лучшем случае Bin(UINT64,1,0,0,1...). Неудобно.
AxisPod 03.11.2011 14:25 # 0
Bin<10111010,01101010> и т.д., параметров может быть и разное кол-во.
AnimeGovno-_- 03.11.2011 14:41 # −6
Согласен.
defecate-plusplus 03.11.2011 15:13 # 0
AnimeGovno-_- 03.11.2011 15:29 # −6
Для исправления этой оплошности как раз и предложили написать Bin<...> (естественно, написать его нужно правильно).
defecate-plusplus 03.11.2011 16:01 # 0
http://pastebin.com/L86GBMYq
продолжение доделайте сами, у меня короткий день
AnimeGovno-_- 03.11.2011 16:14 # −5
Ты понял соль. Я о том же. А ведь банально можно было добавить в язык 0b101011
guestGovno 03.11.2011 18:37 # 0
AnimeGovno-_- 03.11.2011 18:44 # −7
2)На С++ микроконтроллеры тоже программируют, на тот случай, если ты ещё не знаешь.
gegMOPO4 06.11.2011 20:02 # +2
absolut 09.11.2011 09:25 # 0
gegMOPO4 09.11.2011 09:43 # 0
absolut 09.11.2011 13:47 # 0
AnimeGovno-_- 03.11.2011 14:00 # −3
Это очевидное решение, которое первым приходит в голову, но это не удобно. За меня такое вполне может сделать компиль.
>бинарное значение можно в комменте дописать.
Ага, а после рефакторинга бинарное значение в комменте начнет отличаться от реального и будешь ловить ошибки и батхерт, пытаясь найти место появления ошибки.
gegMOPO4 06.11.2011 20:03 # 0
Lure Of Chaos 03.11.2011 19:04 # +2
defecate-plusplus 03.11.2011 23:59 # +1
ругайте
http://pastebin.com/seuTAXR6
AnimeGovno-_- 04.11.2011 00:37 # −6
koodeer 04.11.2011 17:28 # +4
guest 04.11.2011 19:23 # 0
Кроме ацма MSC 51 ничо не вспоминается.
koodeer 04.11.2011 21:48 # +1
&Bxxx - двоичные,
&Oxxx - восьмеричные,
&Hxxx - шестнадцатеричные.
И, как уже было тут упомянуто, в некоторых компиляторах c/c++ это есть, например, в Tiny C.
bugmenot 05.11.2011 00:56 # 0
absolut 05.11.2011 10:12 # 0
Lure Of Chaos 05.11.2011 11:39 # −1
это багминот так приветствует
guest 05.11.2011 11:52 # 0
ВОН!
gegMOPO4 06.11.2011 20:08 # 0
jabber 07.11.2011 00:18 # −1
nbvec222 08.11.2011 17:35 # −1
guest 08.11.2011 17:37 # +1
guest 08.11.2011 17:42 # +1
guest 08.11.2011 17:43 # 0
guest 08.11.2011 17:47 # 0
guest 08.11.2011 17:51 # 0
gost 07.10.2015 16:53 # +1