Это копия, сохраненная 22 марта 2021 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Пожалуйста, пользуйтесь https://ideone.com/, https://wandbox.org/ или https://pastebin.com/ для вставки кода, если он длиной больше нескольких строк или содержит [i] или ∗.
Что читать:
- Brian Kernighan, Dennis Ritchie "The C Programming Language": http://www.cypress.com/file/56651/download
- Stephen Prata "C Primer Plus, 6th Edition" (2014): относительно свежая, знает про C89/C99/C11, описывает различия, объемная (около тысячи страниц), годная, с вопросами, упражнениями и ответами. Читать после K&R или до.
- Zed A. Shaw "Learn C the Hard Way" (2015): годное пособие для гуманитариев для гуманитариев!
- Немного примеров хорошего стиля: http://www.oualline.com/books.free/style/index.html
- ООП, например: http://www.cs.rit.edu/~ats/books/ooc.pdf
- Стандарт ISO/IEC 9899:1999 (C99): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf (драфт)
- Стандарт ISO/IEC 9899:2011 (C11): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf (драфт)
- Черновик стандарта ISO/IEC 9899:202x (C2x): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2479.pdf (февраль 2020, с диффами)
Чем компилировать:
- Очевидный GCC.
- clang: оче годно, батя рекомендует.
- Intel C++ Compiler: оптимизации, тысячи их.
- Visual Studio Community Edition: внезапно этим стало можно пользоваться, особенно с тулсетом clang/C2. Поддержка C11 на уровне "есть все, что тебе понадобится в реальном проекте плюс кривая библиотека". Анализатор кода в комплекте.
- Pelles C (шиндоуз онли): поучиться, вкатиться в C11 (стандарт полностью реализован, имеются в том числе threads.h и прочие stdatomic.h), но количество багов в оптимизаторе и редкие апдейты напрочь отбивают желание собирать этим что-то сколько-нибудь серьезное.
- TCC: очень маленький компилятор с багами и поддержкой C99. С ключом -run умеет компилировать код в память и запускать его, что позволяет писать скрипты прямо на сишечке.
Что еще почитать:
http://c-faq.com/
FAQ из comp.lang.c. Древний, но все еще актуален.
Samuel P. Harbison, Guy L. Steele Jr. "C: A Reference Manual, 5th Edition" (2002)
Ебаный пересказ стандартов C89 и C99 (включая стандартную библиотеку). Для не осиливающих стандарт в оригинале. Читать в качестве подготовки к собеседованиям (есть задачник с ответами) и для ознакомления с масштабами пиздеца перед написанием своего парсера/компилера.
Peter Van Der Linden "Expert C Programming. Deep C Secrets" (1994)
"Си: грязные истории". Смехуечки, немного объяснений, чем обусловлены особенности языка, всем известные подводные камни кто там ругал косяки в JS? у нас в сишечке их гораздо больше, просто они лучше спрятаны, немного байтоебли и непонятно откуда взявшаяся глава про старинные плюсы. Читать в качестве сказки на ночь (на пару вечеров хватит).
Richard M. Reese "Understanding and Using C Pointers. Core Techniques for Memory Management" (2013) - почитать, вкатиться в указатели.
Ben Klemens "21st Century C: C Tips from the New School" (2012)
Paul Deitel, Harvey Deitel "C for Programmers with an Introduction to C11" (2013)
Stephen G. Koch@n "Programming in C (3rd Edition или 4th Edition, если найдется)" (2014)
MISRA Ltd. "Guidelines for the Use of the C Language in Critical Systems" (2013)
Набор рекомендаций по написанию надежного кода на C (промышленный стандарт). Читать - однозначно, следовать - вдумчиво и без фанатизма. Также можно посмотреть https://www.securecoding.cert.org/confluence/display/c/SEI+CERT+C+Coding+Standard и http://web.archive.org/web/20190213011655/homepages.inf.ed.ac.uk/dts/pm/Papers/nasa-c-style.pdf
Еще более длинный список: http://www.iso-9899.info/wiki/Books#Learning_C
https://github.com/kozross/awesome-c
Онлайн-утилиты:
- https://godbolt.org/ - Compiler Explorer позволяет посмотреть выхлоп компиляторов для введенного куска кода (больше полусотни разных версий компиляторов).
- http://cdecl.org/ - С Gibberish ↔ English помогает читать сложные сишные декларации.
Прошлые треды:
- №58: http://arhivach.ng/thread/573804/
- №59: http://arhivach.ng/thread/597021/
- №60: http://arhivach.ng/thread/610540/ >>1772290 (OP)
Ну и где там маньки, которые в 59 треде рассказывали, что главное "ко-ко-ко стандарт" и приоритет арифметических операций не нужно указывать скобками?
Сосите, вот правило MISRA C, доказывающее, что вы не правы.
Ты опять выходишь на связь? Давай повторю еще раз для дебила: MISRA C - это такие рекомендации, как писать код для хуйни, которая может ебнуть. Или убить кого-то. Весь остальной код пишут, руководствуясь принципами здравого смысла, с которым, как мы уже выяснили, у тебя проблема.
Так вот в этом нормальном коде принято оборачивать в скобки только неоднозначные случаи (классическое & vs. << и прочие), условие в тернарном операторе, все переменные в макросах, ну и, конечно, те выражения, в которых нужно изменить приоритет операторов. Причем в первых двух случаях порядок вычисления все равно гарантируется стандартом, просто его мало кто помнит, да и читать удобнее.
>MISRA C - это такие рекомендации, как писать код для хуйни, которая может ебнуть. Или убить кого-то.
Ага, а если пишешь, код не для медицинских приборов, промышленности, или автомобиля, то можешь говнокодить, как хочешь. Мы тебя поняли, маня.
>остальной код пишут, руководствуясь принципами здравого смысла
>в этом нормальном коде
Вот есть свод правил MISRA C, а где можно почитать "принципы здравого смысла" и критерии "нормального кода"? Нигде, потому что это только твои маняфантазии.
>Так вот в этом нормальном коде принято оборачивать в скобки только неоднозначные случаи (классическое & vs. << и прочие), условие в тернарном операторе, все переменные в макросах, ну и, конечно, те выражения, в которых нужно изменить приоритет операторов.
Это сугубо твоё личное, ничем не подкрепленное, мнение. В MISRA C сказано не использовать приоритет операторов. Я думаю, что те, кто разрабатывали правила MISRA C разбираются в программировании получше маньки с Двача.
Бтв поясните за эти ваши стандарты, как вкатиться правильно и на каком этапе изучения, на какой(ие) отдать больший приоритет.
>Какие подводные?
В том, что зумерки с этого итт треда, дрочащие на стандарт будут тебя хейтить, ведь надо наизусть знать стандарт, знать приоритеты операций и никогда не использовать скобки. По мнению зумерков (залетевших сюда с хабра) для хайпового и модного кода в коде вообще нигде не должно быть скобок, а иначе ты "не в теме", "не знаешь стандарт", "не сечешь фишку".
Ведь им важнее выебнуться знанием стандарта друг перед другом, чем писать понятный и надежный код.
Ясно, хуета. Продолжу писать как и писал. Но инфы про стандарты вы мне всё таки доставьте бажожда.
В шапке есть инфа. Собсно, 3 стандарта (С99, С11 и черновик с 202x), и Прата, которая объясняет стандарты и различия между ними.
>Прата
О, норм. Его и читаю. А стандарты эти читать тупо от корки до корки и будет мне счастье? А что эта ваша MISRA? Её стоит навернуть?
> можешь говнокодить, как хочешь
Я этого не говорил.
> где можно почитать "принципы здравого смысла" и критерии "нормального кода"
В стайлгайде софта, который ты пишешь. Внезапно, да?
> В MISRA C сказано не использовать приоритет операторов
А еще там сказано ни в коем случае не использовать маллок. Не используй маллок и библиотеки, использующие маллок, иначе у тебя будет говнокод, по твоим же словам.
>>787028
> как вкатиться правильно и на каком этапе изучения
Читать стандарт полностью не нужно, это для разработчиков компиляторов. А вот конкретные неясные моменты смотреть стоит сразу, если не написано в учебнике (у Праты, например, на большинство твоих вопросов уже будут ответы).
Там лисп вообще ни при чём
Мизру не наворачивай. Это мем, который в индустрии не используют. К ней референсится полтора независимых аудитора во в трёх странах мира. И то только на очень специфических проектах. Отсутствие стандартизации в индустрии собственно и является причиной по которой она не взлетела.
Если твои мат.операции выполняются с плавающей точкой, то группировать их желательно по соображениям точности или возможности параллельного вычисления, а не логически.
Алсо если ебнет, то компиль виноват, что стандарт не поддерживает?
>>787021
>Оборачиваю все мат. операции в скобки по логическим блокам чисто для удобочитаемости.
А не лучше отделить пробелами или оттабулировать, чем засирать всё скобками?
А для чего нужен Си в 2к20(с целью получения работы и зарабатывания денег)? Только микроконтроллеры прогать и всё?
Да, в целом в эмбедщине много С, ибо компиляторы С есть на все возможные платформы, даже самые экзотические. Ну и сам язык суперкомпактный и считай, что ты вообще чуть ли не на кроссплатформенном Ассемблере пишешь.
Почему ты это так говоришь, будто программирование мкк - это что-то плохое? Как по мне, куда интереснее, чем веб-макакерство.
> IEEE 754-2019.
Тебе сам стандарт или реализацию.
Если что, я ищу просто реализацию IEEE 754 на Си. Желательно старую, времён Turbo C.
> в индустрии не используют
Используют, как дополнительный источник предупреждений. Точно так же, как и с остальными предупреждениями вменяемое правят, невменяемое давят.
>>787440
> если ебнет, то компиль виноват, что стандарт не поддерживает
Ни разу не видел настолько сломанных компиляторов. Приоритеты же к грамматике прибиты, и чтобы облажаться, надо специально, вручную написать неправильный парсер.
>>787708
> Если что, я ищу просто реализацию IEEE 754 на Си
softfloat загугли, тысячи их. Эмуляторы времен доса тоже гуглятся, но они не на Си. В линуксе /arch/x86/math-emu еще.
mapper?
>Почему ты это так говоришь, будто программирование мкк - это что-то плохое? Как по мне, куда интереснее, чем веб-макакерство.
Собсно, в этом и была суть моего поста: зачем в 2к20 учить Си? Только чтобы прогать микрики за еду, и всё?
Сам подумай, что лучше:
1) прогать мк в неотапливаемой (зимой) и некондиционируемой (летом) комнате за 30-40к всю жизнь без перспектив;
2) стать веб-макакой, прогать в комфортабельном офисе с кофемашиной и печеньками за 60к, при этом есть перспективы карьерного роста в мидла, синьора и потом трактора.
Если тебе так уж интересна электроника и мк, то будучи веб макакой это может быть твоим хобби. Но выбирать это профессией с целью зарабатывания денег - большая ошибка.
Он и ищет реализации стандарта в компиляторах (в библиотеке). У меня на первом 386 компе тоже не было аппаратных флоатов например.
Ты просто живешь в другом измерении, к твоему сожалению. В парашке беда с лоу-лвльщиной, да. Забугром эмбедщина - элитная айти специальность, где и офисы заебись, и з.п. на уровне. Или ты хочешь сказать, что в конторах, которые производяя железо, типа Quallcom, Mellanox, Marvell, Nvidia, Xilinx, Tesla и т.п. и в которых больше половины софтвер инжиров являются хардкорными байтослесарями, душные и ободранные офисы?:) Хочешь работать в лоу-лвльщине и получать достойную зарплату - заводи трактор и учи ин.яз. В противном случае, жри говно js на веб-макакерской работе и живи в манямирке, типа ты ОЙТИ ИЛИТА(нет)
>кофемашиной и печеньками за 60к, при этом есть перспективы карьерного роста в мидла, синьора.
Ты сначала этого уровня добейся будучи 1 из тысячной армии ежедневных вкатышей-индусов, потом уже о тракторе мечтай. Будешь как миленький сидеть и до конца жизни хуярить лендинги о мазях для увеличения члена.
>потом трактора
Как эта болезнь называется? Школьники до сих пор верят в рай в европидарахии и омериге?
Потеря веры в жизнь тут, даже у глупых школьников. Если это не настойчивый звоночек, то что тогда звоночек?
Так разница как раз в том, что 60к для веб-макаки - это днищеуровень свежеустроенного джуна-вкатуна, который еще и хрюша на ставку в словесной дуели наебала.
В то время как для байтослесаря 60к - это уровень сеньера/ведущего программиста и для 60к нужно лет 5 кабанчиком горбатится, пока предыдущие диды-ведущие на пенсию не свалят.
Я 5 лет проработал в embedded разработке заграницей.
В индустрии уже лет 25.
Рай для железячников это Юго-Восточная Азия. Если хорошо разбираешься, то чего сразу Европа или США - попорбуй Южную Корею. Отличная страна. Только субботы часто рабочие и рабочий день с 9:00 до 21:00. В остальном - рай.
Ещё раз задам вопрос - нахуя кому-то брать тебя на 60к если индус сделает всё за 20? Что такого охуенного ты можешь предложить рынку чего не может предложить рспшка после курсов кокодемии? Может ты можешь выдавать 2 сайта в сутки? Или просто работать 24/7? И ты хочешь что-то доказать насчёт эмбедеда и лоулевела которые на западе испытывают острую потребность в грамотных кодерах коих нет. Причём настолько, что любой человек с опытом 3+ лет на этом самом эмбедеде может спокойно ехать в какую-нибудь Германию или Францию на 4-5к рейхсмарок ежемесячно, да тебя ещё и работодатель оближет помогая устроиться по началу и потом снимать/купить жильё.
Не думая променял бы свою Канаду на Японию, но язык учить никак не решусь. Зона комфорта душит что пиздец.
>softfloat загугли, тысячи их.
Спасибо!!!!
Первый же результат поиска показался мне примемлем - https://github.com/ucb-bar/berkeley-softfloat-3
Возможно где-то есть и поинтереснее, но это этот вполне норм. На досуге поиграюсь.
Ещё раз спасибо.
Забавно что на этот вопрос в теме про микроконтроллеры в разделе "Радиотехника" никто толком не ответил.
Это был самый лучший опыт в жизни. Самое интересное время. Это было интересно. Это была работа с железом, которое в продаже повилось только через несколько лет. Это был доступ к самой интересной закрытой документации и железа от ведущих производителей железа. Это была молодость и беззааботность.
>Конкуренции нет
>js мощный язык
>Самая востребованная сфера
>ЗП от нуля и до бесконечности
>Вкачусь за 3 месяца
>Через 2 года стану синьором а на 3 укачу в Калифорнию
Смотрю прс.
Ну всё так, в жс треде вон котопидор и прочие облизывающиеся и довольно урчащие фронтоебы и ни одной жалобы про конкуренцию с индусами на зп в 20к.
В то время как в этом треде байтослесари оправдываются что не на заводе работают, нинада троллить, а в НИИ/НПО работают.
>И ты хочешь что-то доказать насчёт эмбедеда и лоулевела которые на западе испытывают острую потребность в грамотных кодерах коих нет.
А вот их сейчас как раз целая ЮВА с Китаем и прочими корейскими гейшами.
Вот, заюзал gcc-8 на 64-битном Альт Линукс, в он не может в ключ -m32, пришлось портировать свою софтинку на 64-бита.
А тут засада - MSVC sizeof(long) = 4, gcc sizeof(long) = 8.
И привет #ifdefы
Не, я конечно заборю эту проблему, не в первый раз такое. Но забадывает поддержка нескольких платформ/компиляторов.
>Не, я конечно заборю эту проблему, не в первый раз такое. Но забадывает поддержка нескольких платформ/компиляторов.
<stdint.h >
<
s
t
d
i
n
t
.
h
>
В моём случае это не выход. У меня слишком специфичная задача, где руками по памяти приходится лазить и моделировать некоторые структуры. Опять же руками. Именно что в рантайме моделировать. Отсюда и сложность переноса.
Эм, так как раз stdint и был для таких задач сделан, что бы конкретные многобайтные типы там где нужно конкретные байтики конкретных форматов шевелить и гладить конкретные регистры с конкретным лейаутом..
Что значит не подходит?
>Что значит не подходит?
Блин, я интерпретатор пишу. Мне аргументы для printf приходится ручкаим формировать.
А к разным sizeof ещё добавляется calling conversion. MSVC и gcc аргмуенты функций на 64-х битах по-разному передают.
И это одна из немногих засад при портировании с 32-х бит на 64-бит.
>Python - самый популярный сегодня язык для Embedded.
>Путает embedded language и embedded systems
>язык для Embedded
>Путает embedded language и embedded systems
А может, ты? Lua, кстати, тоже там весьма популярен.
Нет ты. Точнее, стопудово ты, судя по упоминанию Lua, которая ни в один МК не влезет, кроме разве что топовых с распайкой внешней памяти.
>micropython
Причем, что характерно - именно для конкретных плат-радиоконструкторов на STM32 с конкретной разводкой, на голом МК его не применить, произвольную плату не развести, новое устройство не сделать.
>>788812
>>788804
>мк
Ты сука внатуре дебил, и не знаешь, что такое embedded language. Это язык, который можно встроить в свою систему, чтобы юзер мог дергать ее за сиськи на нем, а не хуитка для байтослесарей с двухкилобайтным сортиром вместо железа, лолка. А ембеддед в моем посте - это железячники во всех их проявлениях. Ваще разные две хуйни, я не ебу, к чему ты свои embedded languages приволок, аутист.
>не влезет
А openwrt влезет тогда? Или это не ембеддед-система, довн?
Акстися, на всяких роутерах, которые тоже ващет ембеддед, уже давно десятки мегабайт оперативы.
Это встраиваемая система нужна юзерам, очевидно.
А где я говорил про юзеров во встраиваемой системе, кстати?
> Как теперь вкатиться на работу расскажите?
Зависит от того, что хочешь делать. Но чтобы понимать, как выглядит мир за пределами стандартной либы, имеет смысл полистать какое-нибудь APUE, что-то нибудь вводное про сети (сокеты, libevent), про микроконтроллеры опять же.
Хочу на универсалычах уметь всё: и мк накодить и по для марсианского ровера и высокропроизводительный ии захуярить.
Не, нахуй. Я творец а не разрушитель. К тому же там всё уже написано до меня, вряд ли лучше сделаешь лол.
А ты не жопой читаешь, ты внатуре тупой.
Где там написано про ВСТРАИВАЕМУЮ систему? Там написано про просто систему, любую. А встраиваемый - язык.
Аноны, молю дайте мне ссылку на то как работают адреса в отличии от обычного обращения к переменной.
Ну я вот читал книгу по си там про адреса и там написано типа что адрес увеличивают скорость обращения к переменной или что-то такое, но конкретно не написано как это происходит и почему.
ОБЕЪЯСНИТЕ МОЛЮ ПОЧЕМУ ОБРАЩЕНИЕ ПО АДРЕСУ БЫСТРЕЕ ЧЕМ СТАНДАРТНОЕ ОБРАЩЕНИЕ К ПЕРЕМЕННОЙ
Бред, косвенное обращение не может быть быстрее. Быстрее может быть передача параметра в функцию.
> указатели работают быстрее
Тебе уже сказали, что бред.
> то есть ∗p = 7 быстрее чем p = 7 и я хочу знать почему?
∗p = 7 это mov регистр,[адрес p]; mov [регистр],7
p = 7 это mov [адрес p],7
Очевидно, что две инструкции, да еще с зависимостью по данным никак не могут быть быстрее одной.
хoрoшo прoебался. а зачем тoгда указатели?
я не так пoнял.
>ОБЕЪЯСНИТЕ МОЛЮ ПОЧЕМУ ОБРАЩЕНИЕ ПО АДРЕСУ БЫСТРЕЕ ЧЕМ СТАНДАРТНОЕ ОБРАЩЕНИЕ К ПЕРЕМЕННОЙ
проспись
Это временная алгоритмическая сложность. О(1) - константное время исполнения. Сразу видно вкатыша без высшего образования :-)
>и там написано типа что адрес увеличивают скорость обращения к переменной или что-то такое
Скорее всего, такой же грамотей, как ты, писал.
Не читайте советской макулатуры, уебки. И вообще на русском
Джвачую, все читаю, толтко на эстонском.
>Это временная алгоритмическая сложность
Говнокнута обчитался? Мохнатое О бля, думал уже это говно вышло из моды зумеров.
Слушай, у ВСЕХ компиляторов есть ключ, позволяющий формировать ассемблерный листинг. Более того, все компиляторы переводят код Си програмы в ассемблер, а уже ассемблер делает из него объектный файл, который линкуется с другими объектниками и библиотеками в исполняемый файл.
К чему я тебе это рассказываю? Напиши оба варианта присвоения и посмотри чего нагенерировал компилятор. Поверь, лучше один раз увидеть своими глазами, чем 100 раз услышать.
> все компиляторы переводят код Си програмы в ассемблер
Это, мягко говоря, не совсем правда. Далеко ходить не надо, у того же tcc парсер прямо по ходу разбора сразу генерирует машинный код, безо всяких промежуточных представлений. У шланга есть промежуточные представления, но он не обязательно пишет .s. У Visual C++ кодогенератор делает листинг только по запросу, а самому ему ассемблер в хуй не вперся. Плюс к этому всему добавляем сборку для LTO/LTCG, когда даже в объектники пишется промежуточное представление.
Поэтому правильнее сказать, что большинство компиляторов может сгенерировать тебе ассемблерный листинг, если попросишь.
ускoряется время кoмплияции тoлькo. указтели в oснoвнoм нужны кoгда нужна динамическая память. например динамический массив.
За всю свою многолетнюю практику ни разу не видел компилятор, у которого нет ключа для генерации ассемблера.
Тот же tcc... Хмм... А ведь вроде не умеет - https://man.cx/tcc(1)
В упор не вижу ключа -s и Гугл говорит:
>> 2. How to generate assembly program in tcc.
>You don't.
>The i386 and ARM targets use a function o() to write the opcodes as they appear in the binary. Use objdump -d if you need assembly output.
Ну да, выходит не все компиляторы умеют.
Ну тогда
objdump -S mycode.o | less
в помощь.
Он спросил что это означает, я ответил, причем здесь конкретно то, что ты высрал, ебанько?
Бля, плюсы != ООП, вот совсем. Я вообще редко классы какие-то прям в стиле java наматываю, в основном функции, структуры и легкие RAII оберточные классы.
Не всегда. Иногда байтослесари получают совсем голую железку, тогда надо писать HAL. Чаще всего уже существующий HAL крайне хуевый с не менее хуевой документацией - хоть свой пиши с нуля. Чаще требуется накатить ядро Линукса через Yocto. Если надо работать с кастомной железкой - скорее всего надо писать драйвер на нее, благо подсистемы в ядре Линукса значительно сокращают гемор и не надо совсем уж там битами жонглировать хотя порой таки надо
Сишечка популярнее плюсов в эмбедщине по большей части потому, что компилятор на С существует под все, даже самые экзотические платформы. А если нет - написать компилятор С гораздо, ГОРАЗДО легче и быстрее, чем компилятор плюсов. Ну и порой есть resource constraints довольно чумовые, даже в 2к20 году, где даже плюсы достаточно жирные (можно офк писать С-лайк код, но тогда зачем изначально пикать плюсы?) и меньше подходят. Ну и если в железке крутится ядро Линукса, что происходит в 90% случаев, то писать кастомные драйвера на периферийные устройства надо на С, ибо API да и вообще все ядро Линукса написано на С. А еще С - это грубо говоря кроссплатформенный ассемблер, ни больше, ни меньше, засим этот ЯП бессмертен в определенных нишах.
Вот насчёт компиляторов на разных платформах да, действительно. Худо-бедно рабочий компилятор с89 я и в одно рыло заделаю, но про плюсы даже не заикнусь просто пизда.
Плюсы ради шаблонов в основном хочется. Можно такой-то кавайный compile-time полиморфизм накидывать. Перегрузка аргументов в функциях, неймспейсы, nested struct/enum-ы, блямбды ёпту, да много мелочей, к которым привык и не хочешь терять. А на сишечке всё ручками делать. Хотя, когда железки теребишь, абстракции куда ближе к железкам, и таких потребностей, наверное, не возникает.
А ядро линупсовое лёгкое само по себе? Ну типа, сколько памяти занимает? Или его кастрировать при случае чего можно?
>Бля, плюсы != ООП, вот совсем
Чигобля?
>Я вообще редко классы какие-то прям в стиле java наматываю
Ну так и задумайся, на хуй тебе кресты если ты против ее парадигмы
Алсо переносимость может пострадать?
Кресты мультипарадигменные, братишка. Как хочешь, так и делаешь. Нахуй тебе плюсы, если ты джавку там разводишь? Фабрики бля, хуябрики. Вот джаву и бери.
>мультипарадигменные
Нет, это было нахлобучивание ООП над Си. Если ты там вместо cout пишешь printf ну или пишешь в процедурном стиле, то пора подумать. А Java это заебись.
Голое ядро в рантайме занимает мало места само по себе + из-за того, что это попенсорц, можно играться с конфигами ядра и собрать кастомное ядро под самые разные нужды. На абсолютное большинство железок заходит на ура. Лично я собирал без особой анальной акробатики ядро, которое в рантайме занимало 5 мегабайт (без кэшированной памяти офк, хотя Линукс гибкий и позволяет играться со многими параметрами).
printf я не пишу, но в с++20 его завезли как std::format, поэтому ещё успею.
Ты там себе навыдумывал стилей, концепций, каких-то ебать их в рот парадигм, но всё это по отдельности друг от друга дрянь страшная. Код пишется под каждую задачу по-своему, так, как оказывается удобнее. Если ты от этой свободы отказываешься в пользу сомнительных заявлений о том, что надо кодить каким-то определённым образом, хули я могу сказать, земля тебе пухом.
Java заебись, ничего против её не имею. Просто она не подходит под мои задачи, и всё тут. И java-style тоже идёт в разрез с тем, что мне нужно.
5 мегабайт это очень даже очень. Блин, надо будет заказать какую-нибудь простенькую железку и поднять там линупс. Спасибо за инфу, анон!
Делай побитовыми операциями стандартными. Если нужен именно кроговой шифт то есть софтверная реализация.
https://en.wikipedia.org/wiki/Circular_shift
Если ты про <<>>, то гцц у меня рожает арифметический сдвиг. Да и логический сдвиг не нужен так как
>хочу гонять битики по байтику (или двум) влево-вправо
и биты не должны проёбываться.
Вообще странно, что компиляторы не позволяют ротировать биты, сейчас гуглю и нигде внятного объяснения этому нет, потому ставлю на зависимость от архитектуры.
>то надо кодить каким-то определённым образом
Да, если ты адепт ООП, то и пиши так
>std::format
Пиздец....
>арифметический сдвиг
Подозреваю, что ты несешь хуйню.
Арифметическим бывает только сдвиг вправо (сдвиг влево не бывает арифметическим, так как нет такого ABI, где бы LSB биты при сдвиге влево заполнялись единицами, а не нулями).
Биты не должны проебываться при rol/ror, при логических сдвигах они еще как проебываются. В языке С (да и в других известных мне языках тоже) нет нативного API для rol/ror. Напиши свой, это очень просто.
пардон, я чуток сказал неточность
На бумаги есть арифметический сдвиг влево, только вот между ним и обычным логическим сдвигом влево нет никакой разницы (как заполнялись LSB биты нулями, так и заполняются). А вот в случае со сдвигом вправо все по-другому. При арифметическом сдвиге вправо MSB бит 1, а не 0, как при обычном логическом сдвиге вправо.
пардон, я чуток сказал неточность
На бумаге есть арифметический сдвиг влево, только вот между ним и обычным логическим сдвигом влево нет никакой разницы (как заполнялись LSB биты нулями, так и заполняются). Так что хз зачем есть отдельная команда (sal в х86), если разницы по сути, вроде как, нет.
А вот в случае со сдвигом вправо все по-другому. При арифметическом сдвиге вправо MSB бит 1, а не 0, как при обычном логическом сдвиге вправо.
> компиляторы не позволяют ротировать биты
Внимательно смотри дизасм, ничего не напоминает? https://godbolt.org/z/Mn1sjf
>>790415
> Так что хз зачем есть отдельная команда (sal в х86)
> если разницы по сути, вроде как, нет
Нет ни разницы, ни инструкции. Опкод SAL тот же, что и у SHL.
Вообще-то это устоявшийся миф о том, что на С++ нельзя писать для встраиваемых систем. Такую железку, под которую нет С++ компилятора, нужно ещё поискать. С уверенностью можно сказать что если на железке запускается Линуск, то и С++ скорее всего для неё есть.
Это была предистория. А практика говорит что для встраиваемых устройств можно легко писать на С++. Но есть две засады.
Первая засада - забудь об исключениях. Если твоя версия STL не работает с отключенными исключениями, то от её шаблонов придётся отказаться. Искать версию STL, которая в нарушение стандарта может работать без исключений. Или писать шаблоны самому. При этом классы и другие фишки языка поддерживаются.
Вторая засада это заголовочные файлы. На самом деле на С++ в ебмеддем мало кто пишет и скорее всего заколовочные файлы заточены под Си. В таком случае придётся их скопировать к себе и дописать к прототипам функций
> extern "C"
Тогда линкер их увидит. Иначе будет искать С++ функции, а у них хитрый манглинг.
Ну и ещё нюанс со статически обхявленными классами. Конструкторы для них вызывать некому в общем случае. Но это решается самописной crt.0
Линукс далеко не идеал, хоть он и везде. В половине железок так уж точно он.
И небольшое уточнение - значительная часть встраваемых железок имеет Линукс на борту. В этом случае вышесказанное не совсем верно. В этом случе всё будет работать так же, как и на персональном копмьютере. Само. По умолчанию.
Исключения нужно отключать ключами компиляции если пишешь код не для user space или для на железки без ОС. Да, даже для такого железа и для таких конфигураций можно писать на С++. Проверено.
> А практика говорит что для встраиваемых устройств можно легко писать на С++
На Си пишут не потому, что C++ не подходит. Нет, С++ подходит, но если ты видишь код на Си, ты точно уверен, что там не будет всех этих исключений, шаблонов, классов и пятистраничных сообщений компилятора. А когда ты видишь код на C++, ты внутренне сжимаешься, потому что там гарантированно окажется "моя охуенная зеро кост абстракция вокруг регистров железки, которая оптимизирует установку битов". Ну а чего, язык же позволяет, и похуй, что это нечитаемое и неподдерживаемое нагромождение шаблонов, которое способно посрамить даже перл.
Насчёт шаблонов согласен. Они иногда раскрываются в такое, что отладить представляется сложным. Особенно когда дебажишь по UART или JTAG в терминале.
Но классы-то тебе чем не угодили? По сути это те же структуры, в в области видимости которых дополнительно определены функции (методы классов).
И в целом это обычные функции, но которым неявно передаётся один дополнительный параметр - указатель на структуру, в котором определена эта функция. А в коде функции он будет называться this.
Остаются конструктор и деструктор - те же самые правила, что и других функций-методов, но конструктор, если определён, вызывается автоматически при аллокации этой структуры (класса). А деструктор вызывается при удалении структуры или при потере облести видимости.
Нет там особых сложностей.
Велик и могу русский язык.
> указатель на структуру, в котором определена
Правильно читать так:
"указатель на структуру, в котороЙ определена"
>И небольшое уточнение - значительная часть встраваемых железок имеет Линукс на борту.
Значительная часть встраиваемых систем оперативки-то не имеет, строится на редких "индастриальных" МК вроде TriCore, или из вышедших из моды вышедших пичков, а из штатных средств вывода инфы - в лучшем случае или мигающие светодиоды статуса или невмирающие 8-сегментные газоразрядные цифры или, когда дораха-бохато, кастомный ЛСД с запеченным в ЛСД графикой аля "электроника". И хуй туда кто поставит оверхедную железяку ради удобства - себестоимость стиралки за 15к для бомжей тут же улетает за пределы рентабельности.
При хорошем стечении обстоятельств, когда говнодевайс планируется в категорию дораха-бохато - может добрые инженеры дадут экранчик 12864.
Это всё ширпотребские быдлодевайсы, клоторые потом идут в некие магазины и там или азия или котлетки в еще невмершем НПО.
Линух и жирные анально-огороженные соцки - это в основном мультимедийщина и прочая сетевухщина и прочие большие сложные ёбы, туда где не требуется реалтайм.
Там где ответственность и реалтайм и всякие монтависты по требованиям уже идут нахуй и берется QNX.
А вот чего я реально не понимаю, почему поцреотические аналогвнеты вместо того что бы прекрасно подходящие для эмбеда железяки не пустить в дело - делать на них убийц симатиков от сименса и прочие томографы с рентгенами, от чего бы им был почет уважуха и реально полезное импортозамещение, пропиздевшись влезли в десктоп, где закономерно обосрались.
Тот же байкал охуенен - чистый проц без ненужной анально огороженной периферии вроде видеокарт и кусков 3G-модемов, и с полной документацией.
Но нет эти мудаки его на десктоп потянули, с пнем 3 конкурировать, мля.
>делать на них убийц симатиков от сименса и прочие томографы с рентгенами
Возьми и сделай или ты думаешь после либирашьего пануванья все так легко?
Бамп вопросу
>QNX.
Но на марсианском ровере крутится VxWorks.
Но и QNX и VxWorks в итоге соснут у L4 version X2. И это точно.
> Скажите мне не проебался ли я убив 3 недели на базовый СИ перед вкатом в плюсы?
Мало. Рано тебе в плюсы.
Так вот я и спрашиваю - нужно ли си перед плюсами вообще и где оно и только оно юзается? И когда будет уже "пора"? Какой ёба-проект нужно сделать чтобы стать готовым, а, Иллидан?
Ты хотел сказать после позднесовкового пануванья, когда выяснилось что на открытом рыночке совковая хай-тек продукция или просто нахуй никому не нужна или является фактическим контрафактом? А уж после того как китайцы поднялись на том же контрафакте, но уже за миску риса, совковые пизженые с запада микросхемы были обречены.
Успей совок в свою культурную революцию и нарожай бы в 60х-70х достаточно населения что бы конкурировать хотя бы с клятыми пиндосами, и плавно вруби НЭП -может быть всё так печально бы и не закончилось.
А либерашьи лдиберахи - все совковая комса, так-то.
И да, это были лучшие представители интеллигенции из тех что смог совок к моменту развала.
Школьный питон уровня масивчики, сортировочка пузырьком и джейсончики. 4 недели назад бухал как чёрт а сейчас поступил на софтварную хуемразь(инженера) и решил вкатываться заранее чтобы доминировать над всеми на курсе.
Тогда учи ассемблер x86. Не так, чтобы на нём писать, но хотя бы понимать. Иначе уйдёшь обратно на питон или ещё какую беду.
>хай-тек продукция
На хуй никому не нужная. Хотя для малолетнего либирахена дибилятор верх развития цивилизации. А все великии достижения в России были при СССР и плановой экономике, копетолиздм только и может, что отсасывать, пендохи это показали не раз начиная с 30х.
А на кой он нужен вообще? Где-то читал что Си - это просто удобная обёртка асма.
>А все великии достижения в России были при СССР и плановой экономике
Космос и атом. Всё.
Всё остальное - лихорадочно то пиздили-, то догонялииперегоняли, то аналоговнетили.
И да, дибилятор верхушка айсберга, тело - это те самые упомянутые мной ПЛК, станки с ЧПУ, 3д печать, цифровое управление производственными процессами, вот это все.
Тело - это производственная линия и производственные стандарты, благодаря которым упомянутый дебилятор собирается потоково в любой сраной дыре вроде того же тайваня времен 80х, а не как совковый зустц - качеству которого переход на микросхемы не помог , а вот количество выжраной петровичем и его сменщиком вкусной водовки - влияло.
И их коллег из армении, от которых кондеры приехали.
>Космос и атом
Это и есть технологии, а твое обоссаное хайтек и ит на хуй человечеству не нужно. Это у фантастов кудахтеры ассоциируются с прогрессом, а на деле от всеобщей ит дибилизации только деградация и упадок.
>Где-то читал что Си - это просто удобная обёртка асма.
Вот именно. Исходя из этого и надо учить ассемблер, чтобы понять для чего нужен Си. А зная Си уже не так трудно выучить С++.
Я не думаю что востребованы программисты на С++, которые не понимают что сгенерировал им компилятор. Возможно в каких-то редких предметных областях. Иначе тогда лучше сразу в C# вкатываться и не задумываться о многих вещах.
Ну хз даже, у меня с 1 курса в расписании стоит С++. И сколько этот ассемблер х86 придётся учить чтобы понимать как всё работает?
> у меня с 1 курса в расписании стоит С++
Тебя выучат синтаксису, расскажут про особенности, научат пользоваться STL (вероятно научат). Но это не значит что ты станешь С++ программистом. Не, ну этого достаточно чтоби писать helloworlds. Или если ты алгоритмист крутой, то тут уже пофиг на чём ты пишешь - алгоротмисты это уже другое. Ценность таких специалистов именно в создаваемых ими алгоритмах, а кодировать почти любой может.
Я и понимаю, что универ мне многого не даст. Это ещё одна причина по которой решил вкатываться заранее и самостоятельно. А теперь вот говорят разворачивайся и хватай асмр. Думаю короче.
>И сколько этот ассемблер х86 придётся учить чтобы понимать как всё работает?
Да там достаточно просто понять. А мнемоник не так много, чтобы их выучить. На x86 Компилятор использует чуть больше половины. А может быть даже и меньше. Вот их и надо понимать. А всё остальные инструкции можно в справочник посмотреть, если вдруг понадобятся.
По аннотации и содержанию вроде весьма годная.
Си мне интересно подучить на уровне читать и понимать готовые исходники.
тебе просто нужен гугл
Содержание стандартное, выложенная на сайте глава выглядит неплохо, но зайдет ли - хуй знает, прочитай и расскажи нам. Лично я из описания указателей у автора не понял бы ровным счетом нихуя.
Разве сейчас так пишут как там? Мне не задачки решать, а читать современные исходники.
Дополняю проблему, антивирус блочит запуск с файлов, при отключении антивируса все ок (с++ ок и с антивирусом)
Антивирус пытается интеллектуально оградить дебила от языка, который ему не по уму.
Но ведь тогда наоборот не комплились бы кресты, а с сишкой все было бы нормально
Знать Сишечку недостаточно. Без знаний языка ассемблера (похуй какой архитектуры на первых порах, но так как ты прогаешь на ноуте/пека, то х86-64) знания Си наполовину обесцениваются. Также, в 2к20 году, высирая код на Си, у тебя должен быть полный security awareness, иначе ты будешь писать дырявый код а-ля gets(yaeblan_overflow_me), за что тебя вполне законно могут выебать в жопу. ОС интерналс тоже обязательно грызть, попробуй начать с Танненбаума.
На Си всегда байтоёбили, сам язык очень простой, но он требует знаний в смежных темах (асм и основы ОС как минимум) в виду областей его применения. Не забывай, анон, что на Си пишут прошивки, драйвера, ОСи, низкоуровневые библиотеки и йоба-числодробилки.
hacking - the art of exploitation -- начни хотя бы с этого, другие книги по этой тематике тебе вынесут нахуй мозг и ты их вряд ли осилишь, по крайней мере на первых порах.
Как можно сделать конечный автомат, чтобы он работал быстро, но не выглядел убого в коде?
ragel
Я вот интерпретатор Си пилю >>1785454 →
Намедни научил его массивам. В первом приближении это выглядит как-то так. На github пока не выливал - не готово для публичного показа.
молодец, иди поцелую, пупсик
Ситуация такая: есть много разрозненных переменных разных типов и надо бы считать из них значения.
Хрен знает как выкрутиться.
>сделай хексдамп всего куска памяти
Что это?
Хотя бы как правильно называется, чтобы нагуглить примеры?
Делаешь массив/список/дерево структур, описывающих имена, типы переменных и их расположение в памяти. Делаешь функции получения и задания значений в зависимости от типа и свойств переменных (количество бит, есть ли знак и тп). При любой нетривиальной задаче дерево должно создаваться автоматом на основе конфиг файла, чтобы не править код при смене протокола, а создание конфига из тз автоматизировать насколько возможно.
offsetof()
емнип, core dump.
Делаешь дамп памяти с помощью `gcore <pid>` (поставляется вместе с gdb)
Потом, если нужно, делаешь `readelf --segments <полученный после gcore файлик>`, и теперь ты знаешь, где в файлике лежит адрес памяти по указателю.
Если у тебя не POSIX -- выйдите отсюда пожалуйста
В руках его не держал, я сишник крестовик, имею дело с гигантскими авиационными протоколами для can aerospace и arinc 429 и знаю о чем говорю. На питоне скриптики для кодогенерациии иногда пишу, тут ты прав
>cling же есть
Слава Богу! Теперь хоть буду знать с кем можно сравнить, если у меня получится завершить.
девайсы тянут с собой информацию о себе
> Как Линукс определяет во время установки системы как модули ядра надо загружать, чтобы все девайсы работали?
https://en.wikipedia.org/wiki/PCI_configuration_space
Прав, синтетические задания из книжек по программированию нахрен не нужны.
Для знания языка полезнее писать реальные программы, для общих концепций лучше уж литкод тогда решать
> общий алгоритм как задание нужно реализовывать в голове простраиваю
Дьявол в деталях.
> Скипаю большую часть заданий Праты
Не будешь писать код - не научишься ни писать код, ни отлаживать его.
>Дьявол в деталях.
Не спорю, но если у меня задание вида прочитай файл и подсчитай количество указанных символов в нём то уже совсем детсад уровня совмести код из задания 6 параграфов назад с кодом 3 задания назад.
>>795061
>Не будешь писать код - не научишься ни писать код, ни отлаживать его.
Вот я и хочу поскорее проспидранить книгу и сразу взяться за какой-нибудь серьёзный проект с гуглением и энергетиками.
Потому что как база он охуенен и что гуглить если не знаешь чего гуглить? Проблема для меня в том, что после раздела упражнений с массивами и указателями у меня устойчивое ощущение того, что я занимаюсь хуетой.
> подсчитай количество указанных символов в нём
Задание со звездочкой: открой файл с каким-нибудь фильмом и посчитай в нем количество '\x1a' на винде. С двумя звездочками: то же, но файл на флешке, и флешку во время работы программы ты выдернешь.
А что я выиграю если займусь? Какие-нибудь ограничения введёшь? На винде т.к. доступ к стику будет сложнее чем на никсе?
Ждём когда допилят V. Нормальная обёртка над С для людей с оверхедом в ~3%, а не ржавый высер от Мозилы.
Допустим, надо различить m1 и m11 (или m11 и m111, напрмиер). Ведь при поиске в m11 входит m1.
конечный автомат напиши
Наверно подойдёт.
https://ideone.com/as9J6d
Нам известна длина искомой строки.
Надо проверить
>следующий символ после найденного, является ли он разделителем
Символ - "
Допустим, получим с помощью strstr в какой части строки нашли совпадение. С помощью известной длины + 1 символ можно переместиться по строке, наверняка.
Подсобите допилить указатель, плез.
Не самая красивая логика с feof(). Она сейчас работает, но если бы у тебя не было условия в строке 30 (если бы ты считал все символы, а не только конкретный), то EOF тоже посчитался бы. Алсо, тут лучше подошел бы fread(), потому что у этого кода примерно 4 вызова функций на символ (лок/чтение/анлок у fgetc(), плюс feof()), а fread() размазал бы эти вызовы на один буфер из несколько кб данных, тем самым чтение ускорилось бы весьма существенно.
Полезная инфа, спасибо. Перепишу в свободное время.
> пить смузи, растить жиденькую бородку, быть на хайпчике, писать на жопаскрипт, обсуждать модные и "ПРАГРИССССИВНЫЭ" ФРЭЙМВОРКИ
Пиздец, нахуй так жить?
мимомобильщик, который "ебает" всякие железки (не ардуино) все свое свободное время и которому это заходит пиздец как на ура, больше чем мобайл
Респект тебе, дядька.
Кстати, я пока занимаюсь этим как увлечением. Хотя рассматриваю сделать это основным делом (я уже в сфере 3.5 года вчерашний штудэнт, работать попиздовал еще в универе если че, епта).
Просто реальность такова, что не одними деньгами, анонче. Есть ещё то, что у тебя в мозгу и душе.
Там две ошибки.
Во первых, sizeof(char) это один байт. Ты выделяешь один байт и пишешь в него строку.
Во вторых, sizeof(temp) вернёт тебе 4 или 8 - в зависимости от того, 32 или 64 бита приложене.
Используй хотя бы strlen(bar) чтобы посчитать размер строки.
>Используй хотя бы strlen(bar) чтобы посчитать размер строки.
И не забудь прибавить к нему единицу, чтобы для терминального '\0' было место. А так твоя программа не только неправильно работает, но разрушает память.
Ты выделяешь память для пустой строки - массив char из одного байта, в аккурат под терминальный ноль.
В этот массив функция sprintf пишет четыре байта и тем самым разрушает память.
Чтобы понять где ты накосячил, выведи на экране значения sizeof(char), sizeof(char*) и sizeof(bar) - всё поймёшь, если не дурак.
Спасибо, анон :3
Подробнее: есть карта с локациями типа CHAR, каждая локация связана с несколькими соседними, в результате образуя сеть связей между этими точками. При этом сама связь может иметь одно из 4х свойств: автодорога, поезд, пароход, авиа.
Например: локация Берлин (точка Б) связана с Лондоном (Л) по морскому пути, с Парижем (П) железнодорожным, с Веной (В) автомобильным, а с Москвой (М) авиасообщением. Вот такая карта должна получиться к примеру. Важно, что связь не каждый с каждым на карте, а только сосед с соседом и поэтому чтобы добраться из точки А в точку С нужно преодолеть ряд других точек.
И вот я не знаю как подступиться к этой задаче. Использовать какие-то связанные списки? Но как тогда лучше их организовать? Возможно в будущем к этой карте добавится несколько новых локаций, но вообще их список конечен и не превышает 40-50.
Или может быть использовать какую-то табличную структуру данных, но как там хранить связи между точками и свойство связи?
Опыт в создании приложений небольшой, но имеется, поэтому основы я знаю, а вот со связанными списками особого опыта нет, кроме совсем уж простых приложений. Данная карта важна, т.к. на основе неё дальше всё и будет строиться и вот с "дальше" у меня проблем нет. А вот с картой есть :)
Если у кого есть какие идеи или опыт создания подобных карт, то буду очень рад услышать совет.
Сделай структуру и назови её route_t
Внутри структуры определи два указателя на локации и поле, определяющее тип транспорта. Такой структурой ты опишешь любой маршрут. А если чего нехватает, то добавишь в эту структуру. Например, время в пути, цена билета и т.д.
Сделай структуру локации
Внутри структуры имя локации, количество активных маршрутов и массив из, например, 10 указателей на структуры маршрутов. Можно в локации даже не хранить количество маршрутов, а считать количество ненулевых указателей в массиве.
Но можно и через списки. В этом случае массив указателей на маршруты заменяешь списком, голова которого определена в структуре локации.
Возможно на картинке пример скомпилится сразу - не проверял его.
.
.
>связь может иметь одно из 4х свойств: автодорога, поезд, пароход, авиа.
А домики будут набигать?
> одно из 4х свойств
Вот хорошо, можно в младшие биты указателя засунуть... Кхе-хе. Гм, о чем это я?
> Гм, о чем это я?
Деды так делали, а затем память стала дешёвая и каналы передачи данных быстре.
>а затем память стала дешёвая и каналы передачи данных быстре.
а программисты стали очень тупыми.
Базы данных на си не пишут.
Чево?
struct { char a, b; } s1;
struct { char a; int b; } s2;
s1.b может быть по смещению 1, s2.b --по смещению 4.
да ты что, как интересно.
struct { char a; int b[123] ... } s2;
вот о чём я говорю. что говорит по этому поводу стандарт?
Говорит, что структуры несовместимы. Они совместимы, если одна вложена в другую, или если они почленно совпадают (включая имена).
ну, тогда static_assrt() по старинке и в путь.
А как же VLA?
экзистенциально да, будут. но дело в том, что C - это не просто язык описания естества, но метафизики.
emacs
vim
я вот тоже раньше думал, типа, вим-емакс - это сложно или старо-ограничено; сидел на кодблоксе.
я со смехом плюю себе в лицо. хотел бы я вам посоветовать сходу переходить на _нормальные_ _редакторы_, но кажется, нужно поиметь опыт чтобы понять разницу.
vscode + плагинсы
4-ка - опорный элемент.
И вот я нихуя не понимаю какого хуя 4 не меняется местами с 7-кой.
Смотрите: 3 < 4 это истинно. Увеличиваем индекс на 1
7 > 4 Следовательно меняем местами 7 и 4. 7-ка уходит в конец, а 4-ка на место с индексом 1.
Какого хуя они тут как-то сдвигают 4-ку постоянно.
Я имею в виду второй шаг сверху. 4-ка должна сдвинуться на место 7-ки согласно алогоритму, а не на предпоследнее. Какие-то манярасчёты.
>>797896
Вот ещё скрин как этот же массив обработан моей программой на алгоритме быстрой сортировке.
Принт делится на 2 группы
1. Массив целиком
2. Рассматривый в данный момент подмассив.
Верхняя строчка весь массив, а нижняя подмассив в рекурссии . Надеюсь вы понели.
И вот программа сортирует правильно, но не так как на этом манярисунке из вики.
Звёздочка в имени признак авторитета. Цифры в квадратных скобках — количество ходок по оффсету в условных единицах.
тьфу блин, привык видеть их видеть без прoбелoв. спасибo анoн пoнял
Ты плохо знаешь си. На картинке довольно простой код, только отформатирован будто ему за табуляции платят
ну это типа указатель from типа структура локация.
реально надо подучить структуры и союзы в сишечке.
Если я правильно понимаю, то где-то выше в исходнике была создана структура location , что при этом создало новый тип под названием "struct location".
Далее получается так, что структура route состоит из 3 элементов: первые 2 элемента - это указатели from и to (оба являются указателями на тип struct location), 3 элемент - это enum.
Прошу поправить меня, если я неверно расписал.
в этих структурах даже oпытный челoвек запутаться мoжет oсoбеннo кoгда кoд не твoй.
алсo зачем oн указатели юзает? их нужнo юзать на oпределённые случае, здесь я такoгo не вижу.
сам юзаю в си указатели кoгда динамические массивы сoздаю
Всё правильно.
А если добавить в каждую структуру указатель на next, то получится однсвязный список.
А если добавить ещё указатель на prev, то получится двусвязный список.
>при этом создало новый тип под названием "struct location"
Нет. Имя новых типов loation_t и route_t
гуф это ыт?
Пока не соглашусь с этим (но мне надо будет снова прочитать соответствующую инфу).
Если я правильно помню, то typdef не создаёт новых типов. typedef лишь позволяет создать, скажем так "ярлык", чтобы использовать именно его, а не писать каждый раз словосочетание "struct location", "struct route".
Драйвер может быть частью прошивки.
Например, когда ты перешиваешь смартфон на Андроиде, то прошивка включает в себя всё - я идро, и драйвера, и сам Андроид, и приложения.
typedef создаёт новый тип данных. Впрочем компилятору неважно что внутри будет. Для него метка будет означать какой-то объявленный тип и на этом все.
Ты можешь сделать typedef struct huy huy_type;
И структуру определить где-то в другом месте. В принципе компилятор будет знать о таком типе и ты сможешь его использовать без объявленной структуры, но что оно внутри за вундервафля - без определения не узнаешь.
Короче говоря ты можешь юзать ярлык без определения оригинала, что в принципе можно считать за самодостаточность такого нового созданного типа.
Понятно. А ещё в каких больницах ты бывал?
Ш А П К А
>хайтек
>сделать крутого робота, чтобы собирал тупое говно
>дешево, быстро и много, тупого говна
Найс рофлтек.
Первые два способа всегда были эквивалентны. а++ мог быть эффективнее, но современные кунпеляторы умеют преобразовывать одно в другое по своим соображениям.
>typedef создаёт новый тип данных
Уверен абсолютно, что ты не прав в этом. Я прочитал 3 абзац "Semantics" главы 6.7.8 ISO/IEC 9899-2011 и 9899-2018; вот цитата оттуда A typedef declaration
does not introduce a new type, only a synonym for the type so specifed.
Да, так и есть. Удобно устанавливать синонимы, привожу как пример, на структурные типы, дабы не писать "struct $(name)", а например "$(name)_t". Выглядит компактнее, лаконичнее (?), "современно и молодёжно".
Лаконичность помечена со знаком вопроса, т.к это острый вопрос. Решайте сами, как будете писать. Я высказался, как думаю на текущий момент.
x = *ptr; ptr++; самое эффективное, даже с современными умными компиляторами. Из-за алиасинга остальные варианты могут потребовать вычисления адреса каждый раз, тогда как с инкрементом указателя никаких подводных не может быть в принципе.
Линус ругался на такое, дескать, слово struct должно напоминать, что тип представляет что-то большое.
Ну как сказать... Создатель ныне самого популярного ядра ОС. Защита от долбоебов: рофл про 3% на десктопе неактуален, ибо Линукс есть везде - в эмбедщине, роботах, интернете вещей, серверах, роутерах, телефонах (ведроид), спутниках и т.п., оверолл больше компьютеров в мире крутятся на Линуксе, нежели на какой-либо другой ОС.
Ну и создатель гита, которым пользуются 90% девелоперов по всему миру. Ни разу не авторитет, да.
>>799272
Ну не знаю. Мне он как человек не нравится. Да и закапавыался я с головой в код ядра Linux. И в Windows DDK тоже закапывался. Нет в ядре Linux (почти нет) таких мест, коорыми можно восхищаться. Между тем, внимательное изучение заголовочных файлов из DDK сразу даёт понять разницу в качестве ядер NT и Linux.
Насчёт git - ну да, удобно. И возможностей поболе чем у svn, но это как бы не извиняет Торвальдса, за его скверный характер.
[
>Между тем, внимательное изучение заголовочных файлов из DDK сразу даёт понять разницу в качестве ядер NT и Linux.
Это звучит интересно.
Можешь запостить небольшой сравнительный example?
по DDK ты не можешь в полной мере оценить код всего ядра, лолшто. Закрытый софт есть закрытый софт, ничего не поделаешь.
То, что у него скверный характер, это всем известно, но это не отменяет того факта, что у него есть определенный авторитет.
>Можешь запостить небольшой сравнительный example?
Увы, я давно закапывался туда - в году эдак 2003. Чего там говорить если уже лет как десять, наверное, с момента переименования DDK в WDK.
Со списками в DDK/WDK очень красиво сделано. Множество приёмов, которые с точки зрения начинающего программиста можно назвать "хакерские".
Ах да, что особенно нравится в ядре Windows это вот эта штука - https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/ns-wdm-_irp
Для неподготовленного глаза выглядит конечно не очень, но если понять как это работает, то видно красоту архитектуры.
Лучше можно конечно спроектировать, но это уже другой разговор.
Там в описании указано "The IRP structure is a partially opaque structure..."
Что они имеют в виду под "partially opaque structure"?
https://en.wikipedia.org/wiki/Opaque_data_type
Кстати, в чём красота, то там работа с драйверами "слоями", ты можешь, например, написать драйвер, который вклинится между ядром и другим доайвером и заставить работать этот драйвер в качестве фильтра. Ну вот например ты можешь реализовать сквозное шифрование между драйвером устройства и ядром.
Качество ядра нт вызывает сомнения, как бы красиво ни выглядели его заголовки..
Обосновать своё утверждение можешь?
Не согласен, в ядре Линукса есть много красивых решений. Умудрились даже высрать ООП дизайн в языке без ООП, не притягивая блоатед плюсы. Та же реализация макроса container_of - чистый и красивый хакинг. И такого много, на самом деле. За 4 года разработки драйверов на Линукс, мне пришлось прочесть достаточно кода в ядре.
У него прекрасный, замечательный характер. Нет ничего постыдного в том чтобы показывать фак нвидии или хуесосить тех кто шлет в ядро говнокод.
Не об этом речь была, но ладно...
>Та же реализация макроса container_of
Можешь започтить этот кусочек кода или кинуть ссылку на него?
Пикрил
В целом, это ищется в гугле за наносекунду, поэтому мог бы и сам, но ладно.
Примечательно, что довольно большая часть ядра Линукса - это не ANSI Си, а разномастные хаки, в т.ч. основанные на расширениях компилятора GCC, выжимающие максимум производительности.
>Нет ничего постыдного в том чтобы показывать фак нвидии
> Показывать средний палец компании, которая единственная производит норм видюхи с норм драйверами, втч под линух, где у единственных всё из коробки без бубнов, и благоговеть от лизонькиных-писенькиных красных поделий с кривыми, шо проприетарными, шо швабодными, шо под линукс, шо под шиндошс дровами и единственное достоинство которых - греть ЧСВ амудебилов вроде сралкаша и кулича, ммммммм.
>по DDK ты не можешь в полной мере оценить код всего ядра, лолшто. Закрытый софт есть закрытый софт, ничего не поделаешь.
По торрентам еще с каких-то диких нулевых гуляет код вынь2к. Эти исходы чуть ли не на дисках на пиратских развалах продавали, емнип.
>Примечательно, что довольно большая часть ядра Линукса - это не ANSI Си, а разномастные хаки, в т.ч. основанные на расширениях компилятора GCC, выжимающие максимум производительности.
Ну то есть, самый главный проект байтолюбства ногострельным языком, которым оправдывают байтолюбство ногострельными байтоязыками закономерно пишется с ебанием стандарта языка в рот и в жопу, порождая ежемесячно кучу веселых CVE.
И местные байтолюбы считают это чем-то хорошим, даже великолепным?
Ну ну.
>ногострельным языком
Какой же язык, который ты считаешь не ногострельным, следует использовать, по твоему мнению, для написания ядер ОС?
Ты не напишешь МАКСИМАЛЬНО ЭФФЕКТИВНУЮ операционную систему на языке без UB. Даже высеры раста вынуждены абузить unsafe (чекай сорц redox), и то это будет медленнее так или иначе. Почему так - на дваче не объяснить, пройди курс теории вычислений в нормальном, не СНГшном, ВУЗе, и ты поймешь о чем я говорю.
В принципе, С++ можно. Дело не столько в языке, сколько в дизайне системы и используемых алгоритмах. Так-то С++ обратно совместим с Си. Особливо если во всю пользовать extern "C" . Нюансы конечно есть, но их не так много.
Паскаль легко может быть использован.
Но это не совсем правильно.
Правильно реализовать ядро в виде множества сервисов, которые обмениваются между собой сообщениями. И тогда для написания ядра ОС сгодится любой язык программирования. Даже скриптовый.
обратная совместимость с си это самое некрасивое и костыльное место всего дизайна крестов как языка. Разве что совсем дурак будет этим заниматься
При том, что ты или кто-то другой сделал громкое заявление, и не подкрепил его доказательствами или хотя бы примерами.
Кстати, поговаривают что указатели в C# таки есть, но только в unsafe режиме.
https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/unsafe-code-pointers/pointer-types
> Та же реализация макроса container_of - чистый и красивый хакин
Это та же самая, которая в винде CONTAINING_RECORD, и которую изобрели примерно вместе с сишкой задолго до линусов?
Нотепад++
>юзать функцию которая возвращает значение
Ну фнкция должна только успех тру или фалсе возвращать, а значения через параметр
Зависит от проекта (-ов) и текущих задач.
Да, нормальная, но чтобы ты страдал в C2x притащили/притащат [[nodiscard]], дебилы понатыкают их везде, и компилятор будет ругаться.
>Правильно реализовать ядро в виде множества сервисов, которые обмениваются между собой сообщениями
Неоднократно пробовали, спермой результата даже можешь хоть сейчас обмазываться купив любой спермодевайс.
Но чистые сообщения не работают, драйвера приходится монолитить.
>Но чистые сообщения не работают, драйвера приходится монолитить.
Это распространённое заблуждение. Но я не буду тебя переубеждать. Сегодня точно не буду.
Дурачок, вот если бы ей фак не показали, то и не делала бы.
Но он прав, да это и понятно - "просто сообщения" в вакууме не бывают, это накладные расходы.
Paint.net так работает, помню как его хаяли за то, что его пихали как пример что на .net можно писать быстрые приложения, обрабатывающие массивы из миллионов пикселей в секунду, а на практике там такое жульничество.
Зааисит от того что делает функция, иногда игнор говорит о неучтенной ошибке.
Vs codium для всего.
И тем не менее ты заблуждаешься. Те же критические секции и спинлоки, которых в ядре немало, это большее зло, чем сообщения.
Вот без этого вот можно обойтись, если реализовывать через сообщения - https://www.ibm.com/developerworks/ru/library/l-linux-synchronization/index.html
Однохуйственно.
Ты создаёшь новую запись в таблице символов при компиляции этим. Что синоним, что линк - запись появилась, компилятор работает как с новым типом, хоть и указывающим на другой составной тип. Удачи читать стандарты которые не работают ИРЛ.
Сообщения - это циклический буффер, в который пользователи могут писать и читать. А значит, те же блокировки.
Подмечу, что можно сделать lockless очередь. Но тогда часть перфа потеряется в другом месте. Хотя и не так сильно. Apple использует микроядро, и вроде не бегут с него. Впрочем, драйвера у них работают внутри отдельного сервиса в котором очередей нет.
lockless вроде бы бывает только если ровно один записывает и один читает, а с сообщениями такого не будет.
В гугле хватает multiple producer, single consumer lockless очередей.
Проблема ещё в валидации сообщений. Кинул неясный сервис другому сообщение, а оно и поставило раком всю систему. Рано или поздно выйдет, что система только тем и занимается что валидирует сообщения, да и дергает атомарные инструкции,которые инвалидируют весьма часто L1 кэш в seq_cst, в то время как монолитное ядро лишь локается на спинлоках/мьютексах/rcu, и просто работает.
А, ну да, там же еще CAS в железе нужен.
> As an example, this code almost certainly needs a "memory" clobber. Not to ensure the correct functioning of cmpxchg16b, but because the goal is probably to sync threads, which means you want all registers flushed before notifying the other thread.
Лол, вся суть, пихать мемори барьер, к инструкции которая и так дохуя тактов жрет, вот тебе и лок фри.
Обмен информацией между процессорами требует (затратной) синхронизации, даже если это обозвать обменом сообщениями.
Мне кажется, что зафлашить store queue намного быстрее, чем пару тройку раз сменить контекст на блокировках.
именно поэтому все RTOS имеют монолитное ядро. Хз че тут шизоиды срут про микроядро, из него максимум не выжмешь какне усерайся
vim с ale
Он тебе так-то ясно продемонстрировал, что нового типа не получилось, только синоним, какого хуя ты жопой начал вилять?
>Сообщения - это циклический буффер, в который пользователи могут писать и читать. А значит, те же блокировки.
В принципе вот тут и закопан корень заблуждений. Я говоро о синхронных сообщениях, когдв блокируется передатчик сообщения, если не готова принимающаю сторона, и наоборот - приёмник сообщений блокируются пока кто-то не пошёл ему сообщение.
Ахуенно, а теперь расскажи как будет работать твоя "блокировка" когда двое посылают сообщение одному и тому же.
>Ахуенно, а теперь расскажи как будет работать твоя "блокировка" когда двое посылают сообщение одному и тому же.
Если приёмник не готов, блокируются оба передатчика. Иначе сообшение посылает тот, у кого выше приоритет, второй
посылающий блокируется средствами микроядра.
ну да, куда мне до тебя, с моими-то четырьмя годами опыта разработки софта под RTOS для спутников :-)
Предлагаешь "писюнами меряться"?
Хочешь научиться программировать на чем-то - пиши код, не читай книги. Книги полезны как большой справочник.
Вот я и думаю - Прата всю доступную теорию даёт или там чего-то нет? А что вообще писать можешь посоветовать? Идей почти нет.
Читай исходник пинуса, бсд или иной софт, который прожил не меньше десятка лет и был написан коллективом
Опять троллим тупостью? Как можно человеку только осилившему прату советовать читать опенсорс говно вроде пинукса? Мало того что он нихуя не поймет, ты ему еще и советуешь вдохновляться дырявым стилем ленивых хуесосов вроде самого пинуса
Вопрос "что кодить" просто вымораживает.
Не знаешь что писать - бери любую задачу со списками, затем с бинарным деревом, затем с небинарным деревом.
Затем приходи сюда, отчитывайся и получишь новое задание. А пока не сделаешь - не приходи.
Так зачем тебе яп если ты не знаешь что кодить?
У меня вот идей и задач на ближайшие год-полтора напридумывано.
>читать
CLRS и что-нибудь по архитектуре ЭВМ.
>кодить
>>1801064 →
Ещё, наверное, стоит заглянуть в асмотред (в шапку).
>Шахматы
Позиционная игоря для пидоров, там никакого ИИ и в помине нет. Бери книжку эндшпилями и прочей залупой для задротов и вперед.
мимо
>Там самое интересное байтоебство с битфилдами
Вкусовщина. Приятней когда игра интеллектуальная, с элементами случайности, какой нибудь Бридж или Преф.
Да не, совсем не толсто.
Зависит от определения
Да не, чел. Битборды - это то самое реальное байтоебство реальных байтов.
// Пример получения интересующих нас битбордов:
uint32_t all_bb = bitboards[IDX_ALL_0] | bitboards[IDX_ALL_1]; //Все занятые клетке доски
uint32_t empty_bb = ~all_bb; //Все свободные клетки доски
uint32_t mam_bb = bitboards[IDX_ALL_0] ^ bitboards[IDX_SIM_0]; //Белые дамки
uint32_t up_right_bb = 0 | ((bb & RANK_1357) >> 4 | ((bb & RANK_2468) >> 5 // Ход белых вверх вправо, чётные горизонтали надо сдвигать на пять, нечётные — на четыре:
;
>Белые дамки
>
Хуянки, маня.
>uint32_t up_right_bb = 0 | ((bb & RANK_1357) >> 4 | ((bb & RANK_2468) >> 5 //
Это в какой шаражке учат так говнокодить?
>uint32_t up_right_bb = 0 | ((bb & RANK_1357) >> 4 | ((bb & RANK_2468) >> 5
Чё за хуйня со скобками? И потом ты ещё говоришь, что это не говнокод?
Я тебе написал что такое байтоёбство
Битборд это вообще одна из элементарнейших дата структур уже лет 20 как реализуемых на любом из яп
> Я тебе написал что такое байтоёбство
Где? Не вижу.
> Битборд это вообще одна из элементарнейших дата структур уже лет 20 как реализуемых на любом из яп
И что? Твое байтоебство тоже.
Хуйню несешь . Открой заголовочный файл какой нибудь микрухи там то же самое.
Анон, прости, что доебываю тебя, но! Микруха - это сленговое название любой микросхемы, а то что ты имеешь ввиду, имеет называние "микроконтррллер". Или, сокращённо, МК.
JavaScript. И точка.
Правда, чтобы разработать ядро на JavaScript необходимо соблюсти ряд определенных условий касаемо разработчиков такого ядра:
1. Необходимо приобрести цистерну клубничного смузи
2. Нужен гироскутер, а ещё лучше - моноколесо
3. Необходимо соблюдать определенный внешний вид разработчиков: штаны с подворотами, жиденькая бородка
4. Разработчики такого ядра обязательно должны быть прогрессивными: говорить 2к20 вместо 2020, говорить о харассменте, гендерной несправедливости, интерсекциональной трансфобии (!это самое главное), обязательно должны быть ярыми поборниками за экологию и фанатами Греты Тунберг, должны ненавидеть мужланов и маскулинность, должны быть ярыми участниками куколд-движения
Годно, анон. Криканул с утра, спасибо.
Ты прав, в 3 часа ночи такое ляпнул.
двачую.
ты забыл чтo желательный пoл разрабoтчика тянка или трап
>4. Разработчики такого ядра обязательно должны быть прогрессивными: говорить 2к20 вместо 2020, говорить о харассменте, гендерной несправедливости, интерсекциональной трансфобии (!это самое главное), обязательно должны быть ярыми поборниками за экологию и фанатами Греты Тунберг, должны ненавидеть мужланов и маскулинность, должны быть ярыми участниками куколд-движения
Ты говоришь так, словно байтоебов и кразноглазиков данная проблема не коснулась.
На что там заменят слово "слейв" в линупше? ЧЕРНЫЕ ЖИЗНИ ВАЖНЫ!!!!!
Кого пидорнули с должности президента фсф за то, что спизданул про дела Эпштейна чьто-то в духе "Наверняка эти шлюхи сами с удовольствием шли сосать миллиардеру" КАРАУЛ ВИКТИМБЛЭЙМИНГ!!!
Анон, так никто и не говорит, что не коснулась.
Просто я с этого всего SJW-мрака стебусь. Абсолютно глупое и бессмысленное движение, которому некоторые хипстеры придают слишком много значения.
Такие движения всегда были и будут, как были и будут те, кому нехуй делать.
Где ты проблему увидел? Общество исцеляется от предрассудков.
Автор этого кода перестраховался и не очень уверен в приоритетах операций. Если редактор подсвечивает парные скобки, то стерпеть такое можно.
> Автор этого кода перестраховался
Это не путаница со скобками. Автор этого кода хочет, чтобы любая макака смогла с первого раза правильно прочитать код. А приоритеты сдвиги vs. побитовые знает любой, кто с байтоеблей сталкивался.
Неистово проигрываю.
Ещё могу добавить необходимость в 100 новых библиотек для написания ядра.
Обязательно чтобы каждый был основан на любых других библиотеках из npm. И все ставилось через десяток менеджеров пакетов, которые между собой не совместимы.
Я честно не пойму с чем ты споришь.
Вот я открыл другую либу, для STM32.
Так и выглядит байтоебство (и так же выглядела копипаста с шахматными битбордами).
Тут всё правильно со скобками, а в коде выше как раз типичный говнокод макаки с четырьмя открывающими скобками и двумя закрывающими
Боже, какой же ты еблан. Естественно в коде не бывает непарных скобок, он даже не скомпилируется. Очевидно же что это ошибка копипаста примера.
Ну, если ты не читаешь, что пишешь перед отправкой, то ты как раз на уровне js-макаки находишься
Портфель собирай, ближе к экзамену вам расскажут разницу между ошибкой и опечаткой.
>MISRA C - это такие рекомендации, как писать код для хуйни, которая может ебнуть
Удивительно, что такой код вообще пишут на C. У него же репутация языка, где выстрелить в ногу - раз плюнуть. Вроде Ada создавалась для подобных целей. Хотя впрочем, кое-какие важные вещи и на ассемблере пишут. Но проверяют 100 раз, конечно.
Дядя, а что ты делаешь тогда на двачах? Тебе в Академии Наук надо сидеть, а не тут.
Когда ракета наебнется будешь рассказывать про ошибки и опечатки.
Что для регуляри программиста значит ...?
Структуры это poor man's замыкания.
С одной стороны да, делает код чуть попроще для понимания.
С другой стороны если ты пишешь на Си в ООП стиле, как например сделан проект gtk, то кажется ты свихнулся, тихо страдаешь по крестам и лучше уже выбрать их.
От логических ошибок тебя никакой язык не застрахует. Нужен опытный программист. И тот же самый опытный программист обычно уже миллион раз обжегся на сишке, и более-менее умеет качественно на ней писать.
#include <limits.h>
enum E { e1 = LLONG_MAX, e2 = 1 } e;
int main(void) {
printf("%lu ", sizeof( enum E ));
printf("%lu ", sizeof( e1 ));
printf("%lu\n", sizeof( e2 ));
return 0;
}
gcc 8 8 4
clang 8 8 4
vc 4 4 4
g++ 8 8 8
clang++ 8 8 8
vc++ 4 4 4
Поясните, почему Ubuntu/Debian может "повиснуть" и никак не реагировать на клавиатуру (все эти SysRq и проч.), в то время как Windows тоже может "повиснуть", но всегда реагирует на Ctrl+Arl+Del. Это как-то связано с алгоритмом планирования процессов? Какой алгоритм используется в Windows?
ST3 + тыща плагинов. В целом полёт норм.
Иногда в настройках (json) отключаешь что-то, но по факту оно не отключается.
Я хз про линух, но винда уже с 95 а может и раньше драйвера запускает по сути на виртуальных машинах, чтобы железо не могло вешать систему и была истинная многозадачность. Но bsod опять же все равно происходил.
Формальная верификация.
>в то время как Windows тоже может "повиснуть",
У меня не виснет.
> но всегда реагирует на Ctrl+Arl+Del.
Любоей нажатие на клавишу генерирует прерывание. Обработчик прерывания читает из порт контроллера байт, или несколько байт, в зависимости от нажатой клавишы. Это байты называются scam-codes. Драйвер клаивиатуры передаёт эти сканкоды ядру, где в зависимости от локали эти коды транслируются в ascii или unicode символы. Можно читать напрямую сканкоды и смотреть какая клавиша нажата.
При этом доайвер (клавиатуры или ядро) анализирует последовательность нажатых клавиш. Когда он обнаруживает Ctrl + Alt Del, то посылает сигнал перезагрузки.
Старые ядра всегда ловили Ctrl+Alt+Del. Новые не ловят? Причин может быть много. Самая банальная - по какой-то причине прерывания от клавиатура запрещены. В этом случае на клавиатуру реагировать никак не будет. Другая причина... ну возможно косячит systemd. Это даже более вероятная причиина. Slackware упирается с переходом на systemd. Возможно она не подвержена этому багу.
Легаси, сертификация, поддержка старых ОС без свежих пакетов.
Многие баги обходятся тонкими фиксами, отключением оптимизаций для отдельных участков кода и т.д.
А баги есть везде, через N лет текущую версию можно будет назвать старой и забагованной до неюзабельности.
Там достаточно противоречивых правил.
Потому что новые версии добавляют свои баги и несовместимости, придурок.
>первый релиз в 2011 году
>последний релиз 8 ноября 2012 года
Говорилось про юзабельные RTOS, а не шизоидные говновысеры, толком не подходящие под такие задачи.
Говоришь, для спутников пишешь? На
> As a microkernel-based OS, QNX is based on the idea of running most of the operating system kernel in the form of a number of small tasks, named Resource Managers. ...
Это была QNX. Давай посмотрим что крутится на насовских марсоходах. Охуевай от прочитанного:
>https://en.wikipedia.org/wiki/Comparison_of_embedded_computer_systems_on_board_the_Mars_rovers
И наконец, то что ещё не летало, но в перспективе сожрёт и QNX и VxWorks, не говоря уже об остальном - https://www.l4ka.org/65.php
Слушай, не в обиду, но может быть российские спутники долго не живут вовсе не от проблем с радстойкостью железа, а от того что ты и подобные тебе суперциклами злоупотребляете?
угу встречал и в литературе 2 противоположных мнения
одни считают что нужно намеренно писать проще, в данном случае, расставить необязательные скобочки
другие считаю, и их мнение мне ближе, что человек который будет сопровождать данный код, будет обладать достаточной квалификацией и будет знать тонкости приоритета операций в языке и эти скобки расставлять не надо
> будет обладать достаточной квалификацией и будет знать тонкости приоритета операций в языке и эти скобки расставлять не надо
А потом ебаться с ошибкой в коде
Я правильно понимаю, что можно переводить типы только в одну сторону(из типов с меньшим количествов байт в большее?) или же есть способы перевода на тип поменьше без потери данных(а если я знаю ответ и хочу перевести в тип с памятью поменьше?)
Как я понял, если число типа double не имеет после запятой знаков, то с переводом все ок, если число не слишком большое
И вообще, замени %d на %f и не парь мозги.
Не работает эта команда. Ошибка при компиляции
Бтв, как это все называется? Как работают форматы lf, d идругие? Они сами по себе не переведут инт в дабл, если указать для целого вещественный lf в принфте?
И как называется, когда переводят числа из одного типа в другой. А то мне из-за этой вещи мне бывает очень сложно искать ошибку в моем коде.
Извини, я по ошибке тебе дал другую функцию. Убери перваую букуву s.
И посмотри в Интернетах что такое sprintf и snprintf,
а не компилится потому что для sprintf нужно больше аргументов.
Функция sqrt существует только в виде принимающем и возвращающем double.
В printf же d означает i, int. Так что у тебя UB.
> А то мне из-за этой вещи мне бывает очень сложно искать ошибку в моем коде.
Чтобы не искать ошибки, нужно включать больше ворнингов:
> printf("%d\n", 1.0);
> cc -Wformat file.c
> warning: format '%d' expects argument of type 'int', but argument 2 has type 'double'
> Не работает эта команда
Алсо, нужно читать, что тебе пишут на скриншоте (вторая строка). Сначала учимся читать, потом пишем код. Не наоборот.
m (i)
m(i)
Ты кинул статью со спутниками, на которой почти все работают на монолитной VxWorks. Каким боком микроядро?
И не надо мне тут рассказывать за микроядро в VxWorks - его добавили как отдельный профиль сборки для mmu-less архитектур в 2014, и единственная его микроядерность - размер в 20 кбайт, и на этом всё
Да просто солями уебался, а потом вопросы задавал.
Да я просто обчитался гитлаба GHC (конкретно их рантайма) и захотел себе сделать так же. В питоне, расте, кстати, тоже строки по дефолту юникод32. Компилятор в байт-код у меня поддерживает utf[8, 16, 32] Но он на хаскеле, лол, а вот в самой виртуалке строки онли ютф8, хочется сделать нормальный юникод32, чтобы не париться совсем.
Ну или подкиньте, что можно почитать, вдруг я не так понимаю все это дело и лезу еще тут, есть у меня ощущение, что знаний не хватает...
>И не надо мне тут рассказывать за микроядро в VxWorks
Конечно я не буду тебе за него рассказывать, потому что в мире есть только одно божественное микроядро и оно поддерживает спецификацию L4.X2. Все остальные ядра это бледные тени L4.X2.
Что? Нет. Строки и в расте и в третьем питоне по дефолту енкодятся в UTF-8, и только в питоныче интерпретатор за тебя в большинстве случаев подставит нужную кодировку в процессе трансляции.
> В питоне, ... кстати, тоже строки по дефолту юникод32
[sys.getsizeof("x" * i) for i in range(10)]
[49, 50, 51, 52, 53, 54, 55, 56, 57, 58]
Еще охуительные истории будут?
> юникод32, чтобы не париться совсем
Эмодзи видел? А в них несколько code-points в каждом. Русские буквы с ударением, любые другие комбинирующиеся символы... не получится не париться, смирись.
Печатай через '\b'
>Посоветуйте чё почитать вообще про кодировки.
Кодировки это ни о чём.
Читай вот это и вот это:
https://docs.microsoft.com/en-us/typography/opentype/spec/otff
https://developer.apple.com/fonts/TrueType-Reference-Manual/
1. По умолчанию открывающая фигурная скобка ставится на той же строке, на которой описывается название функции и ее параметры. Мне нужно, чтобы открывающая скобка ставилась с новой строки в случае с функциями, но -- на той же строке в случае с циклами.
2. Мне нужно, чтобы я выбрал стандарт языка, создал файлик, написал код, скомпилил его, запустил. Потом создал бы новый файлик, написал бы в нем новый код, скомпилил бы, запустил. Звучит несложно, да? Однако в CLion под каждый такой отдельный файлик мне нужно создавать новый проект. Соответственно, для каждого упражнения из K&R я вынужден создавать New Project. Выходит громоздко.
Вы можете предложить мне писать в каком-нибудь vim или emacs и просто собирать компилятором из консоли -- неплохой вариант. Но я хочу но я хочу IDE с подсветкой, дополнениями, авторазметкой кода и т.п.
Visual Studio тебе нужно.
А если из консоли, то пользуй редактор Midnight Commander. Автодополнения не будет, но подсветку он обеспечит. Да и vi c emacs умеют в подсветку. emacs я не знаю, но vi для редактирования кода годится только если ты по модему по межгороду на 2400 baud логинишься из Москвы в Норильск. Тогда у vi конкупентов нет, в любом другом случае он годится лишь для правки конфигов.
Но в VS же даже нельзя выбрать Сишный стандарт, насколько помню. Там вообще все собирается плюсовым компилятором. А еще писать желательно на никсах, ибо я когда первый раз с винды на линукс пересел, то охреневал от buffered streams -- оказывается, не просто так \n добавлять нужно в любом выводе. Да и в VS разве можно не создавать новый проект под каждый файлик?
>Там вообще все собирается плюсовым компилятором.
расширение .c - компилятор Си, расширени .cpp или .cc - компилятор С++
> А еще писать желательно на никсах, ибо я когда первый раз с винды на линукс пересел, то охреневал от buffered streams -- оказывается, не просто так \n добавлять нужно в любом выводе.
Ну так опыт тебе. А писать желательно платформонезависимо, насколько это возможно.
> Да и в VS разве можно не создавать новый проект под каждый файлик?
Ты можешь хоть все демки/уроки в один проект поместить и пометить их неактивными. И выбирать одну активную.
https://linux.die.net/man/3/fwrite
Можно и через write, но судя по вопросу тебе пофиг.
> с 16-битными отсчетами
Это как?
> с 16-битными отсчетами
Так никто никогда не говорит. Нет такого понятия "отсчёты"
тебе нужно вывести массив шастнадцатибитных чисел?
Я не очень понял, мое задание звучит как тут
https://www.programmersforum.ru/showthread.php?t=280657&page=2.
Я сигнал сформировал, но не понимаю, как его вывести.
ты наивный, если полагаешь что я буду за тебя делать задание или хотя бы пройду по ссылке. Научить могу, делай сам.
У тебя никаких вопросов не возникло? Какова размерность массива? Числа со знаком или без?
Ну-ка, объяви массив на 10 элементов 16 битных беззнаковых чисел. Если не сможешь, то ты зря сюда пришёл. Тут злые взрослые дяди, которые тебе плохого наговорят.
Все учел надеюсь.
>У тебя никаких вопросов не возникло? Какова размерность массива? Числа со знаком или без?
Остался только вопрос, как 16-битные числа вывести в не форматированный бинарный файл.
>Остался только вопрос
Судя по всему у тебя много вопросов.
> как 16-битные числа вывести в не форматированный бинарный файл.
Я тебе ответил выше - с помощью функции fwrite или write, на твой выбор.
Я не так и не увидел от тебя объявление массива.
unsigned short dv[10] ;
>Мне нужно, чтобы открывающая скобка ставилась с новой строки в случае с функциями, но -- на той же строке в случае с циклами.
Должно просто настраиваться в настроках Code Style (Braces Placement)
>я выбрал стандарт языка, создал файлик, написал код, скомпилил его, запустил
Основная билд система у CLion это CMake же. Для простых как у тебя случаев тебе в нём нужна просто одна команда add_executable.
Нет, а стандарте вообще прописано что больше 100500 циклов быть не может.
Ты совсем ебобо? Баги ищи.
/pr
Реквестирую курс по с/с++, где объясняется оформление исполняемого файла и добавление встроенный или
директорных ресурсов (Иконки, вав-вайлы и т.д.). Желательно с пояснением синтаксиса и роли библиотек. Можно в виде статьи.
.
Сейчас освоило синтаксис, функции и системные команды. Хочу попробовать создавать оформленные простые микро-програмы (Наподобие интервального таймера). Но я даже не знаю как добавить иконку и собственный сигнал (Использую \a)
Vs codium + плагин code runner
>открывающая фигурная скобка ставится на той же строке, на которой описывается название функции и ее параметры.
Все верно.
Попробую
>>806928
>расширение .c - компилятор Си, расширени .cpp или .cc - компилятор С++
Да, про это подзабыл. А что насчет стандарта языка? Хотелось бы иметь возможность выбирать между C90, C99 и C11
>А писать желательно платформонезависимо, насколько это возможно.
В реалиях Си, по-моему, это почти невозможно. Ибо так или иначе тот или другой кусок кода будет дергать то, что связано с ОС в половине случаев.
>>807059
>Должно просто настраиваться в настроках Code Style (Braces Placement)
О, помогло, спасибо.
>Основная билд система у CLion это CMake же. Для простых как у тебя случаев тебе в нём нужна просто одна команда add_executable
Можно поподробнее? Где именно мне прописывать cmake'овские команды?
>>807156
Согласно K&R стилю открывающая фигурная скобка тела функции должна быть с новой строки. А в случае с циклами она должна ставится на той же строчке
Ну хуй знает, похоже на UB. Лениво проверять под MSVC и gcc.
Если не ошибаюсь, то иинкремент первым будет, затем проверка i<j, и если условие ложное, то проверка j < k.
Хоть у || и самый низкий приоритет, но порядок вычисления то вроде он задает.
Т.е. если i<j истина, то правую часть он вообще скипнет.
Также он не всегда двигается слева направа - ассоциативность в табличке выше.
Например в x = y он рассчитывает y раньше x.
Вот реально лень проверять. Просто когда опыт программирования в десятки лет, то такие конструкции подсознательно избегаегт, даже не задумываясь.
>>807233
Если для моего примера сделать это:
{
int i = 3, j = 4, k = 5;
printf("%d\n", i < j || ++j < k);
printf("%d %d %d\n", i, j, k);
}
то последний printf покажет, что j равно 4.
И непонятно, почему префиксный инкремент (который во всём выражении имеет высший приоритет и должен за счёт своей "префиксности" моментально увеличить j на 1) не выполняется.
Потому что order of evaluation независим от order of precedence
https://en.cppreference.com/w/c/language/eval_order
В операторе x() || y() если x() истина, то все выражение истина и вызова y() не будет вообще.
Аналогично x() && y() если x() ложь, то все выражение всегда ложь.
Думаю дело в том, что он сначала строит дерево. Но потом он его обходит то начиная с корня, то есть самого низшего приоритета.
>>805537
Панимаю.
Пойду больше по теме покурю, спасибо.
А то делаю виртуалку для фп языка на вроде эрланга, но с норм типами (раскурил систему типов хаскеля для этих целей и чутка упростил, шоб в императивном языке норм смотрелось) пока получается лютое говно и я хз, как типизировать рассылку сообщений между процессами, разучил как делать shenandoah gc (получилось баганное кривое подобие, правда, но это дело наживное), в итоге у меня CMS и Shenandoah только, хочу еще G1 прикрутить.
Собственно, не хочется делать строки как в хаскеле и нативном эрланге, где они тупо на линкед листах, ну и массивы заодно завез, думаю вот, как обойтись без частного случая для строк, но что-то как-то лучше их все же вытащить в отдельный случай для экономии проца и оперативы.
>Можно поподробнее? Где именно мне прописывать cmake'овские команды?
При создании проекта у тебя появляется файл CMakeLists.txt, который описывает всё, что билдит твой проект. Там и добавляй новые исполняемые файлы. Посмотри https://cliutils.gitlab.io/modern-cmake/chapters/basics.html , в особенности раздел Dive In. Только у тебя, естественно, будет LANGUAGES C. Для задания стандарта Си используй https://cmake.org/cmake/help/latest/prop_tgt/C_STANDARD.html
Вообще хорошо бы простой Make понять прежде чем лезть в весь ужас CMake. Но в CLion с мейком всё очень плохо, и если ты уж в него впираешься, то выбора нет.
Ок, посмотрю вечером, спс
>Забугром эмбедщина
>Quallcom, Mellanox, Marvell, Nvidia, Xilinx, Tesla
Речь идет про рядового анона, либо без во, либо закончившего говновуз, которые забугром нафиг не кому не нужны даже с 10 годами опыта.
Поэтому если выбирать из работы в России: прогать микрики, как даун, или стать веб-разработчиком, очевидно выгоднее выбрать второе. Можно как завести трактор в ДС, так и перейти на удаленку, фриланс, когда прогером мкк будешь всю жизнь сосать за 30-40к максимум при работе оффлайн 5/2.
>Причём настолько, что любой человек с опытом 3+ лет на этом самом эмбедеде может спокойно ехать в какую-нибудь Германию или Францию на 4-5к рейхсмарок ежемесячно,
Но реальность такова, что типичный байтоеб из НИИ, не закончивший топ вуз в дс, будет пахать за 20к-30к и ни в какую германию и францию не уедет, потому что он там нафиг не нужен.
В то время как веб-разработчик даже в рахе может получать эквивалент 2-3 рейхсмарок через пару лет работы и работать на в разваливающемся заводе или нии, а в крутом офисе с печеньками и кондиционером со свободным графиком.
> не одними деньгами, анонче. Есть ещё то, что у тебя в мозгу и душе.
Угу, пока норм прогеры уже и квартиру в новостройке/жилье купят, машину, и семью заведут, ты будешь ездить на работу на жигулях микросхемы паять и жить с мамкой, зато для ДУШУ работаешь, лол.
>либо закончившего говновуз, которые забугром нафиг не кому не нужны даже с 10 годами опыта
Дальше пост можно не читать, т.к. выдает теоретика сразу. Ты не знаешь, какие дипломы за бугром нужны, а какие нет (хинт: почти все со словом "государственный").
Да, собственно, анон, я сейчас микросхемы паяю в свободное время работаю-то я андроидщиком. А когда заведешь семью - хуй ты поковыряешь МК в свободное время, ибо хуй тебе а не свободное время. И хуй ты потратишь свои кровные на свое увлечение.
Но вообще, если следовать твоей логике, что так, что так ты будешь в говне, ебать: либо с деньгами, квартирами, машинами, женой, но без свободы и поэтому тебе нахуй эти все КВОРТ5РЫ, МОШЫНЫ не будут нужны, депрессия сожрет твой мосск, либо без денег, но зато будешь заниматься своим любимым делом.
Энивей... Не хочу заводить серьезные отношения до 33, нахуй мне это нужно, только ограничивает твою свободу, анон
>Ты не знаешь, какие дипломы за бугром нужны
Хуйня эти твои дипломы. Они работодателю не нужны, они нужны государственной службе, которая решает, выдавать тебе рабочую визу, или нет.
Работодатель же пока будет оформлять тебе документы, отправит тебе техзадание, т.е. работать на него ты начинаешь ещё до покупки билетов. Могут ли наебать? Х.з. могут наверное, но переоцинивать свои способности, мол "нахаляву" работать чтобы прислали приглашение, а приглашение не пришло - украли твой труд. Это значит что ты курсовую писал какому-то студенту, а не устраивался на работу.
Вышесказанное справедливо по отношения перектачиков из периферии.
Это копия, сохраненная 22 марта 2021 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.