Тред, посвященный прародителю всех С-подобных языков и по совместительству единственному идеальному и всесторонне годному средству программирования как на системном, так и на прикладном уровне.Пожалуйста, пользуйтесь https://ideone.com/ или 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 (драфт)- man/Dash/zealdocsЧем компилировать:- Очевидный GCC.- clang: оче годно, батя рекомендует.- Intel C++ Compiler: оптимизации, тысячи их.- Visual Studio 2017 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://godbolt.org/ - Compiler Explorer позволяет посмотреть выхлоп компиляторов для введенного куска кода (больше полусотни разных версий компиляторов).- http://cdecl.org/ - С Gibberish ↔ English помогает читать сложные сишные декларации.Прошлые треды:- №45: http://arhivach.ng/thread/448906/- №46: http://arhivach.ng/thread/461169/- №47: http://arhivach.ng/thread/475391/ >>1446278 (OP)
Почему в Си не завезут операторы для ROL и ROR? SHL и SHR есть (<<, >>). Что мешает сделать ><<, >><? Си ведь призван избавить от необходимости ASM в большинстве низкоуровневых задач, а значит в новых стандартах должно отражаться развитие архитектур.
Окончание _t как в uint32_t и прочих, зарезервировано? Или я могу делать так?typedef struct array { ... } array_t;
>>1480809Достаточно редко используется, отлично распознается компиляторами. Смотри: https://godbolt.org/z/SnIAwS Для тех, кому хочется гарантий, есть интринсики.>>1480866Стандартом Си не зарезервировано, но зато зарезервировано стандартом POSIX.>>1480935CMake оставляет за собой кучу говналогов, посмотри в них конкретное сообщение об ошибке.
>>1480806Как раз дочитал эту Перри Г., Миллер Д. «Программирование на C для начинающих».Попробую теперь её.
>>1480091>Охуенно ты придумал. Вот у тебя скомпилированы .o, использующие одну библиотеку. Функции же библиотеки не находятся в отдельном .o, а продублированы в каждом из твоих .o. И откуда линкеру-то, блядь, знать, что они идентичны, и какие копии можно выбросить?Но такая библотека у меня работатет и компилятор даже не ругается.А тела inline-функций можно разместить только в .h файле.
Блин, какой спортивный интерес так минимизировать код?https://nanochess.org/toledo_nanochess.cЯзыки придуманы для того чтобы человек смог их прочитать, а не для мастурбирования на количество букав. Считайте по количеству операций что-ли, а не такую фигню мутите. Если уж хотите минимализм, то ебоште сразу машинными кодами.
>>1481525>какой спортивный интерес так минимизировать код?Любой код надо минимизировать и делать, как можно проще и понятнее. Есть же такой принцип KISS(Keep it simple, stupid). Это только индусские макаки наоборот писали тонны нечитаемого говнокода, потому что им платили за количество строк.Что касается твоего примера - там просто нет табуляции и его нельзя прочитать.
>>1481702>там просто нет табуляции>там просто нет табуляцииИ да, code golf это непросто, это уже совсем не KISS
>>1480534 (OP)Написал библиотеку полностью в .h, файле.Потом решил сделать правильно: все тела функций вынес в .с файл, а в .h файле оставить прототипы функций, глобальные переменные, массивы, структуры(я скачивал некоторые библиотеки с гитхаба, и там все так делают).Всё сделал как надо, на .h файл поставил guardы, к .с файлу подключил .h файл, но ничего не вышло. Компилятор выдавал десятки ошибок multiple definition в объект-файлах. Долго не мог понять, в чём причина, и только сегодня, после долгого гугления нашёл ответ в яндексе на первом ответе: глобальным переменным нельзя присваивать значения в .h файле, их там можно только объявлять.А у меня там всем переменным были присвоены нули.ПОЧЕМУ ОБ ЭТОМ НЕ СКАЗАЛИ НИ В КЕРНИГАН РИЧИ НИ ДАЖЕ В СПРАВОЧНИКЕ ШИЛДТА!!??Это же очень важная проблема, я МЕСЯЦ ломал голову, почему не могу разнести свою библиотеку в пух и прах на два файла.
>>1481714Потому что это очевидно вытекает из базовых знаний. Если ты инициализируешь static, то это уже не bss, а data, то есть в каждом .o хардкодятся значения под этими символами, и линкер не вдупляет, где правда. Выхода два. Либо в .h без инициализации (bss заполняется нулями, когда разворачивается в памяти процесса, так что норм), либо в одном из .c инициализируешь, а в других объявлешь extern. Ответ гугла - рациональное, а не эмпирическое. То есть в принципе можно, но лишено смысла, ведь если один .c, то нет смысла в .h.
>>1481714Короче, чем забивать голову частными случаями магии инклудов и золотых правил, с ней связанных, лучше понять, что инклуд - тупо вставка текста. Представил, что вместо отдельного .h его содержимое продублировано в шапке каждого .c, и сразу все ясно.
>>1481714>ПОЧЕМУ ОБ ЭТОМ НЕ СКАЗАЛИ НИ В КЕРНИГАН РИЧИ НИ ДАЖЕ В СПРАВОЧНИКЕ ШИЛДТА!!??синтетическая инфа, необходимость которой возникает от непоследовательного изложения основного материала
>>1481880Тред заполнен ньюфагами на сто один процент. Но ньюфаги на то и ньюфаги, чтобы показывать им http://ioccc.org/ и зоонаблюдать.
>>1481933Зря ты так. Кто не прочел про IOCCC в комментарии и рассматривает код, как промышленный, тот уже безнадежный долбоеб без всяких объяснений, а сейчас еще налетят долбоебы претерминальной стадии и будут рассказывать тебе, какая бессмысленная хуета все эти контесты, а какие вы вообще все несерьезные в сравнении с мамкиными Стивенами Сигалами, 24/7 думающими о сиюминутной пользе занятия.
>>1482117Так ведь это и правда бесполезная хуйня, в 16 лет баловался пару раз таким, пользы ноль, одно веселье.
>>1482200Называется олимпиадство.Проблема в том, что ум это далеко не всегда что-то хорошее, т.к. он позволяет человеку чувствовать превосходство над другими. В результате многих интересует в основном эта сторона, реализуемая решением задачек. Такому человеку нужен челлендж, безотносительно пользы. Зависимость скорее даже наоборот, чем полезнее софт, тем более там банальной работы, суть рутины, не дающей никакого челленджа, ну как таскать кирпичи для строительства дома, но это совершенно необходимо. А умные не хотят, это чсв не греет, им скучно, унизительно, нужно выебываться крутыми решениями неординарных задач. Однако такое поведение это не порождает полезного, даже часто как таковых программ не производит, потому что есть огромная разница, скажем, изобрести двигатель внутреннего сгорания или сконструировать реальный качественный, удобный людям автомобиль.
>>1482223>изобрести двигатель внутреннего сгорания или сконструировать реальный качественный, удобный людям автомобильНадеюсь не к изобретению ДВС ты относишь олимпиадную матанопетушню?
>>1482242>матанопетушнюДа пошел ты нахуй. Эти, как ты считаешь, бесполезные выебоны - жизненная необходимость для умного человека. Даже если несовершенное потреблядское общество перепроизводства килотонн хуеты тысячу раз обесценивает эти скиллы. Талантливому человеку отнюдь не легко довольствоваться примитивщиной, не впадая при этом в депрессию. Эгоист ты, макака.
>>1482242Просто к изобретению. Изобретение это придумывание чего не было, вот и решение задач это получение решения, которого (у тебя) не было. Но решение задач это не программирование, ведь программ не дает. Получается через жопу: когда задача решена, нужно начинать делать программу, а пациент наоборот теряет интерес и уходит в другие задачи, где процесс повторяется. И даже если программа есть, такие не фиксят элементарные баги и неудобства, однако доставляющие пользователям много боли, которые могли бы быть исправлены за пять минут одной строчкой - как раз потому что слишком просто, вот и висит говно буквально годами, ёжики колются, а разрабу поебать, он сидит над умными проблемами.Как-то раз видел вообще прикол, картина маслом: разработчик очень известной тулзы внедрил новую крутую фичу и релизнул "смотрите как теперь можно, воу!", но никакой документации как пользоваться не дал, а вопросы игнорировал. Так никто ни разу этим не воспользовался, тупо все проигнорировали. Нафига спрашивается делал? А потому что интеллектуальная маструбация, по определению служит лишь самоудовлетворению.Однако забавно, но т.к. причина в чсв, а значит в отношениях с другими людьми, получается на них влиять. Сам я тупая макака, делаю простые вспомогательные вещи, но ради удобства. Сделал - люди пользуются, а потом эти умники разрабы у себя делают аналогично. Что-то вроде ревности наверное, лол.>>1482275Непонятно к чему ты упоминаешь производство, а значит работу. На работе работники подневольны, делаю что велено. При чём тут эгоизм или "довольствоваться чем-то"? Эти вещи как раз зависят от тебя, чего на работе нет.
>>1482306>Непонятно к чему ты упоминаешь производство, а значит работу. На работе работники подневольны, делаю что велено. При чём тут эгоизм или "довольствоваться чем-то"? Эти вещи как раз зависят от тебя, чего на работе нет.Я к тому, что реальная жизнь (работа) уныла по определению. А оратор выше назвал занятие уничжительным термином лишь за то, что оно невостребовано в этой реальной жизни. Эгоизм же в том, что люди заурядные способны оставаться психически здоровыми, довольствуясь потреблядскими ништяками за непосредственную работу, а люди талантливые лишены такого похуистичного спокойствия ума, и нельзя их за это считать шизиками и создавать насмешливую репутацию вокруг олимпиадной движухи вцелом. "Мне не надо, значит вообще не надо" - натуральный эгоизм. Олимпиадная движуха - смертельно необходимая вещь хотя бы потому, что удовлетворяет потребности интеллектуальной элиты, которая двигает прогресс в самом качественном плане.
Алсо, есть подозрение, что эти непризнанные гении, которые впутывают коммерческую деятельность в свои нетривиальные выебоны в ущерб скучным нюансам качества для конечного юзера, это как раз недоделанные олимпиадники, которые не могут в реальный топ какого-нибудь codeforces. Реальное олимпиадное программирование, как раз таки, отнюдь не тешит их ЧСВ. Норм же посоны олимпиадят по хардкору, а в жизни не выебываются.
>>1482316>Олимпиадная движуха - смертельно необходимая вещь хотя бы потому, что удовлетворяет потребности интеллектуальной элиты, которая двигает прогресс в самом качественном плане.Нет, олимпиады это как раз говно. Если хочется чего-то возвышенного, лучше изучать алгебраическую геометрию, теорию категорий и схемы. Но олимпиадники часто те еще потребляди, и красоту математики пытаются обесценить и свести к надоям чугуна. Олимпиадники это та же продакшен чернь, только сбоку.
В алгебраической геометрии как раз ценится идеальность мысли, красота доказательства. Многие доказательства в ней были переформулированы и передоказаны как раз ради красоты и совершенства и оказались настолько восхитительными, что сам Аллах записывает их в свою небесную книгу. Но олимпиадным червям все это невдомек. Они месят говно и думают, что занимаются чем-то возвышенным.
>>1481726>Представил, что вместо отдельного .h его содержимое продублировано в шапке каждого .c, и сразу все ясно.Но в .h файлах ставятся guardы и прочитаться содержимое, заключенное в эти guardы может только один раз.Поэтому я долгое время и не мог понять, почему это multiple definition, guardы ведь стоят и по идее множественного присваивания быть не должно.
>>1481724>Если ты инициализируешь staticЯ там инициализировал просто переменные, без дополнительных эпитетов, вот так:unsigned char Char = 0;
>>1481933>Тред заполнен ньюфагами на сто один процент.Так это хорошо же. Значит, язык живой, и много людей желают в него вкатиться.
>>1482396gcc -c yoba1.c yoba2.cто же самое, чтоgcc -c yoba1.cgcc -c yoba2.cПри чем тут#ifndef YOBA_H#define YOBA_H...#endif???Это надо, чтоб в отдельно взятом компилируемом модуле ничего не повторялось. Те же определения структур и т.д., словом, все, что определяет поведение компилятора. Переопределения же инициализированных данных и функций во всем проекте при попытке сборки воедино результатов компиляции - это уже линкер в ахуе. Грубо говоря, работа компилятора - заготовить маш.код процедур, со всеми обращениями к полям структур по соответствующим оффсетам и прочей хуетой, а работа линкера - превратить все символы в адреса.
>>1482405Это и есть static. Просто в теле функции надо явно указывать, а глобальные один хуй другими не бывают.
>>1482396Короче, гарды работают независимо для каждого файла, юзающего этот хедер. А как иначе? И зачем? Это если ты инклудишь хедер1 и хедер2, а хедер2 сам инклудит хедер1, то получаются повторы. Как анон выше писал, нехуй жёппой читать. Препроцессор осиль.
Является ли хорошим тоном проставлять такие инклуды для макросов и прочих символов, которые уже были произведены посредством других инклудов? Например, делаю я #include <libxml/xmlversion.h>, и вместе с ним помимо библиотечных функций получаю определение для NULL (он видимо был подключен этим самым xmlversion.h). Нужно ли (является ли хорошим тоном) всё равно самостоятельно заинклудить <stddef.h>?
>>1482223> Однако такое поведение это не порождает полезногоТакое поведение дало тебе qemu и tcc, например. Оба проекта начинались как работы для ioccc.>>1482445Да, по-хорошему не стоит зависеть от чужих инклудов, потому что (в теории) они могут что-то у себя поменять, и твой код сломается. С другой стороны, например, в сишной стандартной либе есть гарантии, что stdio.h обязательно принесет тебе size_t и NULL, поэтому пока тебе не понадобится какой-нибудь offsetof, ты можешь обойтись без stddef.
>>1482316>что оно невостребовано в этой реальной жизниСейчас ты называешь изобретения созданные математиками, благодаря которым произошел прогресс технологий или вся твоя маняматика пук.
>>1482552>Теория вероятности Всего лишь маня-теория, оторванная от реальности>теоретическая физикаО да, это еще те говноеды, посредством какой среды распространяются радиоволны в вакууме/космосе? >криптографияНинужна
Никак не вкурю, записывается ли в файл '\0'? Попробовал записать 10 eos - файл, разумеется, увеличился на 10 байт, т.е. вроде записывается. да-да, сам себе ответил, дебилНо нужно ли учитывать эти невидимые байты при чтении с файла?
>>1482602Нужно, конечно. Когда файл прочитается до конца, возвращается EOF, а не '\0'.Но не делай так в текстовых файлах.
>>1482602Для текста есть специальные функции записи/чтения, где не нужно беспокоиться о нулях и прочих управляющих символах. Если же залез в бинарные данные, там пишется и читается всё буквально, каждый байт как нужно тебе и разбираться тебе.
>>1482423Да, всё так. Попробовал сейчас перекрестно подключить 2 хедера(в хедере 1 инклюдил хедер 2, а в хедере 2 - хедер 1) - выдало кучу ошибок redeclaration. Вот же я жопочтец.
>>1482786Я про то, что они не бывают в стеке.extern - это вообще не определениеregister - лишено смысла, это лишь пожелание, которое никто выполнять не будет в таком случае, т.к. каждая процедура компилится независимо и имеет право юзать проц, как хочет. Главное потом на место все вернуть в регистрах, предусмотренных конвенцией.
>>1482786Это просто подсказки для компилятора, с тем как ему обращаться с этими переменными. Один хуй в один и тот же маш. код все компилится.
Я из мира языков с исключениями, поэтому на всякий случай спрошу:Действительно ли нужно проверять успешность каждой функции? Просто если внимательно обрабатывать каждую непонятную ситуацию, весь код обрастает ифами практически после каждой строки. Пример кода без обработки ошибок: создаем "персону", делаем над ней что-то и уничтожаем ее:person_t person = person_new();person_do_something(person);person_free(person);Выглядит красиво, но нет обработки ошибок. Обработаем:person_t person = person_new();if (person == NULL) goto exit; // <--- могла закончиться памятьint rc = person_do_something(person);if (rc != 0) goto exit; // <--- высокоуровневая логика могла завершиться с ошибкойexit:if (person != NULL) person_free(person);Последний goto exit конечно можно убрать, но я чтоб продемонстрировать, что иф суется практически через строку, а без goto exit вложенные ифы образуют клин. И так по всему коду, практически в каждой функции у меня есть метка exit, аварийно завершающая её. Принято ли вообще обрабатывать ошибки слишком тщательно и обширно использовать goto, компенсируя отсутствие исключений и прочих синтаксических плюшек типа try-with-resources?
>>1483944Я аллоки никогда не проверяю на НУЛЬ))0)У меня 16 гигабайт РАМ, ведьмак тянет - почти на ультрах, а тут это говно память может не дать. Если не даст - снесу нахуй и всё.
>>1483956>У меня 16 гигабайт РАМ, ведьмак тянет - почти на ультрах, а тут это говно еще оптимизировать?Разработка типичного хеллоуворлда или пиксельного восьмибитного платформера в 2019.
>>1483944> Принято ли вообще обрабатывать ошибки слишком тщательно и обширно использовать gotoПринято обрабатывать ошибки тщательно. Часто можно обойтись без goto, используя более мелкие фукнции и/или множественный return.>>1483956> Я аллоки никогда не проверяю на НУЛЬ))0)А потом тебе придет размер чего-нибудь по сети, ты попробуешь столько выделить, а дальше будет так: http://ideone.com/QepQ2j
>>1484113Не понял. Это типа хацкер запросил заведомо нереальный размер, чтоб malloc() вернула NULL, а в качестве индекса - абсолютный адрес взламываемой жёппы, чтоб, не проверив успех маллока, жертва своими же руками оффсетнулась по нулю куда надо хакеру?
>>1480534 (OP)Привет, двач. Есть у кого на примете годный курс лекций по алгоритмам? Знаю, что библией алгоритмизации считается книга Кормэна(потом по нисходящей идут Дасгупта и Бхагарва, тоже знаю) и мне нравится её полнота, однако, формальный язык очень и очень отталкивает, не способствуя пониманию. Да и вообще, формат лекций мне как-то ближе, нежели просто чтение книги. В общем, какие требования? Полнота(речь не об N-полноте, лол) Кормэна в сочетании с интересным, не сухоформально рассказывающим преподом. А, да, и чтобы на русском(знаю, что охуел). Подскажите чего по сабжу?
>>1484257Погугли лекции Хирьянова Т. Ф., По информатике и математике у него одни из самых охуенный лекций что я посещал. Правда хз сколько записей есть.
Что за древнее ссаньё мамонта в шапке? Вся эта залупа собриается через раз с ошибками. Когда ты только вникаешь во всю хуйню это пиздецки мешает, хуй знает как правильно, нихуя не понятно. Свежие бы книжульку в рот ебать.
>>1484470Кто проплатил налет армии хуесосов против КиР? Это единственный пик для шапки треда. Кто возразит - матерей всех ебал.
>>1484487Не ебу ваши местные мемы. Какого хуя на форумах советуют древнее говно, я заёбся уже. Не спорю, хуй сосать на ровном месте может быть полезно, но блядь я же ещё учусь.
Т.е. free(*) нихуяшеньки не чистит (не обнуляет байты) память, а просто возвращает её ОС? Следовательно, к этим данным можно и дальше обращаться?
>>1484224Это реальный баг, если что. Но, конечно, совсем не такой простой, как в примере.>>1484231Да. Тут очень упрощенно, на самом деле это может быть несколько разных запросов, integer overflow в офсете и все такое прочее. Но не проверять malloc() надеясь на сегфолт - глупо.>>1484528> Т.е. free(*) нихуяшеньки не чистит (не обнуляет байты) память, а просто возвращает её ОС?Даже в ОС не сразу/не всегда возвращает.
>>1484528>возвращает её ОСЕсли бы malloc/free каждый раз дергали sbrk, ты бы охуел от "производительности". Вероятнее всего, после free() ты все еще сможешь прочитать что-то по тем же указателям.
>>1484528>free(*) нихуяшеньки не чистит (не обнуляет байты) памятьГде в слове "free" ты видишь значение "очистить"? Или в документации этой функции покажи пункт.
>>1485587Это процессорные исключения, не крестовые. Но в сишечке исключений нет вообще никаких, зато в ней есть UB, позволяющие программе после возникновения UB вести себя так, как ей вздумается. Вот этой вздумалось вызвать исключение, потому что ты пишешь по неинициализированному указателю p (или lineptr, там не совсем понятно без кода).
>>1485668Это риторический вопр.знак был. Я сначала подумал, что это и вправду крестовые исключения, и имел ввиду, что нет прямой иерархии между низкоуровневыми и высокоуровневыми языками, то есть никто не запрещает использовать библиотеку, собранную с крестовым конпелятором, на Сишечке.
>>1485670> Исключения ядра ОСЯдро ОС их переименовало, источник - все равно процессор.> Процу не все ли равно, какие байты дрочить?Нет. Он не знает, как писать в незамапленные страницы виртуального адресного пространства и плюется #PF (page fault), а винда видит, что мапить туда ей нечего, и говорит access violation.
>>1485665Да, с ошибкой разобрался. Прост меньше всего ожидал увидеть exception thrown>>1485674То есть фактически это dll'ка бросила исключение?
>>1485728Ну я же тебе написал, у тебя p == NULL. Ты делаешь strcpy(NULL, line), дллка никакой магии не делает, там внутри будет что-нибудь типа while(∗p++ = ∗line++); только оптимальнее, оно пишет по NULL, проц/ядро генерируют исключение, студия его перехватывает и показывает.
Итого, сишечка как таковая в чистом виде не нужна. Зачем нужен язык без исключений, если ядро использует исклюсения? Наверное только на малинках и прочих микроволновках без ядра и исключений.
>>1485828>>1485829На малинках линукс, на ардуинах плюсы. Ты наверное имел ввиду embedded в целом.>Зачем нужен язык без исключенийА зачем нужны исключения? С это кроссплатформенный ассемблер. То, что его использовали как источник вдохновения для большинства популярных императивных и ООП языков, является большим недоразумением. Отсюда представления, что Си -- какой-то хуевый язык, в нем нет исключений, ООП, метапрограммирования, лямбд, функторов и монад, что за хуйня. В то время как проблемы не у Си, проблемы у всех остальных императивных языков, начиная с C++, и проблемы очень большие.
>>1485784А ОС как об этом узнает? Из астрала?>>1485828> Зачем нужен язык без исключенийА есть с исключениями? Может быть, кресты могут отловить виндовые исключения? Это решается системными средствами: сигналами в *nix, или всякими SetVectoredExceptionHandler в винде, и это не зависит от языка.
>>1485835А да, ты прав, я с access denied перепутал, сцуко опять. ОС также сама может генерировать исключения.Access violation page fault - железячное прерывание, а Access denied - софтверное.У C++ тот же SEH внутри насколько я помню.
>>1485832Окей, вот только не надо максимализма. Я же не зря написал "в чистом виде".ООП не нужен, но классы нужны, без них плохо. Лямбды это лишь встроенный код, как код может быть не нужен?Функторы это указатели на функции, они и так есть и нужны естественно.И какие такие у С++ проблемы, если это та же сишечка, только дополненная? Если для тебя наличие кучи возможностей, которыми можно спокойно не пользоваться или пользоваться по желанию, это плохо, то советую в дурку проследовать. Наличие не может быть плохо в принципе, если оно не навязано, а кресты ничего не навязывают, это не жаба с решетками и прочими хаскелями.>>1485835Не в этом дело. Если даже процессоры и ядра на низком уровне используют исключения, значит исключения это хорошо, это действительно удобно, а в языке для приложений и подавно. Не иметь их неудобно, это инвалидность, поэтому чистая сишка это убогий ненужный язык. В С++ я могу писать как на Си, но кидать исключения, это очень удобно, а еще использовать классы, например для СОМ или GUI библиотекэ, то очень удобно.
>>1485843> У C++ тот же SEH внутри насколько я помню.Да, но оно не умеет ловить другие виндовые исключения, оно работает только со своим собственным (0xe0чтототам), поверх которого реализует все свои raise.
>>1485851Я поддвачну этого оратора.Пишем на работе драйвер на С++, никакой стандартной библиотеки само собой, но, тупо уже шаблоны и RAII\Деструкторы настолько упрощают разработку, что я тоже искренне не понимаю, зачем вообще писать на С в 2019
>>1485853Ага, нинужны короче сишечке эти крестовые пердоли, которые в ядре не работают, между прочим. SEH с головой хватает.
>>1485856Удвою коллегу, очень удобно прогать драйвера на плюсах, а то лапша из goto try except finally глаз мылит, да и сишный код дебажить в голове не комильфо.
К слову о крестах. Устроиться на работку, где чистые Си, весьма непросто, если ты не усатый мужик в тельняшке квадратных очках, который одним хуем пишет драйвер для Linux, а вторым - кастомную прошивку инжектора нексии, и все это под синькой. Стало быть, С++ - единственный адекватный вариант вката в коммерцию для не макак. Но дело в том, что нет достаточно крупных идей, чего такого наваять, чтоб прибегание к плюсам было оправдано. В итоге, я всегда склоняюсь к богоподобной сишечке, где ничего лишнего и все по красоте. С чего же начать заселение своего гитхаба, чтоб зашло работодателю Junior C++?
>>1485877>Но дело в том, что нет достаточно крупных идей, чего такого наваять, чтоб прибегание к плюсам было оправдано.Тебе выше написали, что RAII и деструкторы настолько упрощают жизнь, что нет смысла писать на си в 2019.Можно не использовать стандартную либу (особенно iostream какой-нибудь), классы с VMT или исключения (тут сложнее, но век пиковских контроллеров ушел), но у С++ всегда было что предложить для аскетичного сишника. Всего два класса - vector и string, уже упрощают код в разы.>С чего же начать заселение своего гитхаба, чтоб зашло работодателю Junior C++?Самая главная прелесть С++ в том, что даже 1 пуллреквест в крупный проект - это 100% прием на работу джуном.Не нужно годами пилить какие-то имиджтудулисты, не нужно даже думать о пет-проекте, если ты способен1. Открыть проект на гитхабе и изучить его2. Найти там баг3. Пофиксить его и правильно оформитьТебе уже есть работа на крестах. Потому что крестоджунов, умеющих это, очень мало, кресты учат в универах на уровне laba.cpp.
>>1485915А если патчить Linux пулл реквестами это может с поиском будущей работой на C/C++? Хоть там и чистый С, но все же
>>1485915> Всего два класса - vector и string, уже упрощают код в разыПод них все равно придется аллокаторы переписывать.
>>1485915Толстота, нет? Сейчас куча фазеров и прочей лабуды на автомате находит баги, остаются только уж совсем сложные UB, которые невозможно воспроизвести или заметить одним лишь чтением исходников.
>>1486205Тогда бы issues на гитхабе были пусты, а они полны. Берешь один такой баг, воспроизводишь, фиксишь. В опенсорсе дохуя багов, которые живут не потому что они сложны, а потому что некому фиксить.Если совсем лениво, можешь спросить у мейнтейнера какую фичу запилить. Но это сложнее
>>1486294Так их фазерами/анализаторами и ищут, 2019 год на дворе, никто не будет тонны кода разбирать руками.
>>1486319Два чую, а двач это киберпространство с одним аноном, который застрял на корабле посреди космоса.
>>1486238Я дожил до века мультигигабайтных плашек ОЗУ не затем, чтоб юзать только 24 бита адресного пространства. Ну а так да, крестовекторы не нужны, когда есть охуительные макросы.
>>1486407А как тебе такое?https://github.com/attractivechaos/klib/blob/master/khash.hЯ припух если честно, когда в первый раз увидел.
>>1486623Я про архитектуру, а не ОС. О какой крестовой STL может идти речь под всякие STM32? А Сишный код с няшными макросами аккуратно перенес, и все ок. Согласен, хуйню несу...
>>1486623Оба кроссплатформенные.>>1486628На самом деле на крестах очень интересно с memory-mapped портами работать, в том числе и с bit-bands в STM32: красиво, удобно, безопасно. Но цена этого - несколько абсолютно нечитаемых файлов с шаблонами, в которых хуй разберешься, когда/если что-то пойдет не так. Так что мы уж лучше как-нибудь по-старинке, на сишке с дефайнами.
>>1486741>Так что мы уж лучше как-нибудь по-старинке, на сишке с дефайнами.На крестах дефайны запретили?
Сап, /pr. Уже спрашивал в /ra, там, походу не знает никто.Пытаюсь использовать simavr для, собственно, симуляции avr контроллеров в linux у меня arch. Симуляция, вроде, работает, но при попытке подключится с помощью gdb, simavr пишет>remote_gdb_handler opened>remote_gdb_handler closedи нихуя не происходит. В Гугле забанили за тупые вопросы таких проблем не нашёл. Знает кто, что и куда пердолить, чтобы заработало?
>>1486628Пиздец какой-то, чем только байтоебы не оправдывают свое нежелание учиться.Алло, STM32 - это 32-х битные контроллеры, работающие быстрее машин какого-нибудь 1996 года, при чем стоят они по 100 рублей за штуку в розницу и их сейчас можно чуть ли не в магнитики для холодильника пихать. Сейчас спорить можно о том, можно ли использовать на контроллерах минималистичный жаваскрипт, а не о С vs. C++.Что касается непосредственно "портянка макросов" vs "темплейты", то разницы в оверхеде между ними нет никакой. Но при этом ты теряешь поддержку системы типов, и, что более важно, RAII.
>>1486864> работающие быстрее машин какого-нибудь 1996 годаТактовую частоту сравнил, лол? Нет, это так не работает. Это мало того что тормозной ARM, так еще и неполноценный от рождения Thumb. И памяти там нет. Ну это если мы про F1 говорим, которые за 100 рублей. Поэтому нет, никаких крестов там близко не нужно, нет для них задач. И выбор стоит такой: простая, понятная и предсказуемая сишечка vs. очередная ебань, которую притащит WG21 уже вот-вот, и которую обязательно нужно начать использовать, потому что теперь так модно.> минималистичный жаваскриптЯсно, ты из этих. А тут-то ты что забыл в таком случае?
>>1486844А зачем?Микроконтроллеры надо симулировать на реальном железе с осциллографом.А для простой отладки на компе достаточно AvrStudio и Протеуса.
>>1486942>Поэтому нет, никаких крестов там близко не нужно, нет для них задачЭто для тебя, чмоня из /ra/, которая в 2019 году не может разобраться с темплейтами и RAII, нет задач. Нормальные люди берут С++ просто потому, что никакого смысла брать сишку нет. Даже если у тебя в память не влезает STL. Даже если ты мигаешь диодом. Вообще ноль смысла.
>>1486860Not funny, didn't laugh.Да. И дебаггер, и симулятор, и компьютер.>>1486935Ты тут системосрач развести хочешь, или просто в глаза ебёшься?
>>1487441Не, в C это так не работает. Нельзя выучить какой-то конкретный набор фреймворков, после чего можно было бы рассчитывать на позицию джуна. Тут используют сравнительно небольшие библиотеки, причём выбор конкретных библиотек определяется целями проекта, и везде он свой. GLib, GTK, C POSIX library
>>1487246>убогому напомнили о существовании приличного мира с приличным софтом>ВРАГИ ХЕЙТЕРЫ НАПАЛИ! РЯЯ!! СПАСИТИ!!Не могу остановиться проигрывать. На всё твой личной выбор, петушило. Выбрал пердомир, отринув адекватный, так пердолься, страдай сам, преодолевай сам, это был твой выбор. Но нет же, лицемерной шлюшке хочется два слула сразу, и понтоваться хардкорщиком, но и чтобы было легко как казуалу.
Ну раз такая пьянка - какие подводные писать на "Си с классами"? Мне от крестов нужны разве что строки, вектора и ассоциативные массивы.
>>1487664Подводные есть. Кто там говорил, что С это подмножество С++?>1) const в глобале = static const (только в C++)Допустим у нас есть header.h: const int h = 5;Если мы его включим в несколько .c файлов без защитных директив, то линковщик С выдаст multiply definition, а в С++ все скомплится на ура. А все потому, что в С++ h является локальной в каждом файле, куда подключен header. Если нужно использвать const int через extern, то при определении переменной, надо писать extern const int h= 5>2) В C++ нет VLA. int foo (size_t n, size_t m[n]); // Не скомплится в С++Хотя не все комплиторы работающие с С11 могут в VLA, а вот для C99 поддерживать обязаны.3) В обоих языках допустим такой код:int foo(int m[]); // (1)Что эквивалентноint foo (int m); // (2)Давайте пропишем сами указатели как константные (зачем?):int foo (int const m); // Код валидный в обоих языкахЕсли вы привеженец писать без "", то в С возможен вариант:int foo (int m[const]); // Работает в >C99int foo4) Если ты, мамкин оптимизатор, захотел юзануть restrict в объявлении функции, то знай:int foo(char restrict m); // Работает только в Сint foo(char __restrict m); // Работает в обоих языках5) А еще в Си вместо темплейтов есть _Generic:int print_int(int d) { printf("%d\n", d);}#define print(d) _Generic((d), int: print_int)(d)main() { print(123); }6) Ну и конечно же Compound Literals. Онли С совместимый код белоу:char foo = (char []) {"x", "y", "z"};int i = ++(int){1};
>>1487685Тут просто сидят тупые школьники/студентишки на первой стадии Даннинга/Крюгера, отсюда и нападки на красноглазиков и крестовиков. Просто игнорируй их, и все будет хорошо. Ещё лучше будет каждый раз когда видишь их посты просто отвечать им пидорас съеби или типа того
>>1487747Да он почему-то решил, что ты C99 код будешь миксовать с С++. Нахуя так делать, вместо того, чтобы взять С++ и писать на си с классами - не понятно.
Перепечатал книжную программу перевода из двойной системы в десятичной. Почему после компиляции консольного приложения в MinGW 64 (пишу в Qt Creator) операции выполняются в 32-битной арифметике?
>>1487927Нафига long тоже самое что и int?Почему не сделали так:char - 1 байтshort - 2 байтаint - 4 байтаlong - 8 байтlong long - не нужон.
>>1487935С фига, что инт зависит от архитектуры, а формальные определения типов - от соглашений языка. Когда я учился в школе, он еще был 16 битным.
>>1487935long - размер регистра, long long - 64 бита, и если регистр меньше, то усложняется маш.код, а int - просто int, лол
>>1487927> Он тоже 32 битный вообще то.Это зависит от ОС: у тебя либо модель LP64 (линукс) либо LLP64 (винда).>>1487935> Почему не сделали такЛегаси. Изначально инт должен был быть самым быстрым целочисленным типом из поддерживаемых, а long - самым длинным (и это раньше так и работало: в 16-битных машинах short/int 16-битные из-за 16-битных регистров, а long 32-битный, в 32-битных int/long оба 32-битные), но потом из-за неосиляторов, написавших в 32-битном мире кучу говнокода, схему доломали, оставив int 32-битным на 64-битных машинах. Теперь #include <stdint.h> и используй (u)int_fastX_t, если тебе нужен какой-то минимальный размер для вычислений, (u)int_leastX_t для хранения в памяти и фиксированные (u)intX_t для записи в файлы или обмена по сети.
Откуда вы вообще int long и прочее говно взяли? На маш. уровне все в word'ах измеряется. Если что-то не нравится пиздуйте в C# тред.
>>1488252Итт нет никаких вордов. У нас абстрактная машина, у которой даже процессора нет по стандарту. Страдай.
>>1488366Зависит от ситуации.Если ты просто выделял память под маленький объект, а она кончилась, то все, приехали.Если ты хотел выделить 8гб памяти под какой-нибудь йоба кэш, то можно сказать "ну ок, попробую обойтись четырьмя"
>>1487685>указал на тупость и лицемение конкретного автора поста>ЮНИКСВЕЙ ХЕЙТЯТ! РЯЯ!!Классика маргинальныех ничтожеств - обобщать и прятаться за чужими спинами общих понятий, тем самым уводя разговор от конкретного мерзкого лицемерного чмошника.И неудивительно, ведь ничтожество поэтому и ничтожество, что нуль, не существует как личность, отсутствие которой заменяется причастностью к чему-то общему.
>>1488387Вкатись сначала в ассемблер и посмотри архитектуру процессора.Тогда в Си сможешь вкатиться как по маслу.
>>1488282Что, простите? Везде использую DWORD и BYTE, а ваши инты и лонги в душе не понимаю, мутная фигня.
>>1488433Какой из ассемблеров взять? Сижу под linux, люблю кроссплатформенность и поддержку нескольких архитектур.
>>1488459Рот ебал этого GAS! Там синтаксис под древний парсер, который давился, если составляющие инструкции даны не в той последовательности, в которой их в маш.код складывать. Кровь из глаз, сука. Зато выглядит так коркорно, тип технарь дохуя, короче заебись тема, отвечаю.
>>1488366Вывести сообщение юзеру, мол у тебя нет памяти или просто записать это в лог и выйти из программы.
>>1488664[eax+size∗2] или (%eax,%ebx,2) - что понятнее? Алсо, такая хрень чаще встречается на месте source операнды, соответственно, лучше ставить ее в конец, чтоб все лежало под линеечку (в AT&T для этого надо ставить дохера табов). % $ туда же - кровь из глаз. И так видно, где константа, а где регистр. Закорючки только мешают, они древним ассемблерам нужны были, чтоб в один проход все делать без разбору. Суффиксы b/w/l/q слитно с мнемоникоми, когда есть божественные Intel-овские byte, word, dword, qword... Короче, Intel - человекочитаемый.
>>1488664Но осилить AT&T и забыть как страшный сон - must have, соглашусь. Он первичен, а Intel не везде есть. Образованный человек не имеет права не разбираться в нем в случае чего.
>>1488705>что понятнее? Второе, кровь из гоаз, это интеловская залупа, где они перемащают справа на лево, как пидоры, да и $0x20 более наглядней чем 20h
Правильно понимаю, что в поинтере хранится лишь адрес объекта и оффсет (т.е. size_t), и следовательно это вся инфа о типе? А что происходит, если несколько разных тайпов имеют один и тот же размер?
>>1488717В поинтере хранится только адрес. Типы известны только во время компиляции, в рантайме их нет.
>>1488707Образованный человек должен знать об AT&T всего две вещи: -masm=intel и -Mintel для gas/gcc и objdump соответственно.
>>1488717>инфа о типеКатись обратно в свою скриптопарашу. Здесь этого кала нет.>А что происходит, если несколько разных тайпов имеют один и тот же размер? Ничего, такая программа не компилируется, а значит не существует. Получится только текстовый файлик с твоими тупыми писульками, никому не нужный как и ты сам.
>>14887150x привычнее для сишников, но ты, как истинный демагог, мешаешь все в кучу, $ тут ни к чему. Насчет справа налево господин выше уже ответил. Алсо, операнда назначения ближе к мнемонике органично продолжает случаи, где является несменной частью инструкции, как та же DIV/IDIV, которая всегда оставляет целую часть в RAX, а остаток - в RDX. Ну, и про вертикальную читаемость выше писал.
>>1488969GAS умеет в интеловский синтаксис? Ебать я танкист, оказывается можно без NASM обойтись. И ведь задним числом очевидно же, что раз gdb и gcc поддерживают...
>>1489092Ты че, совсем еблан? В каком месте, ХОТЬ РАЗ БЛЯДЬ СУКА ПОКАЗАЛ ПАЛЬЦЕМ А ТО МАТЬ ВЫЕБУ, кто-то писал, что не осилил? Это тот случай, когда легко в учении, тяжело в бою. Выучить AT&T можно за вечер, но к постоянной работе в жизни не привыкнешь - всегда будешь больше страдать физически. Этот синтаксис родился не от хорошей жизни, а от ограниченности тогдашних ассемблеров, не умевших в стек, чтоб читать предварительные указания с конца. Человеческое зрение, в отличие от однопроходного транслятора, склонно упускать детали по первом проходе и любит, когда уточнения выведены дальше, когда пространство слева и справа равномерно используется. И, конечно же, глаз только спотыкается об закорючки, в которых нет нужды, ведь для этого существует целая живая нейросеть, которая прекрасно распознает на лету, как выглядит константа, а как имя регистра, блджад. Как только появилась возможность, сразу реализовали такой человекочитаемый синтаксис. Я тоже любитель всей этой первичной романтики, но искать плюсы в том, что хуево по определению, попахивает шизой.
>>1489087>операнда назначенияПросто потому, что у тебя слово "операнд" женского рода, ты тупой хуесос, и читать твои высеры бессмысленно.Подучи русский язык, потом приходи.
Анон, привет, прошу накидать годных видео по Си на ютубе. Я не могу найти ничего интересного кроме туториалов для новичков(которые мне уже не нужны) и несмотрибельных индусских видео.Вообще все интересное по темя языка сгодится, в том числе и в текстовом формате. Любая годнота вроде статей/блогов, форумов Особенно реквестирую видео про написание каких-нибудь интересных проектов типа написания шелла или системных утилит, псевдоооп в Си, а также туториалов для "продвинутых нубов", где разжевываются всякие интересные штуки, типа Flexible Array Member. (А по Си вообще проводятся конференции, как в других языках типа CppCon?) Можно скинуть мне напрямую в телегу @littlerichard Просто нравится Си, заебись язык (по ANSI C угораю). Хочу писать реально крутой идиоматический код, эффективно работать с гдб из под командной строки, научиться тесты писать.Но, к сожалению, не могу себя заставить читать гигантские талмуды на 300 страниц на английском, концентрации не хватает. Мой идеал - небольшая статья, где теории поровну с практикой. Или книга /брошюра на 40-50 страниц простым языком.Сколько раз пытался читать книги, всё равно итоге хуй забивал. Целую библиотеку мощных книг собрал, толку ноль. Поэтому, раз я не могу потреблять контент через книги, то ищу что-то более легкоё для восприятия.Ничего плохого в этом не вижу и думаю, что я не один такой.Вообще, хочется дойти до того уровня, чтобы устроится "джуном" куда-нибудь в системную разработку или embedded через ещё полгода дрочки Сишечки, но хз, нужны ли кому-нибудь такие джуны и набирают ли не студентов техвузов на такие места.
>>1489819Да я... Да я... Я "Войну и Мир" читаю, вообще-то, так что не надо! А с операндами не ебу, как там правильно, пушто, как уважающий себя элитарий, технолитературу читаю на инглише! Ну скажите ему, затролльте его, ну пазязя!
>>1489849Так он написал, что можно в телегу, я так понял, если отвечающий сам не захочет мусорить в треде контентом зумеро-ориентированного формата, но в то же время сам шарит в подобном контенте, лол.>>1489825Анон, сам себе могилу роешь. Тебе все равно рано или поздно придется много читать скучные тексты без экшона. Вот прям неизбежно и дохуя, или ставь крест на карьере Сишника. Чем раньше превозмогёшь эту слабость, тем дешевле потом выйдет.
>>1489914> не захочет мусорить в треде контентом зумеро-ориентированного форматаУ нас в треде вообще контента нет. Последние два треда - исключительно срачи.
>>1489825>Но, к сожалению, не могу себя заставить читать гигантские талмуды на 300 страниц на английском, концентрации не хватает.Так нахуй из профессии, маня.
>>1490128Для практики и понимания сути. Я ведь не собираюсь тягаться с фреймворками типа tensorflow. Простенькие хотя бы научиться.
>>1490137Для понимания сути нужно освоить matrix calculus и подифференцировать с ручкой и бумажкой. Кодить там нечего.
>>1490188Короче matrix calculus это часть multivariable calculus. Дифференцировал несколько переменных? Вот тоже оттуда примерно тема.
>>1490191Нейроны это вообще не используемая в нейронках абстракция. Минимальная абстракция - это слой. В случае полносвязного слоя это f(W*x) например, где W - матрица весов (технически строка такой матрицы это веса одного нейрона, но это довольно бесполезная инфа), а x - вектор входных данных, f - функция активации.В случае сверточного это f(conv(x, W)). Ну и так далее. Никаких нейронов нет, тебя наебали.
>>1489941Пишешь на си интерпретатор питона или на чём там сейчас нейроночки пишут и хуяришь на питоне свою нейронку, запуская на своём интерпретаторе.
>>1490542"Влезает" и "можно точно представить" - это разные вещи. Полный диапазон float ограничивается максимальной/минимальной поддерживаемой экспонентой, но для конкретной экспоненты ты всегда ограничен размером мантиссы, т.е., для каждой конкретной экспоненты у тебя есть "текущий" диапазон, который равномерно разбит на фиксированное количество чисел (223 позиции).Например, для диапазона 223 и 224 ты можешь сохранить 8388608 числа с шагом 1.0. Между 224 и 225 у тебя чисел вдвое больше, а "мест" для них все равно 8388608, поэтому ты уже не можешь позволить себе хранить нечетные числа, и , между 225 и 226 тебе уже не хватает мест для всех чисел, которые не кратны 4, и т. д, с ростом экспоненты числа становятся все менее точными.Все это приводит к забавным эффектам типа http://ideone.com/ZeHtT5
>>1490520Когда работаешь с флоатами, пиши 2e20f вместо 2e20, или не удивляйся.Потому чтоa = 2e20 это на самом деле a = (float)2e20;При конверсии double во float у тебя теряется точность, а именно2e20=200000000000000000000.00002e20f=200000004008175468544.0000Далее при вычислении a-2e20, ты из 2e20f вычитаешь 2e20, то есть 200000004008175468544.0000 - 200000000000000000000.0000.Само вычисление считается в double, и только после вычисление результат конвертируется во float.
Пиздец как же меня бесит этот ебучий тред. С удовольствием разъебал бы ебасосы половине пишущих сюда. Фу ебучие студентишки и вкатывальшики, срущие своим ебанутым недомнением. Сдохните
>>1490520float - ненужная бяка. В языке по дефолту double (как >>1490600 рассказал), что должно намекать прозрачно какой тип использовать.
>>1480534 (OP)Подскажите плес какую программу использовать на вын 10 для программирования на C. Знаю о VS 6, Builder.Зачем мне это надо? Хочу попробовать для сравнения написать простейшее приложение в связке с OpenGL.
>>1482383>Если хочется чего-то возвышенного, лучше изучать алгебраическую геометрию, теорию категорий и схемыА еще дискретную математику. Без нее канплюктер саенс невозможен
>>1482388>Они месят говно и думают, что занимаются чем-то возвышенным.Ну относительно промышленных программистов - да. Как и маняматики свысока смотрят на олимпудников по программированию
Ben Klemens "21st Century C: C Tips from the New School" (2012)Вообще не понял о чем и главное зачем.
зачем предлагать читать k&r если она устарела? кто нибудь выполнял там задания?(вам не кажется что они не для новичков?)
>>1491281Типа классика,на самом деле советуют просто потому что самая распиареная.Если говорить об обучение с нуля,то это прата какой-нибудь наверное
>>1491806Нет. У оригинального K&R только два издания. А третье издание на руском - это перепечатка второго издания на русском.
>>1491281>зачем предлагать читать k&rЛучше книги нет>если она устарелаСи тоже устарел>кто нибудь выполнял там задания?(вам не кажется что они не для новичков?)Они не для тупых, но ничего того, что бы не знал новичок, там нет
>>1491839> Они не для тупых,Это точно. Я над блядскими вертикальными гистограммами бился явно дольше нормального человека.Мимо
>>1491839после k&r вышло много изменений, вышло несколько стандартов, в которых писать некоторые вещи стоит по-другому. Ок задания не для тупых. Кто их выполнил все? есть тут в треде герой?
>>1491839> Си тоже устарелОн не может устареть. Или кучу кода вдруг перепишут на rust? Нет, конечно. Ядро Linux как писали на C/C++, так и будут писать. А оно используется везде: от листрибутивов Linux до android смартфонов.
>>1491855Устареть он может, как и кобол, и фортран, и куча других легаси-языков.А за сочетание C/C++ вообще нужно пиздить обломком трубы.
>>1491860> фортранВ науке используется до сих пор. Да, скорее из-за легаси.> А за сочетание C/C++ вообще нужно пиздить обломком трубы.А на чём писать? Неужели всё-таки на Rust?
>>1491920if ( isdigit(n) ) { Не работает,но подозреваю,что я дебил n = n -'0'; n = 9- n; n = n +'0';}
Нужно написать свой принтф, переменное число параметров я уже понял откуда и какОсновная суть какая? Парсить первый аргумент-строку, пока не встречу какой-то флаг %f, как только встречу передавать следующий аргумент в отдельную функцию по обработке флагов? Никаких подьебов нет? Кроме даблов, хуй знает как их выводить вообще
>>1492121Нахуя? Студент? Если да то забей, даже близко не сможешь. Если реально надо, то кури <libioP.h> , <libio/stdio.h>, <libio/ioputs.h>, только там все это реализовано в докрестовом ООП стиле, ахуеешь разбираться
>>1492121> как только встречу передавать следующий аргумент в отдельную функцию по обработке флагов?Сначала парсишь спецификатор, потом достаешь аргумент, потому что va_arg() хочет тип, и обязательно правильный тип.> Никаких подьебов нет?Никаких подъебов, никакой магии. Обычная функция, внутри длинный switch. Вот с snprintf чуть посложнее из-за необходимости контроля границ.> Кроме даблов, хуй знает как их выводить вообще Обычная математика, делишь, умножаешь.
>>1492121>Кроме даблов, хуй знает как их выводить вообщеСейчас бы заниматься байтоебством, когда проц в одну инструкцию переводит float в int.print_int((int )n);putchar('.');print_int((int )((n - (int n))∗prec))prec - кол-во знаков после запятой
>>1492245> Сейчас бы заниматься байтоебством> когда проц в одну инструкцию переводит float в intТогда, наверное, для тебя не составит труда перевести в строку вот это число:float value = ((union {uint32_t v; float f;}) { 0x00ffffff }).f;На выходе я хочу увидеть точное значение. 0.00000000000000000000000000000000000002350988561514728583455765982071533026645717985517980855365926236850006129930346077117064851336181163787841796875. Именно его и выводит printf("%.149f", value).
Анон, ты просто не представляешь какой я долбоёбище.Закончив читать прату на ~75%, я решил зарегаться на рекоммендуемом ресурсе Codewars, дабы начать прокачивать скиллы.Я крайне поверхностно ознакомился с FAQ и мануалом.Выбрал себе задачку для начинающих. Какой уровень задач для начинающих? Естественно, как я думал, 1kyu. Задачка с матаном, матричками, как я люблю.И тут начался пиздец.3 недели решал частный случай, вроде работает алгоритм. Вроде как набросал стратегию решения общего случая. Читал пейперы про способы решения. Начал это все кодить. Через месяц бросил, ибо если я настолько тупой, что не могу решить задачу самого базового уровня - какой смысл в этом вообще?Прошло полгода, в течении которого я уговаривал себя что программирование не для меня.И вот, вчера я узнал что 1kyu это практически мастер. А нумерация (обратная) начинается с 8kyu.Полгода разбитой самооценки и попыток разлюбить дело о котором думал на протяжении нескольких лет и к которому собирсялся серьезно готовиться.И все из-за того, что невнимательно прочел мануал.Мне не место в программировании, ибо я тупой мудак.
>>1492124>студент?Да, но это проект, который сдать надо, да и интересно написать>>1492130Покурю, спасибо>>1492187Примерно понял, спасибо
Я тот парень сверху с символами/цифрами,кароч,мне училка затирала ,что увеличение массива на единчку для цикла(17,30 строка),как то хуево меняет массивСама суть,изменить каждый символ-цифру на 9- символ-цифраВообщем,если не сложно поясните,что не так с прогой https://pastebin.com/vxRiYYBc
Антоны, почему приведенный код дает такой странный вывод? По идее, функция должна изменить указатель на тот, который указывает на массив в ней созданный, но этого не происходит. Почему?
>>1492581Ты просто пытаешься сделать так:n = arr;n++;Такое тут не прокатит, потому что ты просто скопировал в переменную n, которая ничего с массивом общего не имеет, значение массива и затем изменяешь не сам массив, а эту переменную. Надо сделать так.arr++;
>>1492587Ты в укозателях запутался. Тебе нужно сначала дереференснуть, а потом уже ебаться в арифметику. Т.е., ∗(∗a + i). Чтобы такого не происходило, и код нормально читался, не стесняйся создавать дополнительные переменные:ptr = malloc(...);......∗a = ptr;
>>1492581> увеличение массива на единчку для цикла хуево меняет массивПри N = 3 ты индексируешь массив целыми значениями [0;2]> for (i=0;i<N+1;i++)При i = 3 < 4 ты выходишь за пределы массива.> int N=3> char Ni[N]> Введите размер массиват. е. ты сначала объявляешь массив из N элементов, а потом вводишь его размер?
>>1492651При в строгом неравенстве (i < N - 1) при (i = N - 1) цикл будет завершаться без инициализации (N - 1)-го элемента. т. е. можно заменить на нестрогое неравенство (i <= N - 1) или же записать (i < N).
>>1493594>зачем учить си в 2019? какие перспективы?Может потому, что это самый популярный язык, наравне с Джавой?
>>1493768Нет.>>1493786>попробуй найти работу на пьюр сиНИИИИ>>1493778>Такой себе индекс для суждения о популярности.Он, кажется, ориентируется по гуглежу этого языка, поэтому популярный в иностранных ВУЗах VB.NET такой крутой. Так что рейтинг сосет.Хотя если посмотреть сколько написано в данный момент на си, то он действительно будет в топах, только вопрос в том, что он нового не пишут и работы чистой не найдешь сука.
>>1493768>basic bootloader сложнее, чем компилятор C?Как по мне здесь сложности неадекватно распределены.
Никак не могу понять, что за чистый си про который тут все говорят? Это те самые void••• ANUSAPI CALLBACK WIERDSTACKRULE fn(void•,void•,void,void•,void•, FUNC•, void,void) ??? Потому что это первое что мне представляется при слове ЧИСТОЕ СИ. а вы, сдается мне, представляете себе синтаксис уровня laba.cpp и подгораете что с ним нет работы? Серьезно?
>>1494087>void••• ANUSAPI CALLBACK WIERDSTACKRULE fn(void•,void•,void,void•,void•, FUNC•, void,void)Да, это то самое. Это memaset(228, anusStruct->huj->pidor);
>>1494010Да, у тебя %c считывает символ перевода строки. Не нравится - fgets и потом парсишь, или char temp[2]; scanf("%1s", temp), c = temp[0], или даже while((c = getchar()) != EOF) { if (!isspace(c)) { ungetc(c); break; } } и потом scanf(%c). Вообще, scanf сломан из коробки, его не стоит использовать для чего-то сложнее scanf("%d %d %d"...).
>>1494194Хм. Спасибо.Я не ставил const нигде, но скопировал пример для C++. А именно это в С немного по-другому.
>>1494220Компилятор допускает, потому что легаси. Сначала было просто соглашение, что в "" писать нельзя. Если бы сделали строки константными указателями после того, как в языке появился const, сломался бы весь существующий на тот момент код, который ожидал и передавал обычные char *. Поэтому строки как бы const, но без const.
>>1494220Запись по const указателю ловится во время компиляции, а запись в read-only память - во время выполнения. Первое нужно для себя, чтоб не забыться и не сломать логику. А константность "" заключается в самом способе реализации - использование readonly памяти, как и для исполняемого кода. Как анон выше написал, "" не являются const char ∗ в системе типов, потому что многие старые функции, часто используемые с "" в качестве аргументов, объявлены как func(char ∗, ...); и компилятор просто кидал бы error.
>>1494576Аноны, не скидывайте этому джахилю решение, а то совсем уже офигели. В двач как ГДЗ для них.
>>1494784Потому что в UTF-8 один русский символ занимает 2 байта, а у тебя буфер всего 10 символов. Поэтому лучше играй с латиницей, пока язык учишь.
>>1494807Спасибо, анон!И главное, ведь, читал про 2 байта у utf-8, выше в этой же книге и вот теперь до меня дошло!Мог либо перекомпилить, чтобы длиннее строка была или юзать wchar_t word[10];
>>1494933Мы не будем тебя диванонить, если ты извинишься перед бордой и Абу лично за свое наглое поведение.
>>1494945О,великий и всемогущий Абу и милостивый народ Двощевской земли,я ,Антон Анонов,прошу простить мою наглость и неблагоразумие
>>1495010Это только UTF32, с которым получается лютый оверхед по памяти.Плюс, для простых операций вроде поиска подстроки или поиска ASCII символа (вроде разделителя пути \ или /) в UTF8 строке не нужно никакой дополнительной магии, с ней можно обращаться также как и с ASCII строкой.
>>1495019> с ней можно обращаться также как и с ASCII строкойУ меня от тебя имена файлов в линуксе, которые могут быть чем угодно, лишь бы \0 на конце. И ебись как хочешь.
Поясните плес за эту хунью>'strcmpi': The POSIX name for this item is deprecated. Instead, use the ISO C and C++ conformant name: _strcmpi. See online help for details.
>>1494250>>1494268То есть в С++ можно так сделать, а в С без malloc не обойтись?Я правильно понял?Я задачку решаю на codewars.
>>1495262Достаточно написать char strin[] = "HELLO WORLD";, тогда константая строка скопируется на стек и будет все работатьhttp://ideone.com/Lt5D6x
>>1495321Ниет. Символов в юникоде внезапно больше, чем влазить в 16 бит, так что UTF16 ничем не лучше, чем UTF8, но при этом жрет больше места.Так что или UTF8, или UTF32.
>>1495334>Ниет. Символов в юникоде внезапно большеДия. Внезапно, в реальной жизни более чем достаточно для всеязыковых программ. Нет дикого жора лишней памяти как в UTF32 и тем более нет пизданутого парсинга как в UTF-8, этот шлак вообще неюзабелен кроме экспорта на диск.Так что сосите писосы, дегенераты, но UTF16 как был идеально оптимальным для программного кода, так и остался.
>>1495335UTF16 это wchar_t, если кто не знает.>Formally speaking, no. The size of wchar_t is implementation-defined, and in fact most Linux compilers (such as GCC) define it to be 32-bit large, designed to hold text in UTF-32 encoding.>With MSVC compiler, wchar_t is 16-bit large, with the intention that it be used to represent Unicode strings in UTF-16 encoding.Линуксы как всегда обосрались, но кому они нужны. Всё равно на серверах дохуя рамы и срать на лишний жор 32 бит, или дохуя ядер и срать на оверхед парсинга UTF-8.
>>1495337>Всё равно на серверах дохуя рамы и срать на лишний жор 32 бит, или дохуя ядер и срать на оверхед парсинга UTF-8.В голосину
Аноны, прохожу квесты overthewire и возник вопрос по этому уровню:https://overthewire.org/wargames/narnia/narnia1.htmlСам уровень я уже прошел методом тыка, но возникло несколько моментов, которые я не понял.В уровне надо хакнуть программу через buffer overflow. Если переменная будет иметь определенное значение, то программа откроет bash пользователя следующего уровня, пароль которого храниться в открытом виде в файле, овнер у которого нужный пользователь.Вот код программы: https://pastebin.com/H75F5NeSЯ прогнал скомпилированный бинарник через objdump с флагом -d и вот что получил для функции main https://pastebin.com/EG3s7VpZА вот мои вопросы:1. Как я понял по куску 8048562: c7 45 f8 41 41 41 41 movl $0x41414141,-0x8(%ebp) стек растет в сторону уменьшения адресов(вниз?), инструкция movl записывает dword т.е. 32 бита, т.е. 4 байта, тогда почему от адреса начала стека отнимается 8, а не 4?2. В коде после val объявляется char[20] буффер, как мне казалось значения буфера будут так же распологаться на стеке как и в буффере т.е. первое, потом второе, потом 3 и т.д. т.е. те 4 дополнительных байта, которые может считать scanf лежали бы где то наверху стека, но они перезаписывают val. Или это связанно с тем, что в c имя массива это просто указатель на 0 элемент и можно получать доступ к другим элементам адресной арифметикой, а т.к. тут стек растет в сторону уменьшения адреса значения должны распологаться как бы "наоборот", т.е. после val на стеке будет последнее значение буффера?3. Чтобы правильно переписать значение val нужно писать байты как бы в обратном порядке т.е. чтобы в переменной получилось 0xdeadbeef нужно чтобы в конце буффера было 0xef, 0xbe, 0xad, 0xde, это как-то связанно с endianness?
>>14958161. Так и есть, стек растёт вниз. -0x8 потому что 4 байта уже заняты push %ebx2. Да, буфер заполняется от вершины стека, последнее значение будет после val3. Связано, в little-endian 0xdeadbeef побайтово записывается как 0xef 0xbe 0xad 0xde, от младших адресов к старшим
>>1495816>начала стека отнимается 8, а не 4?Передача параметров перед вызовом call 80483f0 <puts@plt>>на стеке как и в буффереLong хранится в обратном порядке, в таком его и нужно записывать в буфер char
Дебильный вопрос:Чтобы писать на питоне мне надо скачать питон с оффсайта, прописать его в PATH, чтобы командная строка подхватывала, и установить редактор кода с посветкой синтаксиса вроде Sublime.В принципе, можно уже начинать работать.А в C/C++ можно так сделать? Или надо обязательно тянуть эту майкрософтовскую IDE хуйню (Visual Studio) из интернета на 20+ гигабайт?Тут можно тупо скачать пакет основных библиотек, подцепить их к редактору и чтобы он мне компилировал мой код в exe файл?Или особенность компилируемого языка не позволяет так делать?
>>1495979Качаешь gcc или clang и прописываешь точно так же в path. Можешь заодно скачать make и cmake, иначе заебешься компилировать проект из >2 файлов.В линуксе кстати это проще делается, пишешь sudo apt install gcc && apt install make, ничего в path прописывать не надо, сразу идешь байтоебить.
>>1495979двачну господъ на Линуксе,ибо сам им являюсь.На работе же я FreeBSD юзаю.>Чтобы писать на питоне мне надо скачать питон с оффсайта, прописать его в PATH, чтобы командная строка подхватывала, и установить редактор кода с посветкой синтаксиса вроде Sublime.Ты как-то много лишних телодвижений делаешь,так не надо.Python имеет Idle, что дико удобно. Под виндой я писал в Notepad++ или если хотел "как дома" - поставил gedit и настроил его под питон.В линуксе Питон есть искаропки, как и gcc, make (FreeBSD clang)>А в C/C++ можно так сделать?Можно.Опять же вкусовщина. geany, codeblocks, dev-cpp, на вкус и цвет.>Или надо обязательно тянуть эту майкрософтовскую IDE хуйню (Visual Studio) из интернета на 20+ гигабайт?Можно и так, если есть лишних 20+ гигов и пара часов лишнего времени.но зачем? Алсо ставил на 7ку студию, вот это вот всё. И что? я написал хэлловорлд и блять эта винда нихуя не скомпилила!!! Хэлло Ворлд!!! Скачал QT, работает, но я под линуксом его не юзаю. А на винде не кодю. >Тут можно тупо скачать пакет основных библиотек, подцепить их к редактору и чтобы он мне компилировал мой код в exe файл?Умные люди сделали для тебя Code:: Blocks, Dev-Cpp. С MinGW на борту.А так дело твоё: можно набрать код хоть в нотепаде, откомпилить в консоли что на винде что на *никсе и радоваться жизни.>Или особенность компилируемого языка не позволяет так делать? особенность компилируемого языка состоит в том, что его надо компилировать. И всё. Прелюдии с кодом компилятор не заботят. Можно хоть в нотепад++ плагинов наставить, чтобы он компилил все, что ты накодил там. Только нотепаду надо будет указать, где лежит компилятор.
>>1495982>В линуксе кстати это проще делается, пишешь sudo apt install gcc && apt install make, ничего в path прописывать не надо, сразу идешь байтоебить. Сразу идешь читать доки по ключам компилятора, make и gdb
>>1496135Ну если тебя нужен make, то идешь. Если тебе нужен gdb, тоже идешь. А если тебе нужно отладить, то ты уже заранее установил qtcreator с интерактивной отладкой на кнопочку и там же пишешь код
Ну мля,помогите> Пацаны,покажите ебаманный динамический массив символов ,а то хуета какая то получается
>>1480534 (OP)>MISRAОн запрещает использовать адресную арифметику с указателями(инкремент и декремент указателя).Как тогда без этого обходиться?Например, при выводе нуль-детерминированной строки куда-нибудь или перемещении N переменных из одного места в другое.
>>1496725>Например, при выводе нуль-детерминированной строки куда-нибудь или перемещении N переменных из одного места в другое.Например, циклом for от 0 до максимального размера буфера.
>>1496745>>1496735Пользовательский размер и сам массив,цифры поменять на обратные,и все,но не могу понять ,почему не дает ввести строку
>>1496762Да, когда вводишь p, во входном потоке будет, допустим, 10\n. scanf заберёт 10, а \n останется. getchar его считает и break-нет цикл.
>>1496776Мне нужно чтобы считывало максимум 100 эл-ов,проверка на дурака есть,но у меня сомнения насчет максимума,если while (i< p-1)и p=101,то он проверит до 99 элемента,100 элемент станет /n,да?Если лимит в 101,то он будет с 0-99 будут элементы с символами,а последний 100- /n?
>>1496806 Окей,значит все правильно?Оверфлоу баффера не будет?Типа элемент какой нить закродется за массив и на "миллион и первый раз" прога не сработает и ебгнется RAM?
>>1496813Чувак,извини за беспокойство ,но еще помоги плез:При p>64 не работает ,не выводит последний элемент(ввел 77776 вывело 2222(то есть без последнего)https://pastebin.com/2P6Z7Dw9
>>1496852А,лол,тогда все опять решено,p++ вроде не ломает,я проверил если p==102(101 элемент ,с 101 /n) выкидывает,осталось сделать принудительный ввод подходящего числа,но это я сама вполне сделать могу(если есть свободная минутка можешь помочь ;3 )
>>1480534 (OP)Аноны, clion накрылся пиздой. Подскажите, что мне делать?/Applications/CLion.app/Contents/bin/cmake/mac/bin/cmake -DCMAKE_BUILD_TYPE=Debug -G "CodeBlocks - Unix Makefiles" /Users/admin/CLionProjects/Pr1-- The C compiler identification is unknown-- The CXX compiler identification is unknown-- Check for working C compiler: /usr/bin/cc-- Check for working C compiler: /usr/bin/cc -- brokenCMake Error at /Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.14/Modules/CMakeTestCCompiler.cmake:60 (message): The C compiler "/usr/bin/cc" is not able to compile a simple test program. It fails with the following output: Change Dir: /Users/admin/CLionProjects/Pr1/cmake-build-debug/CMakeFiles/CMakeTmp Run Build Command(s):/usr/bin/make cmTC_f59a5/fast xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun CMake will not be able to correctly generate this project.Call Stack (most recent call first): CMakeLists.txt:2 (project)-- Configuring incomplete, errors occurred!See also "/Users/admin/CLionProjects/Pr1/cmake-build-debug/CMakeFiles/CMakeOutput.log".See also "/Users/admin/CLionProjects/Pr1/cmake-build-debug/CMakeFiles/CMakeError.log".[Finished]
>>1494250>>1495293Извините что беспокою.Но.Где прописано что char* это const?? Разве это не декларация массива char[] просто через указатель?? Каков механизм? Я просмотрел спецификацию, но то ли я хуеглазый, то ли это какое-то соглашение. Опять же, каков механизм?Мне это важно, потому что я не догоняю какую-то фундаментальную мелочь и мне это мешает.
>>1496927char c1[] = "nosorog"; - это массив на стэке, не константныйconst char* c2 = "zhiraf"; - это read-only память в секции экзешника
>>1496927>Разве это не декларация массива char[] просто через указательДобавьте в шапку http://faqs.org.ru/progr/c_cpp/cfaqrus.htmА ты прочитай пункт 2 в этом факе
>>1496929>char c1[] = "nosorog"; - это массив на стэке, не константный>const char c2 = "zhiraf"; - это read-only память в секции экзешникаЭто я понял. Но каким образом char c1 = "lol"Становится const char* c1 = "lol"
>>1496931>Смотри: K&R I Разд.5.3 c.93-6; K&R II Разд.5.3 c. 99; H&S>Разд.5.4.1 c. 93; ANSI Разд.3.2.2.1, Разд.3.3.2.1,>Разд.3.3.6 .Что за H&S? Ничего не нашел.
>>1496931>прочитай пункт 2 в этом факеЧто за шизофазия там написана?- Имя массива не существует, он считает его макросом?>он генерирует код, позволяющий переместиться к месту под именем "a", перемещается на три символа вперед и затем читает требуемый символНичего не понял. Кто, куда и как перемещается? Веллосипедист из точки А в точку Б? Розовые слоники в страну чудес? На какие символы происходит "перемещение"? Генерится машинный код, в компьютере нет никаких символов!f(a)char a[];Господи, что это за код?f(a) char a[];У меня крыша поехала, что это значит?
>>1496927> то ли это какое-то соглашениеВот. char *x = "test" - это НЕ константный указатель, по которому нельзя писать, потому что ты присвоил ему строковый литерал. Под "нельзя" подразумевается UB, компилятор может тебе ничего не сказать, в рантайме запись может оказаться успешной (например, если под DOS соберешь), но на какой-нибудь другой платформе твой код упадет. Поэтому просто не пиши, и все будет хорошо.
>>1496990> в компьютере нет никаких символовВ контексте Си символы и байты равнозначны.> Кто, куда и как перемещается?Виртуальная позиция в памяти. Да, сформулировано плохо, но понять можно. Имеется в виду, что для char[] сразу считается офсет символа (возможно даже одной инструкцией), а для char∗ у тебя будет лишняя инструкция на чтение самого указателя. С другой стороны char x[] = "abc", если x автоматическая переменная (внутри функции) - это очень медленно (память копируется из литерала при входе в функцию), поэтому если модификация не нужна, а посимвольное/побайтовое чтение нужно, стоит писать static const char x[] = "abc".> У меня крыша поехала, что это значит? Это значит, что ты слишком молодой по сравнению с сишкой. Раньше (до С89) типы аргументов указывались не так:int foo(int a, float b, char ∗c) { ... }а вот так:int foo(a, b, c)int a;float b;char ∗c;{ ... }
>>1497103Прошу прощения аноны, я долбоеб, и как видно навсегда. После 2-х суток курения спецификации и FAQ-ов и всевозможного гугления, я досконально разобрался в вопросе. Сегодня увидел что именно этот блядь вопрос досконально объясняет Прата, буквально через пару страниц.С онлайн задачками покончено, пока не пройду всю книгу и не решу задачи оттуда.Спасибо большое всем.>>1496927-кун
>>1496931Ты хоть понимаешь какую просто дикую, сочную годноту принес?Мое понимание масштабов пиздеца прокачалось до небес.
ку двач, есть код цикла с созданием процесса, поясните тупому, что происходит, что первее создается, новый процесс или новый шаг цикла?
>>1497834Я разобрался, нет это не форк-бомба, ведь он не выходит из цикла и не увеличивает i перед созданием ноаого процесса
>>1480534 (OP)Как это реализовать? Пропустил одну пару и уже нихуя не ясно. Как с помощью main прочитать файл, тем более указывая его имя а не путь к нему
>>1498340Найти сайт с решениями простых задачек и сопоставлять решения, используя всю мощь своего IQ. Компилировать эти решения, менять рандомные вещи и смотреть что происходит. И так пока не придет понимание.
>>1498355Мне надо не решение как считать среднее арифметическое или кол-во чисел больших предыдущего, а то как сделать чтобы программа прочитала данные из файла. Есть file.txt и из него надо достать числа и сделать массив размера n где n это количество чисел в файле
Привет, аноны. Какой инструментарий посоветуете, чтоб писать под DOS? Захотелось накатать какую-нибудь простенькую игрушку, но графические библиотеки или сложные, или какое-то игрушечное говно, по сему остановился на этой единственной годной игровой платформе. Там, вроде как, все просто, пишешь себе в фрейм 320x200x8, в хуй не дуешь... Скачал, значит borland turbo c 2.01 - годная IDE говорят, но после vim не могу себя заставить в этом. Решил взять vim71x16, а от borland только компилятор юзать, но не тут то было. Пробую "tcc hello.c", а оно даже stdio.h не находит. Хуй знает, как под этим DOSBox кодить вообще.
>>1498800> после vimЯсно.> Какой инструментарий посоветуете, чтоб писать под DOS?Turbo C, Watcom C, Digital Mars C, Microsoft C четвертая Visual C++ в дос точно могла, пятая - не знаю - тысячи их.
>>1498800Открой в линуксе терминал на весь экран и представь, что это DOS. Ты даже vim сможешь пользоваться.
>>1498904Понимаю, что рофл, но текстовая консолечка тут ни при чем. Просто раз уж не разрабатывать ничего масштабного, то хоть учиться грамотно использовать ресурсы и обходиться без готовых велосипедов.
>>1498936Даже создание 2d игрушки должно быть чем-то интересным, когда есть ограничения по памяти и мощности. Не получится совсем уж гавнокодом все делать.
>>1498800Почитай game engine black book про doom и wolfenstein, там подробно описано как в те временя игори писали ты так не сможешьЕще есть computer graphics black book by Michael Abrash, классика своего времени, доступна бесплатно.
>>1497109>В контексте Си символы и байты равнозначны.Не думаю. Строки бывают мультибайтовые или юникодные. Байту эквивалентен только тип char, но это конкретный тип с именно таким названием, а никакой не абстрактный "символ".>Виртуальная позиция в памяти.Что это? Процессор работает либо с числами напрямую, либо с указателями. Что за маня-"позиция" такая? Не понимаю. Я знаю позицию-указатель на выполняемую инструкцию в специальном регистре процессора. Вот это можно назвать абстрактный словом "позиция", не вдаваясь в детали, ведь оно само работает на уровне процессора и программиста не касается, но с массивами не такой случай.А что я понимаю, так это то, что массив не является "переменной-указателем языка Си", но это вовсе не значит отсутствие указателя, строки без указателей не работают. Там нарисована схема бинарного представления массива и указателя на литерал, и в массиве отсутствует указатель. Как тогда это работает? Магия?>Это значит, что ты слишком молодой по сравнению с сишкой.Спасибо, но такого написания даже во времена DOS не было. Слишком молодой, лол.
Ку, не понимаю че происходит с открытым файлом если мы форкаем процесс. Новый процесс получает копию открытого файла или файл закрывается для одного процесса, и открывается для нового?
>>1499322Ну если сишка-хуишка, я бы смотрел в сторону первой соньки. NES это все-таки больше про 6502 ассемблер
>>1499338Упитанно. Язык Си как таковой - бесполезная хуйня. Там везде главное - железо, нужно разбираться в апи конкретной системы. А учитывая что в треде даже винапи никто осилить не может (все пукают в консольку), какие там несы/плейстэйшены, окстись.
Анон помоги пожалуйста.Собственно вопрос: почему??? ни на этапе компиляции ни на выполнении нет ошибки?Везде const же!
>>1499115> и в массиве отсутствует указательЗачем ему там быть?> Виртуальная позиция в памяти. Что это?Чтобы прочитать символ, процессору нужно выставить на адресную шину адрес. Этот адрес нужно вычислить. Под позицией/перемещениями в том FAQ понимается текущее вычисляемое значение адреса (не обязательно в конкретной переменной или регистре). Да, объяснение не лучшее, и если ты знаешь что такое адрес, то думай об адресах. А что касается того ответа в целом, то смотри:> генерирует код, позволяющий переместиться к месту под именем "a"; Где-то в секции данных у тебя есть: a db 'xyzw', 0mov eax,offset a > перемещается на три символа впередadd eax,3> и затем читает требуемый символmov al,[eax]При чтении символа по указателю тебе понадобится дополнительный шаг:; Где-то в секции данных у тебя есть: a db 'xyzw', 0; Где-то в секции данных у тебя есть: strptr dd amov eax,offset strptrmov eax,[eax]add eax,3mov al,[eax]Естественно, все это оптимизируется нахуй, но указатель читать все равно придется: mov al,[a+3] vs. mov eax,[strptr], mov al,[eax+3].> но такого написания даже во времена DOS не былоДа, оно уже тогда устарело. Тем не менее, оно было. Открой K&R, например - не знаю, как насчет второго издания, но в первом точно было. Алсо, пикрелейтед - код MS-DOS 6 (команда expand), там почти все вычистили к шестой версии, но если покопаться, можно пару десятков мест найти.
Нужно определить константы разными для разных ос, правильно делаю? А то компилятор подсвечивает 4 строчку темным#if defined(_WIN32) || defined (_WIN64)#define ...#elif defined(__linux__) || defined(__APPLE__)#define ...#endif
Я тут слышал, что у нормальных людей все должно компилиться с -Werror, в связи с чем озадачен, как адекватно сделать пикрил хуету (4-й аргумент pthread_create). Ну не маллокать же 4 сраных байта, в конце концов! qsort_r туда же, хоть на лицо ссыте, а я не откажу себе в удовольствии сортировать равнодлинные подпоследовательности без нуль-терминаторов таким макаром:qsort_r(base, nmemb, size, memcmp, size);Ладно, допустим тут достанет каста, size_t и указатель обычно соразмерны long, но все таки блджад...
>>1499485> size_t и указатель обычно соразмерны longА вот в винде - нет.> маллокать По-хорошему - да. Заодно положишь туда же sockaddr, все равно пригодится рано или поздно. А заодно и еще какие-нибудь данные, которые process() стал бы выделять сам.
>>1480534 (OP)> Zed A. Shaw "Learn C the Hard Way" (2015): годное пособие для гуманитариев!А как понять достаточно ли я гуманитарен, чтобы читать это? С программированием знаком был поверхностно с С++ в 9 классе, тогда форк лазаруса от борланда у нас на компах ставили и мы в них всякие программки писали. Немного умею в линукс. Люблю математику и физику, за всю школьную жизнь 11 классов, сейчас в 12-ом ни одной тройки.Достаточно ли этого, чтобы я мог называть себя технарём?
>>1499653> А как понять достаточно ли я гуманитарен, чтобы мне нужно было читать это вместо первых двух книг?Фикс
>>1499541Здравая мысль, однако. Но что делать в случае с тем же qsort_r? Этот void ∗ так и просится третьим аргументом memcmp. Вот ни разу не прикольно писать какие-то обертки, чтоб не выходить за рамки предназначения типов. Там же void ∗ крайним параметром задекларировали для максимальной универсальности, но никак не для того, чтоб я пил кофе из графина. Интересно узнать, насколько дурной тон подобные шорткаты? Сильно обоссывают за такое?
>>1499541Алсо, насколько я понимаю, с float/double подобные не прокатит, потому что вызывающий код сложит в RCX/RDX/R8/R9 ничего не подозревающий обработчик будет искать в XMM0/1/2/3. СУКАНАХУЙБЛЯДЬ
>>1499462Благодарю от души, теперь всё понятно. Если бы еще та писанина была написана подобным образом.Потупил глядя на код, а потом решил проверить и точно, просто массив и адрес массива (в коде offset a) это одно и то же. Ну и дыркозатыкатели, млин.
Почему до сих пор никто не додумался добавить материалы по предметным областям в треды?Заодно исчезнет куча вопросов типа "Что же мне запилить на ЭТОМ язык программирования" и "Почему мне запилить ЭТО именно на ЭТОМ языке"?В СИ это как минимум микроконтроллеры и прыщи.
Тут речь идет о настоящих файлах, которые можно прям на флешку записать, например, или это какая-то фикция?
>>1500332Нет, это файловые дескрипторы (неужели никогда не слышал, что в *nix все есть файл?), по умолчанию они связаны с терминалом. При желании ты можешь заставить шелл использовать вместо терминала реальные файлы, примерно так: myprogram < stdin.txt > stdout.txt 2> stderr.txt
>>1500332Про linux не знаю, в шинде это хэндлы файловых объектов в ядре, эти объекты ссылаются на объекты устройств, с объектами устройств связаны драйверы. Когда прога читает/пишет драйверы получают соответствующие запросы. Что конкретно они с этими запросами делают зависит от конкретного места записи/чтения.Если это консоль, драйвер консоли перенаправит запрос соответствующему процессу консоли и вернет ответ. Если это реальный файл, запрос пройдет по всему стеку драйверов от файловой системы до диска. Ну короче ты понял.
>>1500332Книжку писал юниксоид, там всё - файлы. В винде так не принято, да и тут написано же "стандартные потоки ввода/вывода" консоли.На самом деле это устаревшая ерунда, ведь если программа с WinMain никаких консолей не создается. Если надо, можно создать консоль вручную или прицепить чужую.
>>1500404В винде хэндлы принципиально ничем не отличаются. GetStdHandle(STD_OUTPUT_HANDLE) - точно такой же "файл", в который можно писать с помощью WriteFile.> это устаревшая ерундаВиндой мир не ограничивается.