Это копия, сохраненная 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 помогает читать сложные сишные декларации.
Прошлые треды:
- №56: http://arhivach.ng/thread/563333/
- №57: http://arhivach.ng/thread/563334/
- №58: http://arhivach.ng/thread/573804/ >>1711268 (OP)
Очевидно, что раз тема про побитовые операции, то и вращать нужно биты. 11110000 -> 01111000.
Да, только в двоичном.
В прошлом треде уже отвечал кому то про это.
Прорешай на листочке в столбик и поймешь как с помощью маски (через and), обычных сдвигов, и or сделать.
Я тот анон, кто спрашивал про простую графику под винду на си.
Итак.
Я отчаялся настроить devc++ и codeblocks так, чтобы нормально скомпилился пример анона:
https://pastebin.com/raw/7nu7GzsP
Ебля с path variables в винде а потом разруливать 100500 опций в конкретно каждой IDE мне не под силу, копипастить не понимая ничего - это уже перебор. Тем более я си дошел пока только до 10й главы у праты. Я даже не нуб, я вообще не человек нахуй.
Нашел такое:
https://bigcode.wordpress.com/2016/12/20/compiling-a-very-basic-mingw-windows-hello-world-executable-in-c-with-a-makefile/
Все просто, написал батник, прописал в path mingw32, разобрался с make.
В пару кликов все компилится, а главное - досконально понимаю что происходит на каждом этапе.
Анончик, спасибо за пример с GDI! Теперь можно и за него взяться.
Что поделаешь, я ещё не готов к ебле с каждой отдельно графической системой, со своим апи и миллионом неочевидных зависимостей только для того, чтобы вывести кружочек.
One true way рулит.
Если планируешь работать с mingw, советую поставить msys2. В нём есть пакетный менеджер и куча готовых библиотек в репах для винды. С ним не надо качать по отдельности хуй пойми кем собранные бинарники и ебаться с путями.
https://github.com/cemsina/snake-game-c/blob/master/Snake/Snake.c
и пытаюсь скомпилировать, но выдает ошибки. Почему?
Я знаю, что С передаёт обычные переменные по значению, а массивы -- по указателю или чё-то такое, в общем, оригинал, фактически, но почему вообще там значения изменились? Все числа влезают в char, т.е. старшие биты не обрезаются, сам char это представление чисел фактически, чё он машнит тогда? Объясните, поалуйста
> По идее, он приводит массив из char в int в момент передачи массива как аргумента функции.
Ну да и память, которую ты заполнял, как массив чаров размер которых 1 байт, он будет видеть как массив интов, размеров которых 4 байта.
Ого, всё, понял, спасибо
Создаешь пустой консольный или GUI С++ проект, создаешь файл, сохраняешь с расширением .c.
>Почему с типом char он возвращает -1?
Почему ты не получаешь предупреждение? А?
Ну-ка быро включил предупреждения!
Например xlib:
>Seriously, XLib is a load of crap.
>
>The numerous tiny "off-by-one" errors, the pathetic font handling, absolutely no native support for anything useful forcing you to "reinvent the wheel", "reinvent the engine", "reinvent the car", and if you want it fast, "reinvent the driver".
>
>It is worse than the Windows GDI API and even slower by definition because of the architecture.
>
>The only way you will ever make anything decent: write a layer building everything you need from scratch using XLib as little as possible. Anything more than a strict subset and you'll be wasting cycles waiting for your graphics to cross the socket boundary, while the processor switches contexts, and the user is wondering what in the world is taking so long to see an 8bit billboard "fire its laser".
Можно взять Skia/Cairo. Вот, например, линкрандом: https://gitlab.com/cairo/cairo-demos/-/blob/master/X11/cairo-demo.c Все зависит от того, что именно тебе нужно кроме рисования кружочков. Алсо, в винде проще по-быстрому накидать интерфейс (разумеется, если с Qt не сравнивать, но Qt - это уже кресты).
анон с кодом для GDI
>что именно тебе нужно кроме рисования кружочков
В конечном итоге хочу арканоид свой написать. GDI для этого хорошо подходит, как я понимаю.
> В конечном итоге хочу арканоид свой написать
Надо было сразу сказать. Вот как раз для этого лучше взять SDL2, кружочки рисовать в фотошопах/гимпах/whatever заранее, а в игре использовать их уже в виде готовых текстур с прозрачностью. Скорее всего, ты сделаешь атлас типа пикрелейтед, захардкодишь в исходник координаты и будешь брать кусочки из атласа по известным координатам и копировать их во фреймбуфер. Чтобы длинную платформу сделать, берешь концы от короткой, а середину дублируешь несколько раз.
На GDI ты, конечно, тоже можешь такое сделать, но тогда ты через пару дней придешь в тредик с вопросом, почему все мигает, и как сделать двойную буферизацию, а чуть попозже попробуешь сделать что-то более динамичное, чем арканоид и начнешь спрашивать, хули так медленно. Начнешь отрисовывать графику при старте... и в итоге придешь ровно к тем же самым текстурам. Потом упрешься в скорость BitBlt (это копирование изображений), в итоге возьмешь те самые Direct[Draw|2D|3D]/OpenGL, которые используются в качестве бэкендов в SDL2. Такие дела. Но. Я когда-то писал софтрендер с выводом через GDI, было вполне норм. Алсо некая успешно почившая ныне технология Adobe Flash в standalone плеерах тоже успешно использовала GDI, и ничего особо не тормозило. Чтобы реально упереться - надо постараться.
>кружочки рисовать в фотошопах/гимпах/whatever заранее, а в игре использовать их уже в виде готовых текстур с прозрачностью. Скорее всего, ты сделаешь атлас типа пикрелейтед, захардкодишь в исходник координаты и будешь брать кусочки из атласа по известным координатам и копировать их во фреймбуфер. Чтобы длинную платформу сделать, берешь концы от короткой, а середину дублируешь несколько раз
Блин, именно так я и думал! Я понятия не имею как это называется, но я посмотрел на ютубе один чувак разбирал Dave1 и там в exe-шнике были все текстуры упакованы со смещением. Я впечатлился.
Но спасибо тебе огромное, я хоть начал понимать что за GDI такой, плюс приятно осознавать что я более менее правильно думал.
>в игре использовать их уже в виде готовых текстур с прозрачностью. Скорее всего, ты сделаешь атлас типа пикрелейтед
А разве GDI так не умеет?
sqlite возьми.
Там не так много базы и надо. Игрушка как раз хороший учебный проект — сначала пишешь ее в систайле, потом пакуешь шарик игрока и штуки которые надо ломать по классам, потом перестаешь использовать стандартные структуры данных, пихаешь в контейнеры, делаешь маленькую базу данных куда пихаешь хайскоры, по приколу добавляешь пуканье джейсонами/хмлками, потом пишешь установочник.
Я так и собираюсь делать, лол, спасибо!
Я имею ввиду что я еще прату не закончил.
>пуканье джейсонами/хмлками
>темплейты вместо обычных классов
А вот сейчас ничего не понял.
>пуканье джейсонами/хмлками
Примерно 70% реальной работы современного софтвейр инженера, особенно на бекенде.
>Темплейты вместо обычных классов
Стандартные классы и new delete залупу мало кто использует. С помощью темплейтов реализуют такие замечательные вещи как наследование, фабрики, и етц, отсутствующие по дефолту.
>Примерно 70% реальной работы
Как и в любой профессии, тащемта, нет?
Я например инженер, так именно конструированием я занимаюсь тоже где-то 30% времени. Всё остальное это репорты, бланки, митинги и исправление косяков молодых.
Тащемта да, но я говорил конкретно о части работы о которой в первую очередь фантазирует ньюфаг, думая пойти в бекендеры.
>бекендеры
Согласен. Из всех утюгов реклама мегакурсов ФУЛ СТАК НА ПИТОНИИ ЗА 6 НЕДЕЛЬ
СТАНЬ БЕКЕНДЕРОМ ЗА 100500 ЭСКУДО В СЕК
Я задрачивал в детстве игру одну, krypton egg вроде. Единственное приятное воспоминание. Хочу сделать подобное. Просто так.
>потом пакуешь шарик игрока и штуки которые надо ломать по классам
А потом распаковываешь в С-стайл обратно и переписываешь вот на эту хуиту (ПАЛЮ ГОДНОТУ, ВНИМАНИЕ, ПАЛЮ ГОДНОТУ), потому что в соточку долбимся:
https://github.com/SanderMertens/flecs
Современный Си
https://www.youtube.com/watch?v=ieERUEhs910
Алсо много полезного в коментах
Нет, потом иначе так и будешь говнокодить. Единственный кейс когда можно не выносить всё в другие функции — это когда этот код _нигде_ не будет переиспользоваться. А всё, что хоть сколько-то можно переиспользовать (сортировки — вообще максимально дженерик хуита для всего) — выносить.
Это индивидуально. У меня в геймдеве строк 10-20. Иногда, внутренний блок цикла может быть 20 строк, тогда в сумме с бойлерплейтом инициализации/цикла будет до 40. Дальше начинает путаться логика, что от чего зависит. Сложно изменять. Также, вынос в функции больше зависит от переиспользования. В учебной программе тебе это незаметно. Но в реальной практике ты захочешь применить этот же алгоритм к другим структурам. Или наоборот, с этими данными провести другую операцию. И вот уже у тебя +80 строк копипаста на ровном месте.
640x360, 1:13
Думаю, может, мне стоит немного посидеть поучить основы С? Я не планирую когда-либо работать с этим языком, но насколько я слышал от прошаренных типов, С очень понимает в понимании того, как работает компьютер, что вообще такое программирование, как программа взаимодействует с железом, всё вот это вот. Насколько С вообще может мне помочь в плане такой теоретической базы? Или жс/питон уже настолько абстрактны, что никак не связаны с С?
Да, помогает.
Нет, не помогает.
Это я на малине делал с помощью питона.
А, еще указатели. В js то их нет.
Вообще никак не помогает лол, си под х86 это такая же высокоуровневая прокладка как питон или жс, высоко над уровнем железа. Ты можешь дергать системные пукалки вроде посикс, но сама система для тебя останется таким же черным ящиком, как и в случае с любым другим языком. А вот если ты углубишься в физику, информатику и конкретно реверс — то ты уже поймёшь как работает система, компьютер и конкретно железки внутри, только с изучением си это ничего общего не имеет
Мимо-шел кресточмо джениунли не понимаю почему ньюфаги думают наоборот
Ну так Си изучать вне отрыва от ассемблера который на выходе - бессмысленно.
Так в жс абстракции слишком высоки, ты тут не char'ами оперируешь, и даже не байтами (хотя в целом можно и ими - есть типизированные масивы сырых данных). В 2020ом строка даже сразу на unicode символы разбивается при проходе по ней циклом, так что не надо выебываться с codepoint'ами. Я слабо представля, что он имел ввиду под пониманием как работает компьтер, потому что для этого и не надо в общем-то языка учить, можно книжки почитать. А если хочется низкого уровня для самообразовани, то ассемблеры куда интереснее и образовательнее, чем си. Си надо выбирать уже чисто из практических соображений.
Ну или если тебе нужна оптимизация по матями, а не по скорости.
Я схемотехник, код мне по факту нужен только, чтобы гонять байты туды-сюды, и в своей области мне не трудно накатать что-то, что может работать. Но вот я хочу сейчас и прямо сейчас сука написать что-то под винду, как у меня ступор.
Хочу вырасти как системный инженер, для этого нужно уметь больше, чем умею я. Для меня в схемотехнике все довольно просто — есть входной сигнал, есть выходной, колдуй так, чтобы на выходе получилось то, что нужно, используя готовые модули вроде микросхем и так далее. Хочешь больше — колдуй с МК. С горем пополам я в свое время научился делать всякое с дренейками с STM32 используя их ПО и сервис мануалы.
Так к чему я клоню? Я знаю, как сделать у себя в голове проект для какой-нибудь платы, потому что примерно знаю, что должно быть внутри, как это подключается и так далее. То есть я могу представить, КАК это работает, ЧТО для этого нужно и другие подводные. А как блять сделать что-то другое нахуй?
Вот хочу сам себе доказать, что могу. Хочу сделать хуйню чтоб пикчи переводила в пиксель арт. В интернете говорят "Ну вы накидайте там проект на коленке и пишите код". С написанием кода есть тонна учебников, в этом проблемы нет. А как накидать проект то сам? Откуда эту инфу взять? В схемотехнике есть даташиты и сервис мануалы на используемые компоненты, можешь что угодно подобрать. А тут сам ебисб, ток документация на язык и колдуй с ним чо хочешь. Я не нашел нихуя (может плохо поискал) как сделать интересующую меня задачу вот прям сделать.
А даже если бы и нашел, это был бы копипаст чужой реализации, т.к. чтобы доделать туда что-то свое мне нужно было бы взять другой велосипед другого Васи и вставить в этот велосипед. По сути это и есть модульный способ создания чего-то нового, это окей, в схемотехнике также как раз, но как мне при этом все в голове у себя собрать? Откуда я могу знать, что мне должно понадобиться в данной программе? Где про это то прочесть? Хочу писать программы, но не могу.
Кому не влом, напишите хоть тут, как вы видите структуру пиксель арт генератора, хоть с вашего пинка попробую что-то сделать.
Я схемотехник, код мне по факту нужен только, чтобы гонять байты туды-сюды, и в своей области мне не трудно накатать что-то, что может работать. Но вот я хочу сейчас и прямо сейчас сука написать что-то под винду, как у меня ступор.
Хочу вырасти как системный инженер, для этого нужно уметь больше, чем умею я. Для меня в схемотехнике все довольно просто — есть входной сигнал, есть выходной, колдуй так, чтобы на выходе получилось то, что нужно, используя готовые модули вроде микросхем и так далее. Хочешь больше — колдуй с МК. С горем пополам я в свое время научился делать всякое с дренейками с STM32 используя их ПО и сервис мануалы.
Так к чему я клоню? Я знаю, как сделать у себя в голове проект для какой-нибудь платы, потому что примерно знаю, что должно быть внутри, как это подключается и так далее. То есть я могу представить, КАК это работает, ЧТО для этого нужно и другие подводные. А как блять сделать что-то другое нахуй?
Вот хочу сам себе доказать, что могу. Хочу сделать хуйню чтоб пикчи переводила в пиксель арт. В интернете говорят "Ну вы накидайте там проект на коленке и пишите код". С написанием кода есть тонна учебников, в этом проблемы нет. А как накидать проект то сам? Откуда эту инфу взять? В схемотехнике есть даташиты и сервис мануалы на используемые компоненты, можешь что угодно подобрать. А тут сам ебисб, ток документация на язык и колдуй с ним чо хочешь. Я не нашел нихуя (может плохо поискал) как сделать интересующую меня задачу вот прям сделать.
А даже если бы и нашел, это был бы копипаст чужой реализации, т.к. чтобы доделать туда что-то свое мне нужно было бы взять другой велосипед другого Васи и вставить в этот велосипед. По сути это и есть модульный способ создания чего-то нового, это окей, в схемотехнике также как раз, но как мне при этом все в голове у себя собрать? Откуда я могу знать, что мне должно понадобиться в данной программе? Где про это то прочесть? Хочу писать программы, но не могу.
Кому не влом, напишите хоть тут, как вы видите структуру пиксель арт генератора, хоть с вашего пинка попробую что-то сделать.
while ((op=get_char())!='q')
Вот на пике функция, на втором выход. Когда туда успевает набиться ложное значение?
>как вы видите структуру пиксель арт генератора
Для начала тебе нужен алгоритм уменьшения изображения. Например, простым будет алгоритм k-nearest neighbors (ближайшего соседа).
Ты переводишь изображение в матрицу (двумерный массив) пикселей, затем делишь её на квадраты по n (например, 4 или 9) пикселей. Затем из каждого квадрата ты выбираешь самый популярный цвет пикселя, и переносишь его на новый холст (который в n раз меньше). Если изображение большое - этот шаг можно повторить несколько раз. Готово, ты реализовал уменьшение изображения до пиксель-арта.
Дальше тебе (скорее всего) нужно уменьшить количество цветов. Ты делаешь список самых популярных цветов изображения, затем перекрашиваешь в них менее популярные, у которых разница в оттенке меньше определённого порога. Ещё один вариант - ты создаешь палитру, например, из 256 цветов и округляешь все цвета до значений из этой палитры.
Здесь уже остаются только тривиальные задачи вроде открытия исходных и сохранения получившихся изображений.
А вот в таком виде всё ок.
Начни с интерфейса, окошки там кнопочки, вид до вид после. Или тебя алгоритм преобразования интересует? Тут наверное берёшь пиксель увеличиваешь размер потом лишнее разрешение режешь.
байтоебы творческие импотенты
ну хуй знает, формат bmp норм описан даже на википедии, выводить буковы и циферы в консоль, надеюсь умеешь, дальше действительно
>колдуй с ним чо хочешь
А как ты хотел? И свою фантазию не включать, и чужие велосипеды не пиздить? Противоречиво... Так-то про все есть инфа. Те же основы 3d-графики, а дальше колдуй че хочешь, например.
зоебал я же хочу не ковырять и искпеременитровать, а статью чейтануть какую-нибудь
K&R устарел не слишком сильно, о нововведениях можно прочитать и позже, за вечер. На русском еще много чего есть, тот же Прата, но лучше взять словарь и оригинальное издание. Без английского в программировании делать нечего.
Ты бредишь чтоль? Тебе не нужно переводить на русский названия определений вроде variables или arguments. Если совсем с этим туго, то тебе нужно только непонятные слова перевести в описании этих определений, чтобы понять, что целиком определение значит (milk — жидкость из вымени коровы, ну ты понял). Ну или даже если хочешь и их перевести (чтобы самому было понятнее), переведи и их. Откроешь для себя, что variables в русском языке означает переменная. Все равно будешь везде говорить variables.
Ты ахуеешь, но тебе надо не переводить с английского на русский, а понимать английский текст для программирования, т.к. на нем ты и будешь общаться с машиной (ну или 1С тредис по соседству). Тебе все равно в конечном итоге придется на нем со всеми общаться, начинай уже сейчас (как бы тяжело не было).
Для словаря не знаю, что используют остальные, мне хватает translate.google.com
покормил
Ну вот тут недавно спрашивали про задание из K&R про разворот битов чёт как то не помогли эти гуглы. Я попробовал на edx курс по Питону на английском там вообще субтитры гуглем переводил было ощущение что придумываю половину. Вот например boilerplate как первести? Там больше проблем не сопределениями а с действиями.
Водя машину ты ведь не поймешь, как она работает.
Бери учебники по теории цепей, затем по схемотехнике, затем пытайся сам делать платы, которые что-то полезное делают.
Почему? Ну я так понимаю это от места работы зависит. Но куда идти, если хочется чтобы мозги использовались?
>В нии какой нибудь иди
Переписывать/реверсить под грифом и подпиской украденную у доблестными петром и бошировым прошивку какого-нибудь GBU-28AAN "Annihilator" для очередного АНАЛО-ГОВНЕТА? Действительно, мозги нужны.
Ты хохол или либирашка? Я вас не оч пока различаю
Плата-Бойлер, что-то из оборудования котельных, видимо
>Вот например boilerplate как первести?
Типа бабкину плиту-буржуйку заставленную пыхтящими кастрюлями представил? И как бабка с поварежкой на измене суетится бегает, открывает крышки мешает, тут хуяк одна такая кастрюля с борщом с капусткой внучеку убегает кхуям?
Вот это оно.
Ну и как идиома, вот эта вот плита буржуйка с кастрюлями которые дохуя нужно варить там ингридиенты засыпать применяется к коду, как правило работа с каким-то API.
Яркий пример - графическое API Vulkan, да и DirectX 12 - там нужно 2000 строк только что бы нарисовать сраный треугольник.
Зачем тебе оффлайн словарь в области, которая каждый месяц что-то новое в себя приносит. Гугли и все. В работе программиста огромная доля работы с поисковиками.
Охуительный совет чтобы стать новой Никселькиксель.
Антоши, как посчитать сам ов сквеар интеджеров до 10000? Я попытался лупой, но вариэйбл становится негатив"
действует 2 дня.
(моча не три) (похуй)
https://www.udemy.com/course/c-programming-for-beginners-programming-in-c/?couponCode=1_MONTH_GRATITUDE
сам по себе вопрос странный же говорю, почему другие должные придумать как использовать твои мозги если ты сам не знаешь их приминения, найди блят лекарство от рака зоебал
анон молодец, что сюда принес халяву, славься анон бескорыстный!
Так то занятие для них я могу найти с легкостью. Другое дело будут ли мне за это платить.
мимо кресто-барон ахуеваю что есть люди реально купившие это за деньги
> лупой
Лупом. В остальном все правильно. Все так. Это лучше, чем переводить convolution как "свертка", а deconvolution как "деконволюция". Русская языка велика есть, но для техники совершенно не подходит.
"Кресто-пидар" ты хотел сказать? Тред для хипстеров и гомосеков ниже.
если ты такой умный, то чому ты еще не наебал систему? а? А? у илона маска было нихуя, а он же наебал, а ты нет. глупо тут аписнять что важно а шо нет когда ты сам ето знаешь, хочешь интересных задач так ищо шобы платили за них тебе, могу только губозакаточную машинку посоветовать купить
Я практически один в один переписал пример из книжки.
Не понимаю почему?
>expected ')' before numeric constant
> void copy_arr(target1, source, NUM);
https://pastebin.com/P9NaKEZc
нахуй у тебя объявлена функция в стиле до-С89? Если это прототип то нахуя у тебя сама функция в этом же файле лежит?
че за тему конкретно читаешь? Если тебе именно с прототипами надо то компильни со стандартом 89.
Нельзя макрос передавать в функцию, потому что в данном случае у тебя copy_array(target, source , size) разворачивается в copy_array(doube target, double source, int 5) и компилятор не считает это адекватным
если без прототипов то держи вот фигню
Блин, спасибо, я не заметил что перед вызовом функции зачем-то ее тип написал (void). Меня сбил с толку информативный выхлоп компилятора.
люби свой компилятор сука. Пока не будешь его понимать и любить он тебе будет срать в еду и говно в жопу заталкивать
Окей, буду стараться.
Нашёл один из примеров: https://github.com/espressif/esp-idf/blob/master/examples/protocols/http_server/ws_echo_server/main/ws_echo_server.c#L84
В нём создаётся указатель на структуру, который недоступен из вне.
Подскажите, плез, как можно переделать?
Есть, но оно не подчеркивает ошибки семантики, только синтаксиса.
Я просто хочу прорешать всего прату чтобы перейти уже к изучению крестов.
Это единственный правильный путь.
Но... Страуструп...
>Чё? Нахуя тебе ваще си чтобы катиться в крестоиды?
>да, C++ это по-настоящему сложный язык. Его никак не получится выучить за 21 день, ну вот совсем никак. Именно высокий порог вхождения повышает твою ценность как специалиста, не позволяя нанять вместо тебя индуса за еду. Более того, крайне нежелательно пытаться изучить его первым, если ты раньше вообще не программировал. С большой вероятностью это приведет к разочарованию и потере времени. Гораздо лучше будет начать с другого языка и базовых вещей алгоритмы, архитектура пека, операционные системы, а уже потом вернуться к крестам.
C++ Primer Plus например, состоит из отсылок к С примерно наполовину. Собственно, в введении там явно написано: сначала надо знать С.
Лол, так под "другим языком" подразумевают не Си. А какой нибудь пайтон или жс.
Bump.
эмм, а нахуя для этого писать драйвер, который будет крутиться в пространстве ядра? Юзерспейс эмулятора вполне хватит, но это ведь не цель.
Файл драйвер. Шифровальщик Xor13
Или какой нибудь драйвер клавомышки бот для кликеров.
фу, чуть не блеванул от упоминания этой параши. Не делай так больше, анон, пожалуйста.
Для поинтеров в шапке весьма годная и краткая пдф есть.
> Программы для устройств Pocketbook пишутся на C с использование компилятора GCC
А вообще, как то можно написать логику на крестах, и как то работать с ней из кода на си?
Да. Сделать сишный интерфейс (extern "C", не не использовать C++ типы, перехватить все исключения). Ну и рантайм для C++ должен присутствовать.
Там линукс вообще стоит
Сделал так.
Не знаю, будет ли работать. По крайней мере компилятор не ругается.
https://pastebin.com/tbSWWZzp
Я начинал с k&r свой путь, лучшая книга для вката.
Нахуй тебе си, обмудок?
Прата качественнее.
>>1739810 →
> Для Си умельцы скорее всего тоже либ уже налепили.
Зачастую, кстати, у С-дедов такие библиотеки дают лучшую производительность, чем у С++-миллениалов. Быстрее только на чистом ассемблере. Деды в целом и это могут, но долго это. Поэтому на чистом ассемблере пишут только местами: ту логику/вычисления, которая исполняется 85-99% от общего времени.
Программирование на C для начинающих, 3-е издание. Грег Перри, Дин Миллер посмотри эту, ещё Дейтелы.
Ну и, болтанка в +- полтора кекогерца. Те же пресловутые 5.8 кекогерц опять же были у IBM в те же нулевые в штатном режиме под штатной водой в одном из древних Power.
Как вообще вкатится в эти битовые операции? Я до сих пор не понимаю нахуй оно нужно и как работает. Нет, я конечно могу прочитать определение и понимаю что надо делать, но не понимаю нахуя и зачем, где это вообще применять.
Разработка прошивок, драйверов, виртуальных машин - первое, что приходит на ум. Вся лоу-лвльщина активно юзает битовые операции.
Будешь декодировать опкоды - поймешь почему битовые операции иногда мастхэв.
Что почитать, чтобы понять где их вообще и когда применять? Ну вот в том же k&r чуть ли не с первых глав идет это битоебство, причем предполагается, что ты его уже знаешь и знаешь где как применять.
Для начала выучи системы исчисления - шестнадцатиричную и двоичную, если не знаешь. Это основа байтоебства. Октальная тоже не помешает, но первые 2 мастхэв, они приоритетнее, особенно на первых порах.
Потом выучи все основные битовые операции - AND, OR, NOT, XOR.
Пойми что такое LSB/MSB, big/little endian, shift left/right, signed/unsigned числа.
Где это применять? Ты это сам решишь. Но я уже перечислил виды софта, где это часто используется.
Пример - у тебя есть 2-байтовое беззнаковое целое число (читай, uint16_t), допустим это число - 1337. В шестнадцатиричной системе это 0х539, в двоичной - 0000010100111001.
Допустим, тебе надо извлечь старший байт этого числа, а это 0х05 (или 00000101 в двоичной). Ты должен создать т.н. маску - в данном случае она будет выглядеть так - 0хff00 (в двоичной - 1111111100000000). Затем, ты должен знать true table операции AND, чтобы понять следущее:
0000010100111001 & 1111111100000000 = 0000010100000000. В шестнадцатиричной это выходит 0х50. Чтобы получить из этого желаемый старший байт (0х05), ты должен сделать сдвиг вправо на 8 бит (каждая отдельная цифра в шестнадцатиричной системе - это 4 бита), получится 0000000000000101. 101 в шестнадцатиричной - это 0х05, то бишь 5 в десятичной.
Вуаля, из числа 0х539 ты извлек старший байт и можешь его использовать для своих нужд.
Примеров использования очень много, это один из наиболее легких и распространенных. Сначала почитай о тех темах, которые я написал в начале этой простыни, как поймешь все это, вернись к этому после за продолжением, где я извлекал старший байт из двухбайтового числа.
Это несложно на самом деле, просто надо привыкнуть.
В жизни наверное нет очевидных примеров чтобы объяснить как сложение на яблоках. В первую очередь приходит в голову комбинаторика - например, битовый set, где каждый бит означает свободно или занято. Сдвигами можно перемещать по местам, можно проверять свободные места, занятые места, проверять по маске конкретные места, сравнивать списки мест, находить свободные/занятые одним/занятые в обоих сетах, считать количество занятых.
Дальше у нас трюки связанные с двоичной арифметикой. Ну как мы проверяем четность в десятичной - если оканчивается на 0,2,4,6,8 - четное. Так в двоичной нам достаточно проверить крайний правый бит. Аналогично левый крайний бит обычно означает отрицательное число. А сдвиги - быстрое умножение на степени двойки (как в десятичной сдвиг на 1 цифру это умножение на 10). Фишка в том что это все намного быстрее всяких делений,умножений, в железе.
Далее, используется в шифровании, контрольных суммах, псеворандоме, подсчете хэша строк. Тут сложно объяснить, суть в закольцованности чисел (как часовая стрелка закольцована и после 12 снова 1). Т.е. одна и та же операция сделанная много раз подряд похожа на "обход конем шахматного поля", пока все поле не обойдешь числа не повторятся.
Далее, в архивации/сжатии, т.е. вообще везде - ZIP, PNG, JPEG, WEBM и так далее. Упрощенный пример - если у тебя только буквы a-z это 26, меньше 32 - влезает в 5 битов. Вот для того чтобы конвертировать поток 5-битных данных в обычные 8-битные байты и обратно, тоже нужны побитовые операции.
>Как вообще вкатится в эти битовые операции? Я до сих пор не понимаю нахуй оно нужно и как работает. Нет, я конечно могу прочитать определение и понимаю что надо делать, но не понимаю нахуя и зачем, где это вообще применять.
У тебя есть гугль, вики, СО и хабр. Нет, ты пришел с этим вопросом на борду для анимешниц.
Правильно. Писать что то на c смысла нет.
Неправда. Чтобы найти sdl2 на с++ это еще надо очень сильно постараться.
Я сделал и мне понравилось, тащусь с такого:
https://pastebin.com/h50E6zBm
Мало того что про крайне, крайне узкоспециализированную парадигму для области где нужны уже кресты, так еще и всё на шаблонной магии построено.
Ну и как бы сама парадигма она про очень YOBA ААА с очень большими бюджетами, где нужна оптимизация.
>Как вообще вкатится в эти битовые операции? Я до сих пор не понимаю нахуй оно нужно и как работает.
Смотришь таблицу истинности
& - 1 когда в обоих числах в этом месте 1.
| - 1 когда зхотя бы в однгом или в обоих
^ - 1 когда только в одном из двух, но не в обоих.
Из этого следует, что проверяем битики с помощью &, склеиваем маску из отдельных битов с помощью |. Сами биты -это степень двойки, пушо двоичная система. То есть 1 - первый бит, 2 - второй бит, 4 - третий, 8 - четвертый, 16-пятый итд. Эти числа (степени двойки) ты дефайнишь по смыслу и получается вот всякие вот маски.
>для области где нужны уже кресты
Тип там со стороны крестов как-то неудобно конкретно этой библиотекой пользоваться?
>на шаблонной магии построено
Вангую, без неё тут охуеешь от boilerplate строчек, то есть шаблонная магия - уже требование.
>Ну и как бы сама парадигма она про очень YOBA ААА с очень большими бюджетами, где нужна оптимизация.
Окей, ну вообще был вопрос про конкретно эту библиотеку. Для использования "большими" она уже сгодится?
fread((char *)&structura + 36, 1, 8, file);
Я просто точно не уверен. Но если там будет андерфлоу.
В крестах предпочитают шаблонную магию, вместо макросов.
Нет, вроде отключить нельзя. Ручками делай.
https://stackoverflow.com/questions/121240/how-to-do-unsigned-saturating-addition-in-c
Вроде есть флаг компилятора чтобы программа падала в случае переполнения.
Заворачивание беззнаковых задано стандартом.
Переполнение знаковых не определено, отлавливается -ftrapv
Спросил что посложнее - проигнорили. Заебись.
Перепиши, чтобы не было волшебных чисел
>Richard M. Reese "Understanding and Using C Pointers. Core Techniques for Memory Management" (2013)
пока все хорошо
Если ты про те сокеты, то никто не собирается писать за тебя программу. Если нет, бампани вопрос.
>>62622
Бля, а нахуя люди такие комменты пишут?
Мало того что неправильный термин, так еще и не раскрывающий сути коммент. Если swap еще понятно, что делает функция, то disp - загадка, то ли disposition, то ли dispersion то ли еще что.
Раз ты пишешь коммент к функции, то напиши человеческим языком, что делает эта функция, то что это определение функции я и без тебя вижу, дублировать такую информацию ни к чему.
Ну а вообще, комменты не нужны, надо правильно подбирать имена, чтоб они сами за себя говорили.
display обычный
>никто не собирается писать за тебя программу
Я не просил писать за меня программу. Процитируй, где именно я об этом прошу.
inb4: ты об этом подумал, да
Мне нужна была и, возможно, потребуется (т.к. ещё не проверял свой говно-код) небольшая помощь.
Конкретно в том случае - меня смутил указатель на структуру, который нужен только для того, чтобы скормить его функции, принимающей указатели на структуру.
В примере он доступен за счёт вложенности. А мне он нужен глобально.
Вроде вывернул, но проверить пока не судьба.
Я покакол. Такие дела. Говно было длинным и долго не хотело вылезать, но потом все-таки вылезло.
И вот что я тебе скажу: ты ни за что не назовешь мне его тип правильно. Вот оно, смотри:
int ✱(✱arr(int, char ✱ const (✱const ✱)⟦10⟧))⟦20⟧;
Ты не сможешь.
Съеби
Тулчейны тут не при чём.
Вопрос целиком Си-шный, по указателям на структуры.
У тебя от просмотра чужого кода, размером в три жалких функции, выпадает дилдак из очоча?
Тема закрыта. Спасибо за внимание.
А кого ты здесь хотел видеть? Гуру отвечают только за деньги, осиляторы расскажут, что могут.
Бамп
arr is a function of
1. int
2. ptr to const ptr to array[size=10] of const ptr to char
returns array[size=20] of ptr to int
arr is a function of
1. int
2. ptr to const ptr to array[size=10] of const ptr to char
returns ptr to array[size=20] of ptr to int
Еще разок
Ну ты же в силу своих знаний не видишь, что как такового "main" у программы нет, а независимые хендлеры из других контекстов вызывает httpd (обычно это простой демон). Хоть бы разобрался, что дяди написали в примере, потрейсил.
По той же скромности познаний ты не слышал, что сокет закрывается вместе с соединением и вне обработчика (и процесса) его дескриптор не имеет смысла.
Твое желание идет полностью вразрез логике примера.
Но если тебе хочется собирать открытые соединения, то их можно хранить в глобальном списке за rw-локом. Может быть что-то для этого есть и в фреймворке, но читать доки я не собираюсь. Да, этот вопрос
> Тулчейны тут не при чём.
исключительно об этом тулчейне.
Нужно быть чуть менее резким, если ты сам не можешь поставить задачу и не знаешь как работает либа и пример.
>#ifdef __x64_x86
>typedef int64_t INT_T;
>#endif
>#ifdef __i386__
>typedef int32_t INT_T;
>#endif
За такое выебут в жепы?
Нет, если __макросы стандартны для твоего конпелятора.
Хоть уже и поздно но почему? Мне интересен как лоулевел си со всеми этими контроллерами, ядрами, драйверами так и кресты со своим многообразием.
Перечитай три поста в цепочке, не ставь C и ядра с драйверами в один ряд. Если C можно освоить за 1к страничек, то к ядру того же линукса ты приступишь только прочитав альманах раз в 10 больше.
>три поста
Да ну нахуй, Прата поинтереснее. Как раз 200 страниц осталось добить. Прекрасно понимаю что это только начало и дальше ебаться придётся сильно очень. Но мой план таков: базовый С - C++ до продвинутого левела - устраиваюсь на работку - добиваю C.
>Как раз 200 страниц осталось добить
Бротан, пока ты не натрахаешься с сегментейшн фолтами и указателями на указатели указателей, а также требованиями хотя бы одного из стандартов, ни о каком "начальном уровне" не может идти и речи.
Как раз таки лучше сначала добить Си до уровня /списки на макросах/указатели на функции/longjmp-контексты/сигналы/posix-треды. Очень поможет с пониманием того, что происходит в ++.
Пошёл трахаться чё. За всех двачеров сука, парни!
>указатели
Вообще не ощутил проблем с этой темой. Я нормальный?
Какой стандарт наиболее актуальный? Самый последний или какой-то пораньше? И что долго их учить типо?
>>63791
Бля, а что по работе на чистом си? У меня дедлайн 1 год до вката куда-нибудь.
Бля, ну я же пошутил, ну.
Сама функция swap реализована предельно ебануто, мне просто доставил сам факт возможности такого. Без временной переменной.
>Пользуйся int_least32_t и int_fast32_t в зависимости от необходимости
https://www.qnx.com/developers/docs/6.4.1/dinkum_en/c99/stdint.html
Не вкурю в чем разница и как это связано с совместимостью.
Допустим ты хочешь чтобы программа работала быстро с 8 битными значениями, а в процессоре у тебя 64 битные регистры. Тогда ты берешь int_fast...t, и все работает максимально быстро, но в памяти массив таких значений будет занимать в 8 раз больше места. Если же тебе наоборот важнее место, то берешь int_least...t и компилятор подберет минимальный регистр в который значение влезет. Но там возможны лишние инструкции, типа cbw/cwd/cdq, на преобразование в 64 бита для рассчетов, потом упаковка обратно в 8.
> Бля, а что по работе на чистом си? У меня дедлайн 1 год до вката куда-нибудь.
В целом нужно быть спецом в какой-то области, языка одного не хватит. Вакансии обычно такие: мк, linux (системеный софт, сеть, модули). Больше прям "чистого" си нет. Джун должен уже в чем-то хорошо разбираться, работы мало. Вот так что примерно 10 Прат накодить какой-нибудь системно-сетевой хуеты для linux и что-нибудь сможешь, но года точно не хватит.
Да нормальная библиотека, просто ты даже игровую-то логику заебешься в ECS-парадигму укладывать, что уж говорить про сириус бизнес логику вроде всяких там веб-серверов с откликом 0.5мс.
>Бля, а что по работе на чистом си? У меня дедлайн 1 год до вката куда-нибудь.
Покупаешь у китайцев девборду на stm32, учишь тамошний даташит, покупаешь и обмазываешься радиоконструкторами на всяких там бредбордах, пытаешься устроиться или в пыняронку или в прочие гражданские производственные объединения, еще чудом сохранившиеся после совка, по выпуску утюгов "чугуевск", чей гендир уже сыто облизывается на сдать всю хуйню в металл а недвигу - под офисы и склады.
>или в прочие гражданские производственные объединения, еще чудом сохранившиеся после совка, по выпуску утюгов "
Нужно спешить, пока ты пишешь эти буквы, в раше один красный директор уже пожимает волосатую руку хача трюкача , в то время как грузчики вывозят совковое оборудование (у тех кому повезло в 90е и нулевые и кто сыто мурчали - списанное немецкое) в металлоприемку.
Чому opengl не возьмешь? И тебе нужен будет физический движок? Если да, то мне кажется ты сдохнешь быстрее, чем успеешь все это написать.
А дальше куда? Лендинги клепать за 1,5 рубля7
Вопрос философский какой язык выучит что б потом можно в любую стороны перекатиться?
> А дальше куда? Лендинги клепать за 1,5 рубля7
А дальше на работу где платят в несколько раз больше чем на сях, хотя конечно язык не илитный.
Короч, пчёла ты ерохинская, вот тебе для затравки, чтобы велосипед с самой руды не изобретать:
https://github.com/orangeduck/Corange
прикручиваешь нему вот это:
>>62068
Потом на выбор - или вот это:
https://www.lua.org/pil/contents.html#P4
Или вот это:
https://duktape.org/
И потом делаешь для всего этого гуй. На вот этом:
https://developer.gnome.org/gtk3/
>хотелось бы в конце заработать на стиме
В таком случае переучивайся на сисярп и качай Юнити.
С с очень большой натяжкой может быть востребован в мобильном гейдеве - там есть абсолютно незанятая ниша выосокооптимизированных игорь, которые летают на китайских калькуляторах за десятку из салона связи в зажопинске.
А должен быть готов, если уж полез в сириус С.
Задача должна быть амбициозной.
Движок на сях с редактором и возможностью скриптинга, на котором можно писать быстрый игорь для мобилок-калькуляторов вполне себе амбициозна.
Corange тема, правда как мне показался немного тяжеловат для примитивных (что в 90% случаев пишут) 2d проектов. Для 3d вроде гуд.
мимо разбирал демку платформера и движок
Насчёт где применять - низкоуровневая математика (быстрый обратный корень Кармака, логарифм целого числа, предпосчитанные таблицы синусов и косинусов через сложение и умножение, правда уже не актуально быстрый модуль...), всё мать его хеширование и криптография (любой хеш алгоритм, кодирование Хаффмана...), низкоуровневая работа с ошибками (при передаче данных например), маски и error коды правда тоже не особо актуально, только если в системщине. Что сразу на ум пришло, а вообще - все на низком уровне делается с байтооебством и оттуда порой вытекает магия высокого уровня, например оптимизации в высокоуровневых языках
На плюсах пишется тоже лоу лвл софт, наивный. Ебать битики, разрабатывая на плюсах, отнюдь не редкость.
Когда петушки научатся в отличать UB и ID.
Петушков послушать так нужно венду и лялих сносить -там тоже UB - по указателю в регистры железяк лазиют.
>The following code is the fast inverse square root implementation from Quake III Arena...
long i;
float x2, y;
i = ( long ) &y;
...
y = ( float ) &i;
Если компилировать с отключеным strict aliasing, то норм (а в студии он так вообще всегда отключен)
Всегда
Никогда.
Допустим, у нас есть некоторая библиотека, подключаемая к основной программе, а в ней есть переменная "value". Интерфейсом (API) библиотеки предусматрено только чтение этой переменной.
Правильно ли будет в таком случае сделать переменную "value" статической(т.е. изменять её можно будет только в файле библиотеки), а для доступа к ней сделать функцию чтения этой переменной?
Например так:
>/ Внутренняя переменная библиотеки /
static uint8_t value = 0;
>/ Функция доступа к внутренней переменной /
uint8_t read_value(void)
{
return value;
}
Я не оп, но совершенно правильно.
У такого подхода есть еще плюс: в будущем переменная может быть убрана, а функция сможет вычислять обещанное значение.
>Ну ты же в силу своих знаний не видишь
>По той же скромности познаний ты не слышал
>Нужно быть чуть менее резким
Хех, пока читал - мысленно представлял, как ты раздуваешься, набивая текст, а при отправке трещишь по швам.
>Твое желание идет полностью вразрез логике примера.
Было бы странно, если бы пример делал именно то, что я хотел, да?
double lowest = ((a < b) && (a < c)) ? a : ((b < a) && (b < *c)) ? b : c;
Лол, указатели спиздили.
Лол, только на скрине заметил, что не проставил указатели в конце. Вроде заработало. Спасибо, пацаны!
Ну скобки хоть какую-то редабильность дают этому месиву. Или так норм писать ммм?
Да да да, давай порофли над вкатывальщиком на 8 дне учёбы.
Ок
упд: замена на int32_t не помогла
упд2: MT32_R = 31
Короче, нашел проблему. Единица, которая в начале, воспринималась компилятором как signed int. Решил проблему так:
static const uint32_t lower = ((uint32_t)1<<MT32_R)-1, upper = ~(((uint32_t)1<<MT32_R)-1);
Выглядит отвратно, но хотя бы варнингов нет.
>Единица, которая в начале, воспринималась компилятором как signed int
Натуральные константы можно делать unsigned добавлением u или U если это и надо было
Спасибо. Знал только про существование L и f.
>готовый опкод в С
Чаво? Опкод - кодировка определенной комманды, которую исполняет процессор определенной архитектуры. После опкода идут, как правило, immediate значения и/или регистры, вместе они формируют инструкцию, например, mov rax, rbx => 48 89 d8, в данном случае, опкод это 48, в которую закодирована команда mov в архитектуре х86-64. Что значит, блять, готовый опкод в С? Ты проверь сначала знаешь ли ты то, о чем ты говоришь.
>Где тут КУЧА и причём тут КУЧА?
Куча - это отдельно выделенный сегмент памяти для: а) Хранения буферов, размер которых неизвестен во время компиляции. б) Для хранения больших буферов.
Попробуй создать массив на 1 гигабайт на стэке, у тебя программа свалится в сегфолт из-за переполнения стэка. Стэк - СТАТИЧЕСКИЙ сегмент памяти, который используются для вызова фнукций (стэковые фреймы процедур определяются как раз там), для хранения переменных окружения и локальных переменных. Куча - ДИНАМИЧЕСКИЙ сегмент памяти, использование которого я объяснил чуть выше.
Куча емнип там же где и стек, т.е. в сегменте данных. Стек и куча могут даже пересечься, т.к. увеличиваются навстречу друг к другу. как-то так, вроде.
Это зависит от ОС, в Линуксе, например, между стэком и кучей есть memory mapped area, куда маппятся все динамические либы (тот же libc) и где выделяется память при системном вызове mmap.
>могут даже пересечься
В популярных ОС этого не случится. Размер стэка статичен, а вот при выделении слишком большого кол-ва памяти на куче, если следующая аллокация затронет стэк, то память на куче просто не выделится и malloc вернет NULL
>Единица, которая в начале, воспринималась компилятором как signed int
Моё любимое UB
unsigned long long l = 50000 ⚹ 50000;
printf("%llu",l);
конечно, а как ты себе это представлял? Ты думал, что куча расшарена на все процессы или что? Странный вопрос просто, не обуссудь.
Да я Таненбаума введение читаю, он там нихера про кучу мне не написал пока, только на голову наложил, зато про прерывания от души рассказал по
Вы извините, что я итт спрашиваю, просто где ещё, в джаваскрипт-треде, что ли, лол. В общем шизы одни
По крайней мере второй уровень выглядит избыточным.
Давай я еще раз попробую до тебя донести:
> Надо получить дескриптор и заголовок сокета из обработчика прерываний и сделать их доступными для вызова функции httpd_queue_work() из основного цикла программы int main().
В логике сервера main выступает в виде "стартера", сервер вне хендлеров потоки не порождает. Так что где ты хочешь использовать тот мусор, что можно получить, - загадка.
Заголовок (заметь, не сокета, а http-запроса) будет состоять из кучи поинтеров на разные куски буферов, они будут очищены после отработки хендлера в queue. Получаем мусор на выходе.
Дескриптор сокета после отработки хендлера - мусор.
>Было бы странно, если бы пример делал именно то, что я хотел, да?
Да, даже более странно было бы, если пример создавал отдельный поток и ебашил queue_work() по невалидным указателям и дескрипторам из собраного мусора.
> Хех ...
На вопрос твой никто не отвечал, сам ты усилий никаких не приложил. В ответе по коду ни единого слова, только вот этот перл.
Посмотри на эту функцию:
https://github.com/espressif/esp-idf/blob/master/examples/protocols/http_server/ws_echo_server/main/ws_echo_server.c#L56
Она получает заголовок и дескриптор сокета из обработчика.
Насколько я понял, её можно использовать, чтобы сервер отправлял данные самостоятельно, не дожидаясь сообщений \ запросов от клиента, кроме первого.
>На вопрос твой никто не отвечал, сам ты усилий никаких не приложил. В ответе по коду ни единого слова, только вот этот перл.
Я стараюсь, порой безрезультатно.
> У такого подхода есть еще плюс: в будущем переменная может быть убран
И минус: в будущем переменная скорее всего не будет убрана, и софт будет тормозить на пустом месте, пока его не перепишут с нуля. А ведь можно было просто сказать "не пишите, будет ой-ой".
>mov rax, rbx => 48 89 d8
>опкод это 48, в которую закодирована команда mov в архитектуре х86-64
Если не знаешь ассемблер, зачем выёбываться? 48 это префикс (REX.W), который обозначает, что следующий за ним опкод будет принимать 64-битные операнды. Опкод (точнее, один из опкодов) mov - 89.
Ой, ну какая там разница в скорости. Зато детали реализации надёжно скрыты, а это правильно.
Разница в скорости практически никакая, но подобные стремления все огородить от самого себя никогда не ограничиваются одной переменной.
>>65967
Не решает проблему. Если у тебя либа, и ты выкинешь __val, то старые версии программ ее не найдут. А если ты контролируешь код, который использует эту переменную, то у тебя вообще проблем нет - встроенный в любую IDE рефакторинг отлично заменит использование переменной на вызов функции. И даже если рефакторинга нет, и ты вимомазохист, ты все еще можешь одними регэкспами справиться.
>расскажут
Читаю каждый пост в двух тредах, отвечаю только если совсем нехуй делать, или если прям непосредственно в день или в неделю в которую читаю вопрос разбирал тему, которой он касается, ну или если вопрос написан ну прям запредельно адекватно (редкость). На высеры вроде пацаны чето не компилица ебанешься... или ахуеть как джейсон валидировать от сука! любому адеквату (и не только) отвечать будет попросту западло.
мимо кресто-барон 7 лет коммерческого опыта, на крестах и сях со школы
Нормально, все энтри левел книжки более-менее одинаковые.
>любому адеквату (и не только) отвечать будет попросту западло.
Ну да, ну да.
Сюда ты зашёл в надежде обсудить теорему Сосницкого-Лавуазье. А тут на тебе, у кого-то что-то не срастается на каком-то уровне. да как они посмели.
Пошёл на хуй, короче.
на месте, я спокоен
А Прата как же?
Почему? Современно, модно, молодежно.
if(IP>=SIZE_PROG || IP<0 || somefunct(&IP)) return -1;
ИП после вызова вероятно получит новое значение. Я же правильно понимаю, что конпелятор ЭНИВЕЙ выставит самый высокий приоритет функции, а потом уже распределит остальное?
>>66080
Что-то хер встал с этих аннотаций.
>что конпелятор ЭНИВЕЙ выставит
На компилятор нельзя надеяться.
Нужный тебе приоритет нужно обозначать скобочками, как в условиях, так и в арифметических выражениях.
Как в нашей конторе говорили дедушки (си-синьоры с большим опытом работы): "На компилятор надейся, да сам не плошай".
Судя по ассемблерному листингу, приоритет у первой операции. А дидам - спасибо, так и сделаю.
Нет, с чего ты взял? Слева направо, причем до первого сработавшего.
int a;
some_actions(&a);
if (a && a==100)) printf("*a==100!");
Вопрос: можно ли так писать и почему?
Писать то можно, ведь компилятор и не такое сожрет.
Но не нужно, потому что тот, кто будет поддерживать твой код, найдет твой адрес и даст тебе люлей за такой говно-style.
Одна из Парадигм Правильного Программирования (ППП) гласит: когда пишешь код, всегда пиши его так, как будто бы человек, который будет работать с твоим кодом, знает твой адрес.
>Евгеньваганыч
Я писал пост абсолютно серьезно.
> вопрос был не про стиль, а про корректность последней строчки.
Мой пост и относится к последней строчке. Написана она через жопу: почему человек, который будет читать твой код, должен догадываться, как компилятор выставит приоритет в условии? Поставь нужные скобочки, чтобы приоритет мог трактоваться однозначно.
Расскажите, что и как у вас в плане сложности обучения и можно ли вылететь из школы, если нихуя не социализированный хиккан
Подумай пчел, это для совсем необучаемых дебилов. И туда как бы идут всякие дядьки по 32-35 лет без образования, я не шарю но думаю ты там не в своей тарелке будешь. Ну и если бы ко мне на собеседование хрюшка (особенно если бы мне нужно было найти си-тварь) привела пчеленсона и он бы представился как ученик школы 21 я бы ему сразу сказал эм ну нам надо подумааать))
>привела пчеленсона и он бы представился как ученик школы 21 я бы ему сразу сказал эм ну нам надо подумааать))
Што, прямо вот так бы и сказал: "эээм хрю мня пуук мне нада падумать))))".
А если бы это был бы ученик Академии ШАГ тоже бы так ответил?
>можно ли так писать и почему?
(4). Unlike the bitwise binary & operator, the && operator guarantees left-to-right evaluation; there is a sequence point after the evaluation of the first operand. If the first operand compares equal to 0, the second operand is not evaluated.
>(4). Unlike the bitwise binary & operator, the && operator guarantees left-to-right evaluation; there is a sequence point after the evaluation of the first operand. If the first operand compares equal to 0, the second operand is not evaluated.
А можно теперь человеческим языком?
Выражения между &&(и ||) вычисляются слева-направо, если одно не соответствует условию, то следующие не вычисляются. Т.е. эта хуйня:
if (a && ⚹a==100)) printf("a==100!");
эквивалентна:
if(a){
if(⚹a==100){
printf("a==100!");
}
}
> А если ты контролируешь код, который использует эту переменную, то у тебя вообще проблем нет - встроенный в любую IDE рефакторинг отлично заменит использование переменной на вызов функции. И даже если рефакторинга нет, и ты вимомазохист, ты все еще можешь одними регэкспами справиться.
Испанский стыд, достаточно макрос переписать.
Понятно что если кто-то соберется в дин.библиотеке менять символ, то придется проект пересобрать с новым хедером, от этого никак не уклониться. Ну а если либа идет как часть релиза или подсистема сорцов, то используется данный подход.
Вообще вот если переменная интенсивно используется юзер-кодом и не поддается передаче юзеру (т.е. меняет состояние между вызовами из одного потока) - она разделяемая, такими обычно бывают всякие спинлоки и счетчики. Спинлоку можно почти без оверхеда предоставить функциональный интерфейс, а счетчик должен иметь интерфейс без функции.
Лучше не иметь подобных объектов в либе, в остальных случаях обычно используется функция, не всегда скрытая макросом.
а есть толковые книги на русском? я инглиш ниасилил, патамушта я ватан и топлю за славянский софт, мечтаю купить русский комп, на эльбрусе и накатить туда астру, двигать вперёд отечественную айти индустрию, назло врагам и на зависть недругам, ибо за державу обидно, да, но вот заковыка: нужно знать Си, а с инглишем беда, да и боюсь я, что изучение инглиша пошатнёт мои внутренние скрепы и порушит патриотизм, как мне быть, аноны? я реально боюсь, накидайте ссылок, как изучить Си на моём великом и могучем великорусском языке
на 1С операционные системы не пишут (
а Си на инглише, это ставит меня перед дилеммой: я хочу помочь Родине, но для этого нужно знать годный ЯП, то есть Си, а в то же время я не хочу учить инглишь, потому что я его плохо усваиваю, да и не хочу подрывать свой патриотизм чтением иностранной литературы и слушанием вражьих голосов, мне комфортно среди родных берёз и осин, а все изучавшие инглиш хотят на чужбину, рисуют поросёнка и читают "пора валить"
Надо, Федя, надо учить язык вероятного противника. Думаешь полковник Исаев учил немецкий из любви к вражьим голосам Гёте?
Странно загуглил книжку нашёл похожую от двух авторов
Автор: Дэвид Гриффитс, Дон Гриффитс
А теперь одна хуемразь в авторах?
тяжело даётся мне эта вражина, душа к нему не лежит, и слова всё хитрые, читаются не так, как пишутся, бесовщина сплошная, как из Земля матушка терпит окаянных
я хотел было побырому выучить, но быстро из меня это выветривается, видать отторгает её моё нутро русское
Я ночи насквозь спать не буду, последнего здоровья лишуся, но… — и, скрипнув густыми мелкими зубами, докончил: — язык этот выучу! На английском языке буду без нежностев гутарить с мировой контрой! Пущай гады трепещут заране!
Очевидный кумир.
> язык этот выучу! На английском языке буду без нежностев гутарить с мировой контрой! Пущай гады трепещут заране!
Кончен разговор, Нагульнов! Решением бюро ты исключен из наших рядов.
Такие вы партии не нужны. Клади сюда партбилет!
Да их сотни.
>почему человек, который будет читать твой код, должен догадываться
А он не должен догадываться, евгеньваганыч. Он должен стандарт знать (тебя, кстати, это тоже касается). А на каждого неграмотного уебка никакой мисры не напасешься.
>Учи английский,
Зачем мне учить англо-саксонский нахрюк? Мне хватает и русского.
>ведь авторы Си говорят на нем
Авторы говорят на одном языке, пользователи - на другом.
>А он не должен догадываться, евгеньваганыч. Он должен стандарт знать
Ну как бы понятно, что раз человек пишет на языке Си, то он его знает. Но такие вещи разные компиляторы компилируют по разному, и допускать их в коде нельзя, иначе это будет говно-код, работающий только с конктретным компилятором.
>(тебя, кстати, это тоже касается).
С чего бы это? Я знаю язык Си.
>А на каждого неграмотного уебка
Неграмотные уебки это те, кто пишет код как на пикче, руководствуясь при этом правилом: "Компилятор не ругается, значит хороший код! Как трудно в нем разобраться? Ничего не знаю, стандарту языка он соответствует." Код должен быть понятен людям в первую очередь, а не компилятору.
>никакой мисры не напасешься.
Некоторые из их правил вполне не мешает вшить в компилятор, имхо. Хотя большая часть правил не нужны, например, запрет адресной арифметики.
>Но такие вещи разные компиляторы компилируют по разному
В своих маняфантазиях можешь компилировать, как угодно, петушок, а вот реальные компиляторы обязаны компилировать вполне определенным образом. А ты ведь, я смотрю, совсем необучаемый: тебе уже за меня и цитату из стандарта приволокли >>66537 на которую я и байтил собсно, а ты все кудахчешь об своих конпиляторах за каким-то хуем.
>Я знаю язык Си
Ты его не знаешь.
>не нужны, например, запрет адресной арифметики
Ты троллишь тупостью, ясно.
Он прав. Языку больше полувека. Есть стандарт, там написано, как какие выражения обрабатываются, если компилятор реализует это как-то иначе, чем как описано в стандарте, то это уже не компилятор языка С. Но для такого примитивного сценария это невозможно, лол, особенно если ты используешь что-то вроде кланга или гну с компилера.
А в стандарте указано, что есть ровно четыре операции, операнды которых всегда вычисляются слева направо: &&, ||, ?: и запятая (но именно оператор, а не сепаратор, т.е. не в объявлении аргументов функции, например). Я это знаю, потому что я очень внимательно читаю k&r, и вам советую
Компиляторы ничего не обязаны, кроме стандарта. Стандарт = конечное множество правильных вариантов кода + конечное множество неправильных вариантов кода (где все конпеляторы должны печатать error/warning). А вариантов говнокода - бесконечное множество. Бесконечное множество МИНУС два конечных множества РАВНО все еще бесконечное множество UB. И если реализации двух разных компиляторов хоть чем-то отличаются друг от друга, где-то 100% вылезет разное UB.
мимо
>а есть толковые книги на русском?
Все основные книги уже давно переведены на русский: керниган ричи(все 3 издания), справочник шилдта, пратта и т.д.
>>66652
Английский знать не надо, в Си нужно только запомнить ключевые слова, их там всего с десяток: main, if, else, while, for, switch, case, break, return, continue(континюе).
>И туда как бы идут всякие дядьки по 32-35 лет без образования
Туда же вроде наоборот мамкиных какиров берут со школы и первых курсов, а 30-летним бумерам от ворот поворот?
Мне в
a>0 && b==c || !d
надо засирать всё скобками или нет?
Чтобы развернуть массив надо писать 3 функции?
Решаю Прату.
https://pastebin.com/YtEu24JV
Надо было Альберт Энштейн, было бы лулзовей.
Здесь кунпелятор вывалит одно предупреждение, вот там и поставь.
скобками надо засерать в любом случае, потому что тот, кто читает код, должен его просто блять ЧИТАТЬ, а не напрягать извилины, вспоминая operator precedence всего и вся. Не выебывайся и не говнокодь, пчел, код должен быть максимально понятен.
Зависит от того кто это будет читать.
В Perl для этого есть отдельно or и ||, and и &&, но в Си такого не завезли.
>В своих маняфантазиях можешь компилировать, как угодно, петушок, а вот реальные компиляторы обязаны компилировать вполне определенным образом.
Только основу языка(которая изложена в K&R). Но есть и некоторые вещи, которые компилируются в каждом компиляторе по разному: размер unsigned char, int, long int в битах, распределение битовых полей в памяти, приоритет логических и арифметических операций и т.д. Тот же стандарт MISRA C рекомендует избегать таких операций, которые зависят от компилятора.
>Ты его не знаешь.
Я его знаю. У меня несколько лет опыта работы, за которое я разработал ПО на языке Си для множества микропроцессорных устройств, работающих в медицине и промышленности. При этом я не читал ни K&R, ни стандарты(потому что на это не было времени из-за работы). Я познакомился с языком сначала не лекциях преподавателя, потом по книжке, которая называлась примерно "Учим С++ за 21 день(не помню точно на звание", и по справочнику Шильдта(который представляет собой почти дословный перевод K&R).
А вот ты, походу, борщехлеб, котоырй сидит на шее у мамки и читатает разные стандарты и K&R, и мнишь себя большим знатоком Си.
>не нужны, например, запрет адресной арифметики
>Ты троллишь тупостью, ясно.
Обоснуй. Я действительно считаю, что в арифметике указателей нет ничего плохого и её вполне можно применять.
>А в стандарте указано, что есть ровно четыре операции, операнды которых всегда вычисляются слева направо: &&, ||, ?: и запятая
А в стандарте указано, как вычисляются операнды ">=, <=, ==, >, < "?
И раз ты знаешь k&r и стандарты, то, будь добр, ответь еще на пару вопросов, мне правда интересно.
А в стандарте указано, как компилятор распределяет битовые поля в памяти?
А в стандарте указано о распределении приоритета между арифмитическими операндами(+, -, *, /, &, |, ^).
Да, совсем забыл, и про:
>размер unsigned char, int, long int в битах
расскажи. Ну, есть про это в страндарте или нет.
>я разработал ПО на языке Си для множества микропроцессорны
Какой иде пользуются на производстве? Бодьшие объёмы у программ?
Блять, напиши какое медицинское оборудование, чтобы я случайно не воспользовался и не подох.
Дилдак с имитацией фрикций твоего папаши
А про то что умножение выполняется раньше сложения тоже надо таким чудо читателям объяснять? Надо просто знать язык, а не превращать программы в (((лисп)))
>C++ содержит средства, позволяющие программисту нарушать заданную в конкретном случае дисциплину программирования. Например, модификатор const задаёт для объекта свойство неизменности состояния, но модификатор mutable предназначен именно для принудительного разрешения изменения состояния внутри константного объекта, то есть для нарушения ограничения константности. Более того, допускается динамически удалить атрибут const с константного объекта, превращая его в леводопустимый (L-value). Наличие в языке таких возможностей делает попытки формальной верификации кода бессмысленными, а использование ограничений для оптимизации невозможным.
SOOOQAAA BLYAAAAD
> А в стандарте указано о распределении приоритета между арифмитическими операндами(+, -, *, /, &, |, ^).
Да, приоритеты фиксированные и кроме побитовых операторов - даже логичные. Гуглишь такой C operator precedence chart, там все будет. Естественно, для операций с одним приоритетом порядок вычисления не определен.
> А в стандарте указано, как компилятор распределяет битовые поля в памяти?
Да. Как ему больше нравится.
>>68216
Да, есть. Минимальные размеры и соотношения между размерами. Возьми и сам посмотри.
Зависит от устройства, для каждого разное IDE. В зависимости от микропроцессора и микроконтроллера используются разные IDE для разных семейств процессоров (Keil, Atmel Studio), у ПЛК и панельных компьютеров свои собственные IDE, поставляемые производителем на диске.
>Бодьшие объёмы у программ?
Что ты имеешь ввиду, размер прошивки?
Разные бывают, от пару килобайт для небоших контроллеров до десяти мегабайтов для ПЛК.
> А в стандарте указано, как компилятор распределяет битовые поля в памяти?
>Да. Как ему больше нравится.
Выходит, что этот анон >>176673 не прав?
И есть вещи, которые каждый компилятор может реализовать по-своему?
>>66722
>Но такие вещи разные компиляторы компилируют по разному
>>66493
> Мой пост и относится к последней строчке. Написана она через жопу: почему человек, который будет читать твой код, должен догадываться, как компилятор выставит приоритет в условии?
Человек на полном серьезе считал что if (a && *a==100) может как то по разному скомпилироваться.
Язык(тот который изложен в книге K&R) знают все разработчики и все компиляторы трактуют его одинаково.
А вот остальные его диалекты-наследники (С89, С99, С11) также поддерживают K&R-Си, а в остальном отличаются.
Вот ты точно читал и выучил стандарты C89, C99, С11 и знаешь, в чем они отличаются?
Поэтому проще не использовать в программе операции, которые разными компиляторами и диалектами могут изменяться по разному.
Посмотри всю дискуссию. Дальше некоторые аноны
>реальные компиляторы обязаны компилировать вполне определенным образом.
> Есть стандарт, там написано, как какие выражения обрабатываются, если компилятор реализует это как-то иначе, чем как описано в стандарте, то это уже не компилятор языка С.
начали утверждать, что язык Си должен компилироваться всеми компиляторами одинаково, а вещей, которые каждый компилятор может компилировать по-разному - нет.
> что if (a && *a==100) может как то по разному скомпилироваться.
Между разными диалектами языка может компилироваться по разному.
Нет
Чел, если бы это было так, то компьютеры вообще не работали бы. Порядок проверки в && это фундаментальная вещь. Иначе бы у тебя всякие разыменовывания NULL происходили до проверки что это не NULL.
> Порядок проверки в && это фундаментальная вещь.
Фундаметнальные вещи написаны в K&R. Найди мне это в K&R.
48 страница таблица 2.1, а что?
>несколько лет опыта работы
>не читал ни K&R, ни стандарты(потому что на это не было времени из-за работы)
Ебаная макака-байтоеб ты, вот кто. Несколько лет — это ни о чем, студентишка или аспирантишка тупорылый. Как тебя приняли на работу без знания стандартов, фантазер?
libjpeg-turbo (1:1.5.1-2+deb9u1) stretch-security; urgency=medium
Non-maintainer upload by the LTS team.
CVE-2018-1152: Denial of service vulnerability caused by a
divide by zero when processing a crafted BMP image in TJBench.
CVE-2018-14498: Denial of service (heap-based buffer
over-read and application crash) via a crafted 8-bit BMP
in which one or more of the color indices is out of range
for the number of palette entries.
CVE-2020-13790: Heap-based buffer over-read via a malformed
PPM input file.
* CVE-2020-14152: jpeg_mem_available() does not honor the
max_memory_to_use setting, possibly causing excessive
memory consumption.
-- Adrian Bunk <
>петухану настолько бомбит, что он бегает выискивает эту аватарку с тремя постами по всему двощу
Лол. Какой же ты жалкий. Аватарка тебя по делу унижала.
библиотечка ТУРБО! ля какая!
П Р И М Е Ч А Н И Е
Возможно, вам потребуется, чтобы программа всегда генерировала
новый набор случайных чисел при каждом запуске. Такая рандоми-
зация нужна при создании игр, однако многие симуляторы и научные
исследования подразумевают повторение одних и тех же случайных
чисел. Функция rand() предоставляет как раз такой функционал,
если вы не задаете семя генератора случайных чисел.
Имеются в виду варианты, когда оно скомпилируется.
>>68894
В принцыпе можна и наоборот. Чтобы проц в тибя кончил. Незабудь переодеться в девочьку, анончек.
В функцию передать.
Какое выражение блядь? Почему ты не мог написать a/a++? И да всё что связано с инкрементом в выражениях это уб
z= 456.0;
z= z++/z;0.997812
z= z/z++;1.002193
z= ++z/z;1.000000
z= z/++z;1.000000
z= z++/z++;0.997812
z= ++z/++z;1.000000
он сам не знает, если че
> Что дальше учить, анончи?
Дальше учить все. Предметную область. Учиться писать код под линупсы, виндовсы: POSIX, Windows API, сети и существующие подходы для неблокирующего IO, многопоточность, на OpenMP посмотри хоть издали, SIMD-интринсики и как заставить компилятор высирать что-нибудь вменяемое без них, драйвера хоть чуть-чуть, всякие libusb, CMake, куда же без него. Алгоритмы/структуры данных не забудь, хотя бы кейворды узнай, чтобы потом под задачу гуглить. Напиши со всем изученным несколько качественных хелловорлдов. Потом можешь отладочную плату с микроконтроллером взять поиграться, тот же самый путь, посмотри на пару ртосов. После этого у тебя в гитхабе будет, что показать, ты пойдешь на hh, а там нихуя нет вакансий для тебя.
Не интересно, работа для хлебушков. Я хочу кибернетику, МК, ядра, драйвера и всё такое задротское.
Так это же самая сермяжная мужицкая параша, а не передний край. Как раз для хлебушков.
Хули там в твоих кококонтроллерах? Прописал регистры, как макака, и все, хуже даже, чем в жс. И общаться ты там будешь, скорее всего, с нешарящими и тупыми постсовковыми долбоебами-радиолюбителями, если на хедхантере собрался искать (просто нешарящими - это программа-минимум и уже удача; обычно они не просто не шарят, у них еще и куча каких-то извращенных поверий и маняфантазий по теме, и все это на фоне просто запредельных ЧСВ и токсичности). Оно те надо?
Тру - это машобчик, ООП, графика, игры, софтвер инжиниринг.
Энивей веб я послал через 2 часа чтения синтаксиса жса.
>машобчик, ООП, графика, игры, софтвер инжиниринг.
Вкачусь хотя бы на минимум лоу левела и пойду в плюсы.
> Тру - это машобчик, ООП, графика, игры, софтвер инжиниринг.
Машоб не нужен, ооп мертво, грауфоний сделают за тебя, игры не нужны.
Анончики, несколько тредов назад выкладывали книги про алгоритмы и структуры данных для си.
Вот эту вроде, Седжвика:
http://index-of.co.uk/Algorithms/Algorithms in C.pdf
>Ебаная
>фантазер?
>тупорылый.
Борщехлеб, не гори. Тебе просто завидно, что я работаю, получаю деньги, кормлю семью и родителей и у меня есть опыт работы, а ты сидишь дома на шее мамки, никому не нужный на рынке труда, зато со знанием стандартов.
>макака
Я не макака, я пишу довольно качественный код, соответствующий во многом MISRA C.
>байтоеб
Так то любого, кто пишет на Си можно назвать "байтоебом", потому что это low level язык, в отличии от языков высокого уровня, и он подразумевает непосредственную работу с байтами и регистрами.
>Несколько лет — это ни о чем, студентишка или аспирантишка
В айти за несколько лет можно до миддла дорасти, тут то же самое. Зависит от человека, можно и 10 лет чаи гонять и остаться на уровне студентишки, а можно за пару лет саморазвиваться и стать нормальным специалитом.
>Как тебя приняли на работу без знания стандартов,
По собеседованию, посмотрели оценки в дипломе и позадавали вопросы по теме. К тому времени я сделал множество pet-projects на мк(не ардуино) на тысячи строк кода, поэтому я безпроблем смог ответить на вопросы. Также в вузе обучали этому очень хорошо. Ответь, зачем нужно знание стандартов? При том, что я знаю язык Си (тот, который k&r), а разные штуки, а компиляторо-зависимые операции в коде я не использую?
> качественный код
> соответствующий во многом MISRA C
Выбери что-то одно.
> а компиляторо-зависимые операции в коде я не использую
А откуда ты знаешь, что не используешь? Откуда ты знаешь, что у тебя в коде не UB на UB сидит и UB погоняет?
Представление программистов об языке Си отличается от представления компиляторов и стандарта. Вот тут даже исследование проводили: https://www.cl.cam.ac.uk/~pes20/cerberus/notes50-survey-discussion.html
>завидно, что я работаю, получаю деньги, кормлю семью и родителей и у меня есть опыт работы
Да вообще единственный тут молодец у мамочки. Ты забыл упомянуть, что еще у тебя есть крыша над головой, что надеть и деньги на проезд, лолка.
>за несколько лет можно до миддла дорасти
Да за несколько лет до мидла даже неграмотное колхозное чмо дорастет (такое, как ты).
>на мк(не ардуино)
А чем тебе не угодил ардуино? Они там такие же, как ты, неграмотные школьники, не шарящие в стандартах и творящие всякую хуйню в своих либах. Хотя, с другой стороны, "тру-мк"-байтопетухи ничуть не лучше зачастую. зачастую они еще хуже
>на тысячи строк кода
Это тип многа что ли? Кек. Десяток тыщ строк - это мелкий проектик. А если на тыщу - это вообще на пару вечеров крошечная хуитка.
>в вузе обучали этому очень хорошо
Заметно, как тебя обучали в пидорахенской шарашке. Даже инженерную культуру не привили.
>вузе обучали этому очень хорошо.
Что за вуз то? обычно ойтишники хают во.
>пару лет саморазвиваться и стать нормальным специалитом.
Нихт, нормальным специалистом варясь в собственном дерьме не станешь.
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
В самих иде нормально кириллицу показывает, запускаю из exe кодировка слетает.
>Нихт, нормальным специалистом варясь в собственном дерьме не станешь.
Почему же? Подпердываешь кодом каким-нибудь норм опенсорцным проектикам, правишь баги, и збс. Все лучше, чем поделки васянов в говноконторах дрочить.
> зумерской маньки
> СТАНДАРТ НИНУЖОН
Ну вот тебе общепризнаный бумер-король байтоёбства, причем именно апологет няшной? купивший себе феррари в начале 90х, а в нулевых решивший запустить за долго до маска ракету в космос.
>Как в нашей конторе говорили дедушки (си-синьоры с большим опытом работы): "На компилятор надейся, да сам не плошай".
У си-сеньеров-дедушек типичная формула решения проблемы - работает не трожь. Доходит до смешного - вместо того, что бы исправить UB в коде деды-пердеды будут держатиь виртуалки с досом с древним компилятором борланда, орать на джунов, ПОСМЕВШИХ скомпилировать новой версией GCC и менторским тоном ЗАПРЕЩАТЬ.
То, что дрочево на стандарт С - это как раз новое, зумерско-хабро-троле-дващерское веяние, с поиском UB по кроватью, выстраданное годами траленка байтолюбов и полыхания жоп.
Диды как раз с размаху стреляли себе в ногу, верили в карго-культ конкретной версии компилятора конкретного производителя, и вычисляли обратный квадратный корень через UB.
И то, всё это по той причине, что зумеркам приходится в дидовской линух-системщине серверной ковыряться.
Переписать бы весь линух и всю его экосистему на расте да зажить, но не судьба.
через лет 15 и так перепишут, не ссы, анон
>Т.е. автор знал, что это плохо и не по стандарту
Если знал что тупо плохо, почему не использовал корректный вариант с union, мм, уёба?
Да потому что насрать дидам было, зумерок.
Они стреляли в ногу, верили в рассово верную версию компилятора и токсично пердели про КОКОКО ЛАМИРА НИПАЙМУТ ПШЕЛ НАХ МЫ ИЛИТА ТРОГАЕМ БАЙТИКИ АХАХАХА в эпоху своей молодости, тщательно оберегая свои САКРАЛЬНЫЕ ЗНАНИЯ.
>Прикинь сколько с этим было ебли при портировании на другие платформы.
Думаю, не так что бы много, пушо сами игры мы видим:
https://www.youtube.com/watch?v=dx459X3z91I
https://www.youtube.com/watch?v=Cg7IXW6BSa0
А прохладных кулстори про свою жопоболь от разработчиков на гамасутре - не видим. А ведь как раз данные платформы тот самый случай где возможно соснуть BIG ENDIAN.
Зато есть постмортем-батхерты от разработчиков эмуляторов этих платформ:
https://wiki.pcsx2.net/PCSX2_Documentation/Nightmare_on_Floating-Point_Street
И хуеву тучу настроек этого самого плавучего петуха в том самом мумуляторе PCSX2.
Там нет никакого UB и выстрела в ногу, пидор.
Плохо, непортируемо, но вполне допустимо. Implementation-defined - это не UB.
Цитату, цитату из стандарта приведи. Сам придумал UB, сам сегфолтишься, лолка.
А вот портируемо как раз вполне, лонг и флоат на большинстве платформ будут иметь 32 бита, а такой платформы, что бы у float и long32 был бы разный порядок байт попросту нет.
В любом случае, не на всех же платформах вроде был IEEE 754? Помню сталкивался с каким то компом где знак был между мантиссой и экспонентой, значит этот васяношифт не сработал бы.
На этом компе бы ку3 не пошел, там даже видеокарту с 3д ускорением воткнуть некуда, а без 3д ускорения в кваче3, как мы помним из нищедетства, посос.
Причем лал был в том что в первую халву на s3 играть было можно, в усмерть джамперами разогнав проц и мать (на особо кошерных матерях до аж 500 мгц на второпне, лал).
Кармак ЭКСАЙТЕД с любой херни, связанной с программированием, он и про хачкель так же говорил. А потом пишет на плюсах, ибо в мире реальном альтернативы нет.
Вангую: и не будет.
>Типикал растопидор:
>Переписать бы %projectname% на расте
>97.9998% unsafe
>КОКОКО РАЗД ПАБИДИЛ СИ
>В чем разница между явной и неявной безопасностью? Я не знаю и мне не нужно
Кармак серьезно не занимается программированием уже лет 15, сейчас он просто играет с разными технологиями
Лекции его послушай и успокойся.
Какой еще бог, бумер? Кармак это дед который застрял в 90-х.
Есть. Называется strict aliasing. long и float не совместимы, behavior is undefined. На самом деле раньше так писали потому, что раньше компиляторы aliasing analysis не делали, и поэтому никаких ног таким образом не повреждалось.
>годами траленка байтолюбов и полыхания жоп.
Причем тралили и поджигали жопы им вовсе не хаброзумерки, а собственные же баги этих байтоебов из-за незнания стандарта и плохого кодирования.
Всё, что есть в "k&r" стандарт по дефолту выполняет.
Обратное утверждение не верно. Версии стандарта (C89, C99, С11) отличаются между собой, но всё, что написано в k&r они выполняют.
>Что за вуз то? обычно ойтишники хают во.
Я не айтишник, а инженер, и специальность инженерная(встраиваемые системы), это совсем другое.
> качественный код
> соответствующий во многом MISRA C
>Выбери что-то одно.
Чем тебе MISRA не нравится? Я её прочитал, но не фанатично использую все правила, а разумно.
>А откуда ты знаешь, что не используешь? Откуда ты знаешь, что у тебя в коде не UB на UB сидит и UB погоняет?
Потому что я следую(в том числе), тем правилам тем правилам MISRA, которые запрещают в коде использовать UB. Использую stdint.h, тела функций и операторов заключаю в фигурные скобки, приоритет операций логических и арифметических указываю скобками, знаю, что битовые поля компилятор распределяет в памяти, как хочет, и т.д.
>анимэ
>опенсорц проект
>фулл-реквест
>гитхаб
>стандарт си
Типичный портрет зумерка, борщехлеба-студентика на шее у мамки из этого треда.
>Так это же самая сермяжная мужицкая параша, а не передний край технического прогресса. Как раз для хлебушков. И общаться ты там будешь, скорее всего, с нешарящими и тупыми постсовковыми долбоебами-радиолюбителями
Ну дык нечего торчать в Барнауле
>куча каких-то извращенных поверий
Типа каких? мне чисто поржать
>Тру - это машобчик, ООП, графика, игры, софтвер инжиниринг.
<<<
>не шарящие в стандартах
Выучил стандарты и выёбывается.
Иди ка ты на хуй, борщехлеб, со своими стандартами и K&R в очко себе затолкай.
мимо C Embedded Senior
Зенки распахни свои и извилину напряги. Он имел в виду, что ты соблюдаешь мисру не полностью, дебил ты ебаный, там же курсивом выделено. Тебе с такой внимательностью не то, что адресную арифметику - тебе, сука, структурку страшно давать.
> потому что я следую(в том числе), тем правилам тем правилам MISRA, которые запрещают в коде использовать UB.
Но поскольку стандарт ты не знаешь, то и не знаешь что такое UB, а значит в коде у тебя он вполне может быть.
Какой пет-проект забабахать, который дал бы мне неплохой начальный буст знаний в эмбедщине? Нужно ли настолько же глубоко нырять в железо, насколько я уже нырнул в софт?
Мимо вчерашний студент камплюхтер сцаенс, есть несколько околобайтоебских пет-проектов на крестах и Сишечке (пока больше на крестах), относительно хорошо знаю Linux internals
Чому в этой форме всё работает, но если заменить
> const char msg[] = "Try again, please.\n";
на const char *msg = "...";
то вместо нужного предложения выводится его обрубок?
Если ты хочешь вывести на экран, то не должно быть такого (только если ты не пытаешься вывести строку с пробелами, которую вводил через scanf, ибо scanf перестает читать после пробела)
>тем правилам тем правилам MISRA, которые запрещают в коде использовать UB
А разве есть где-то правила, которые разрешают использовать в коде УБ?
>Какой пет-проект забабахать, который дал бы мне неплохой начальный буст знаний в эмбедщине?
Какую-нибудь говнолибу для ардуины.
>Зенки распахни свои и извилину напряги.
>дебил ты ебаный,
>сука
Со своими родителями так разговаривать будешь, шлюха ёбаная.
Если есть что-то сказать по-факту - говори, а если тебе кроме оскроблений сказать нечего, то пошёл нахуй.
>Он имел в виду,
Ты тоже будь повнимательнее и посмотри в моём посте, что те правила, которые запрещают использовать в коде операции, зависящие от компилятора (UB то есть), я использую все.
А применять все без исключения правила MISRA C не стоит, там слишком много лишнего и получится говнокод.
>Тебе с такой внимательностью не то, что адресную арифметику - тебе, сука, структурку страшно давать.
Ага, то бишь, если я не разглядел стиль написания буковок в нескольких словах(которые и правда почти не заметны, если быстро читать), то я плохой разраб. Отличная логика. Повторюсь, если тебе печет и кроме оскорблений и траленка сказать нечего, то съеби.
Нет. Есть, которые запрещают. Которые разрешают нет.
А есть, которые никак не относятся к UB вообще(например, запрет адресной арифметики, или правило, согласно которому в функции может быть только один return.
>Но поскольку стандарт ты не знаешь, то и не знаешь что такое UB
Нет, знаю, ведь я читал misra c и знаю язык си(читал k&r). Оно обозначает логику, которая каждым компилятором может трактоваться по разному.
Например, компилятор может размещать битовые поля в памяти как захочет, это нужно учитывать. Или, скажем, в разных компиляторах величина unsigned char, long char и long long char может быть в битах разной величины, поэтому вместо них следует использовать типы, обозначеные в библиотеке stdint.h.
>, а значит в коде у тебя он вполне может быть.
Конечно, от ошибок на 100% никто не застрахован, но я стараюсь не применять UB в коде.
Чел, ты говоришь о Implementation Defined, а не о UB. UB не связано с компилятором, оно связано с семантикой языка. А семантика языка определена стандартом (а не фанфиком на тему.) (Как выражение "Косил косой" не имеет одного определенного значения, хотя и написано без синтаксических ошибок.)
>Мимо вчерашний студент камплюхтер сцаенс, есть несколько околобайтоебских пет-проектов на крестах и Сишечке
Есть предположение, что ты не знаешь ассемблер.
Если это так, то можно сделать один или два проект на асме, чтобы ему научится. Например, на микрокотроллере (8 битном/32-битном) сделать устройство, которое будет на SD-карту записывать освещенность в комнате в течении дня (высчитывать средне-квадратичную величину освещенности для каждой минуты в сутках). Без файловой системы. Придется читать datasheet на мк и смотреть набор команд ассемблера там же. Так же стоит придется подрубить датчик света и часы-RTC, если они не встроены в сам МК. Потом можно возвращаться в Си.
Асм пригодится для ассемблерных вставок, оптимизации кода + сможешь написать свой компилятор.
С ардуины, как советует этот анон - >>72002 начинать не стоит, иначе так и останешься на уровне ардуинщика.
>Лучше купи роутер, накати туда openwrt и в ней ковыряйся.
Лол, я изначально и начал изучать си, из-за бугурта что не могу элементарно домашнюю сеть настроить, ибо хз как оно там работает на
А там, с первых же страниц:
>..you need a sound background in standard C,... . So if you already know C,you’re poised to learn C++. ..
>If you don’t know C,you have to master the C components..
ОРУ сука с трупошизиков, ну как же так, чудес не бывает, какая грусть ёбана
Кокой молодец и гринтекстом попукал, и боевую картиночку с анимэ запостил. Можешь теперь пойти похвастаться мамке, как ты "всех победил" в интернете.
А чтобы выучить Си нужен бэкграунд в ассемблере. А чтобы выучить ассемблер нужен бэкграунд в микропроцессорной технике и цифровой электронике.
предположение провальное, есть опыт реверс инжиниринга, довольно неплохо знаю ч86 архтектуру и изучаю попутно ARM.
Классно стандарто-петуха обоссали всем тредом.
Эта манька даже не знает, что есть 3 стандарта языка си (С89, С99, С11) и сомневаюсь, что он полностью выучил хотя бы один из них.
>начинать не стоит
Сама концепция ардуины действительно уёбищна, но не с армов же начинать. А то там от одной инициализации периферии можно охуеть.
>>72077
>STL
В МК никогда не используется. Ну может быть в каких-то жирных бордах с лунухом на борту, но я таких не видел. А так даже сишная либа часто кастрированная идёт.
>кресты
Очень ограниченно, в виде С с классами.
>но не с армов же начинать.
Там анон говорит, что умеет на асме прогать под x86 и ARM изучает. Зачем ему начинать с таких пустяков, как AVR или 8051?
>А то там от одной инициализации периферии можно охуеть.
Можно кубиком все инициализировать, а работать через HAL - даже datasheet не придется читать.
Если таких, как я, будут убивать, кто же будет гуглить за таких быдлодолбоебов, как ты, а, быдлодолбоеб? Что ж ты ебан-то без гугла, нахуй, сука!
> есть 3 стандарта языка си (С89, С99, С11)
Во-первых, четыре, хоть в последнем и нет никаких нововведений. Во-вторых, они друг друга расширяют, а не заменяют. Из ломающих обратную совместимость изменений только удаление gets и старых способов объявления функций, то есть убирание за собой pre-K&R говна, которое и в C89-то не должно было попасть.
>>72218
> K&R-фанфик
Первый официальный стандарт языка (C89/90) создавался на основе первого издания K&R. K&R писался, сюрприз, совместно с Ричи, поэтому странно называть его фанфиком.
> И MISRA он тоже не уважает.
Наряду с рекомендациями, которые подходят для Си в целом, в MISRA полно рекомендаций по написанию непортируемого, нечитаемого и нерасширяемого кода для заранее выбранной железки с заранее определенными функциями. MISRA сознательно жертвует качеством кода в угоду большей надежности.
Если нужно, чтобы работало быстро и для широкого круга применений (пишем обычную либу под десктопы или мобилки) - MISRA точно не вариант. А вот если надо, чтобы после правок кода вчерашим студентом, который даже K&R не осилил, железка за полтора ляма не взорвалась и никого не убила, тогда обязательно нужен какой-либо стандарт "безопасного" кода со всеми перегибами типа скобок в (a * b) - (c / d), и, конечно, с отсутствием маллоков и прочей адресной арифметики. Но от необходимости ревью не избавляет даже MISRA.
Не пойму, а как можно отказаться от адресной арифметики?
Вот допустим, нужно написать функцию, которая будет делать сортировку массива. Как здесь обойтись без адресной арифметики.
Этот пункт, вроде, запрещает смешивать указатели с доступом по [], а так же арифметику с указателями (потому что там часто объебываются, либо прибавляя не тот размер, что думают, либо вообще из за неправильных скобочек думают что арифметика с содержимым, а на самом деле с указателем), кроме инкремента/декремента.
Так что твою сортировку ты сможешь написать либо прямым доступом через [ i ], либо через *p++
Насколько я понял, ptr + 3 запрещена. Пользуйся или ++ptr ++ptr ++ptr, или arr[3]
Поздравляю, ты уретральник. В просторечии "охуевший". Эгоизм, упрямство, спесивость, желание доминировать, соревновательность, амбициозность либо потянут тебя к достижениям, либо сделают невротиком. Ну, если повезёт, то получится это компенсировать без особого вреда для себя и окружающих.
Он звуковик, а не уретральник
Это копия, сохраненная 22 февраля 2021 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.