Тред, посвященный прародителю всех С-подобных языков и по совместительству единственному идеальному и всесторонне годному средству программирования как на системном, так и на прикладном уровне.
- Очевидный GCC. - clang: оче годно, батя рекомендует. - Intel C++ Compiler: оптимизации, тысячи их. - Visual Studio 2017 Community Edition: внезапно этим стало можно пользоваться, особенно с тулсетом clang/C2. Поддержка C11 на уровне "есть все, что тебе понадобится в реальном проекте плюс кривая библиотека". Анализатор кода в комплекте. - Pelles C (шиндоуз онли): поучиться, вкатиться в C11 (стандарт полностью реализован, имеются в том числе threads.h и прочие stdatomic.h), но количество багов в оптимизаторе и редкие апдейты напрочь отбивают желание собирать этим что-то сколько-нибудь серьезное. - TCC: очень маленький компилятор с багами и поддержкой C99. С ключом -run умеет компилировать код в память и запускать его, что позволяет писать скрипты прямо на сишечке.
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)
- https://godbolt.org/ - Compiler Explorer позволяет посмотреть выхлоп компиляторов для введенного куска кода (больше полусотни разных версий компиляторов). - http://cdecl.org/ - С Gibberish ↔ English помогает читать сложные сишные декларации.
Почему в Си не завезут операторы для ROL и ROR? SHL и SHR есть (<<, >>). Что мешает сделать ><<, >><? Си ведь призван избавить от необходимости ASM в большинстве низкоуровневых задач, а значит в новых стандартах должно отражаться развитие архитектур.
>>1480809 Достаточно редко используется, отлично распознается компиляторами. Смотри: https://godbolt.org/z/SnIAwS Для тех, кому хочется гарантий, есть интринсики.
>>1480866 Стандартом Си не зарезервировано, но зато зарезервировано стандартом POSIX.
>>1480935 CMake оставляет за собой кучу говналогов, посмотри в них конкретное сообщение об ошибке.
>>1480091 >Охуенно ты придумал. Вот у тебя скомпилированы .o, использующие одну библиотеку. Функции же библиотеки не находятся в отдельном .o, а продублированы в каждом из твоих .o. И откуда линкеру-то, блядь, знать, что они идентичны, и какие копии можно выбросить? Но такая библотека у меня работатет и компилятор даже не ругается. А тела inline-функций можно разместить только в .h файле.
Языки придуманы для того чтобы человек смог их прочитать, а не для мастурбирования на количество букав. Считайте по количеству операций что-ли, а не такую фигню мутите. Если уж хотите минимализм, то ебоште сразу машинными кодами.
>>1481525 >какой спортивный интерес так минимизировать код? Любой код надо минимизировать и делать, как можно проще и понятнее. Есть же такой принцип KISS(Keep it simple, stupid). Это только индусские макаки наоборот писали тонны нечитаемого говнокода, потому что им платили за количество строк. Что касается твоего примера - там просто нет табуляции и его нельзя прочитать.
>>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 >ПОЧЕМУ ОБ ЭТОМ НЕ СКАЗАЛИ НИ В КЕРНИГАН РИЧИ НИ ДАЖЕ В СПРАВОЧНИКЕ ШИЛДТА!!?? синтетическая инфа, необходимость которой возникает от непоследовательного изложения основного материала
>>1481933 Зря ты так. Кто не прочел про IOCCC в комментарии и рассматривает код, как промышленный, тот уже безнадежный долбоеб без всяких объяснений, а сейчас еще налетят долбоебы претерминальной стадии и будут рассказывать тебе, какая бессмысленная хуета все эти контесты, а какие вы вообще все несерьезные в сравнении с мамкиными Стивенами Сигалами, 24/7 думающими о сиюминутной пользе занятия.
>>1482200 Называется олимпиадство. Проблема в том, что ум это далеко не всегда что-то хорошее, т.к. он позволяет человеку чувствовать превосходство над другими. В результате многих интересует в основном эта сторона, реализуемая решением задачек. Такому человеку нужен челлендж, безотносительно пользы. Зависимость скорее даже наоборот, чем полезнее софт, тем более там банальной работы, суть рутины, не дающей никакого челленджа, ну как таскать кирпичи для строительства дома, но это совершенно необходимо. А умные не хотят, это чсв не греет, им скучно, унизительно, нужно выебываться крутыми решениями неординарных задач. Однако такое поведение это не порождает полезного, даже часто как таковых программ не производит, потому что есть огромная разница, скажем, изобрести двигатель внутреннего сгорания или сконструировать реальный качественный, удобный людям автомобиль.
>>1482223 >изобрести двигатель внутреннего сгорания или сконструировать реальный качественный, удобный людям автомобиль Надеюсь не к изобретению ДВС ты относишь олимпиадную матанопетушню?
>>1482242 >матанопетушню Да пошел ты нахуй. Эти, как ты считаешь, бесполезные выебоны - жизненная необходимость для умного человека. Даже если несовершенное потреблядское общество перепроизводства килотонн хуеты тысячу раз обесценивает эти скиллы. Талантливому человеку отнюдь не легко довольствоваться примитивщиной, не впадая при этом в депрессию. Эгоист ты, макака.
>>1482242 Просто к изобретению. Изобретение это придумывание чего не было, вот и решение задач это получение решения, которого (у тебя) не было. Но решение задач это не программирование, ведь программ не дает. Получается через жопу: когда задача решена, нужно начинать делать программу, а пациент наоборот теряет интерес и уходит в другие задачи, где процесс повторяется. И даже если программа есть, такие не фиксят элементарные баги и неудобства, однако доставляющие пользователям много боли, которые могли бы быть исправлены за пять минут одной строчкой - как раз потому что слишком просто, вот и висит говно буквально годами, ёжики колются, а разрабу поебать, он сидит над умными проблемами.
Как-то раз видел вообще прикол, картина маслом: разработчик очень известной тулзы внедрил новую крутую фичу и релизнул "смотрите как теперь можно, воу!", но никакой документации как пользоваться не дал, а вопросы игнорировал. Так никто ни разу этим не воспользовался, тупо все проигнорировали. Нафига спрашивается делал? А потому что интеллектуальная маструбация, по определению служит лишь самоудовлетворению.
Однако забавно, но т.к. причина в чсв, а значит в отношениях с другими людьми, получается на них влиять. Сам я тупая макака, делаю простые вспомогательные вещи, но ради удобства. Сделал - люди пользуются, а потом эти умники разрабы у себя делают аналогично. Что-то вроде ревности наверное, лол.
>>1482275 Непонятно к чему ты упоминаешь производство, а значит работу. На работе работники подневольны, делаю что велено. При чём тут эгоизм или "довольствоваться чем-то"? Эти вещи как раз зависят от тебя, чего на работе нет.
>>1482306 >Непонятно к чему ты упоминаешь производство, а значит работу. На работе работники подневольны, делаю что велено. При чём тут эгоизм или "довольствоваться чем-то"? Эти вещи как раз зависят от тебя, чего на работе нет. Я к тому, что реальная жизнь (работа) уныла по определению. А оратор выше назвал занятие уничжительным термином лишь за то, что оно невостребовано в этой реальной жизни. Эгоизм же в том, что люди заурядные способны оставаться психически здоровыми, довольствуясь потреблядскими ништяками за непосредственную работу, а люди талантливые лишены такого похуистичного спокойствия ума, и нельзя их за это считать шизиками и создавать насмешливую репутацию вокруг олимпиадной движухи вцелом. "Мне не надо, значит вообще не надо" - натуральный эгоизм. Олимпиадная движуха - смертельно необходимая вещь хотя бы потому, что удовлетворяет потребности интеллектуальной элиты, которая двигает прогресс в самом качественном плане.
Алсо, есть подозрение, что эти непризнанные гении, которые впутывают коммерческую деятельность в свои нетривиальные выебоны в ущерб скучным нюансам качества для конечного юзера, это как раз недоделанные олимпиадники, которые не могут в реальный топ какого-нибудь codeforces. Реальное олимпиадное программирование, как раз таки, отнюдь не тешит их ЧСВ. Норм же посоны олимпиадят по хардкору, а в жизни не выебываются.
>>1482316 >Олимпиадная движуха - смертельно необходимая вещь хотя бы потому, что удовлетворяет потребности интеллектуальной элиты, которая двигает прогресс в самом качественном плане. Нет, олимпиады это как раз говно. Если хочется чего-то возвышенного, лучше изучать алгебраическую геометрию, теорию категорий и схемы. Но олимпиадники часто те еще потребляди, и красоту математики пытаются обесценить и свести к надоям чугуна. Олимпиадники это та же продакшен чернь, только сбоку.
В алгебраической геометрии как раз ценится идеальность мысли, красота доказательства. Многие доказательства в ней были переформулированы и передоказаны как раз ради красоты и совершенства и оказались настолько восхитительными, что сам Аллах записывает их в свою небесную книгу. Но олимпиадным червям все это невдомек. Они месят говно и думают, что занимаются чем-то возвышенным.
>>1481726 >Представил, что вместо отдельного .h его содержимое продублировано в шапке каждого .c, и сразу все ясно. Но в .h файлах ставятся guardы и прочитаться содержимое, заключенное в эти guardы может только один раз. Поэтому я долгое время и не мог понять, почему это multiple definition, guardы ведь стоят и по идее множественного присваивания быть не должно.
>>1482396 gcc -c yoba1.c yoba2.c то же самое, что gcc -c yoba1.c gcc -c yoba2.c При чем тут #ifndef YOBA_H #define YOBA_H ... #endif ??? Это надо, чтоб в отдельно взятом компилируемом модуле ничего не повторялось. Те же определения структур и т.д., словом, все, что определяет поведение компилятора. Переопределения же инициализированных данных и функций во всем проекте при попытке сборки воедино результатов компиляции - это уже линкер в ахуе. Грубо говоря, работа компилятора - заготовить маш.код процедур, со всеми обращениями к полям структур по соответствующим оффсетам и прочей хуетой, а работа линкера - превратить все символы в адреса.
>>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 Для текста есть специальные функции записи/чтения, где не нужно беспокоиться о нулях и прочих управляющих символах. Если же залез в бинарные данные, там пишется и читается всё буквально, каждый байт как нужно тебе и разбираться тебе.
>>1482423 Да, всё так. Попробовал сейчас перекрестно подключить 2 хедера(в хедере 1 инклюдил хедер 2, а в хедере 2 - хедер 1) - выдало кучу ошибок redeclaration. Вот же я жопочтец.
>>1482786 Я про то, что они не бывают в стеке. extern - это вообще не определение register - лишено смысла, это лишь пожелание, которое никто выполнять не будет в таком случае, т.к. каждая процедура компилится независимо и имеет право юзать проц, как хочет. Главное потом на место все вернуть в регистрах, предусмотренных конвенцией.
Я из мира языков с исключениями, поэтому на всякий случай спрошу:
Действительно ли нужно проверять успешность каждой функции? Просто если внимательно обрабатывать каждую непонятную ситуацию, весь код обрастает ифами практически после каждой строки. Пример кода без обработки ошибок: создаем "персону", делаем над ней что-то и уничтожаем ее:
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 Погугли лекции Хирьянова Т. Ф., По информатике и математике у него одни из самых охуенный лекций что я посещал. Правда хз сколько записей есть.
Что за древнее ссаньё мамонта в шапке? Вся эта залупа собриается через раз с ошибками. Когда ты только вникаешь во всю хуйню это пиздецки мешает, хуй знает как правильно, нихуя не понятно. Свежие бы книжульку в рот ебать.
>>1484487 Не ебу ваши местные мемы. Какого хуя на форумах советуют древнее говно, я заёбся уже. Не спорю, хуй сосать на ровном месте может быть полезно, но блядь я же ещё учусь.
>>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.
>>1485728 Ну я же тебе написал, у тебя p == NULL. Ты делаешь strcpy(NULL, line), дллка никакой магии не делает, там внутри будет что-нибудь типа while(∗p++ = ∗line++); только оптимальнее, оно пишет по NULL, проц/ядро генерируют исключение, студия его перехватывает и показывает.
Итого, сишечка как таковая в чистом виде не нужна. Зачем нужен язык без исключений, если ядро использует исклюсения? Наверное только на малинках и прочих микроволновках без ядра и исключений.
>>1485828 >>1485829 На малинках линукс, на ардуинах плюсы. Ты наверное имел ввиду embedded в целом. >Зачем нужен язык без исключений А зачем нужны исключения? С это кроссплатформенный ассемблер. То, что его использовали как источник вдохновения для большинства популярных императивных и ООП языков, является большим недоразумением. Отсюда представления, что Си -- какой-то хуевый язык, в нем нет исключений, ООП, метапрограммирования, лямбд, функторов и монад, что за хуйня. В то время как проблемы не у Си, проблемы у всех остальных императивных языков, начиная с C++, и проблемы очень большие.
>>1485828 > Зачем нужен язык без исключений А есть с исключениями? Может быть, кресты могут отловить виндовые исключения? Это решается системными средствами: сигналами в *nix, или всякими SetVectoredExceptionHandler в винде, и это не зависит от языка.
>>1485835 А да, ты прав, я с access denied перепутал, сцуко опять. ОС также сама может генерировать исключения. Access violation page fault - железячное прерывание, а Access denied - софтверное. У C++ тот же SEH внутри насколько я помню.
>>1485832 Окей, вот только не надо максимализма. Я же не зря написал "в чистом виде". ООП не нужен, но классы нужны, без них плохо. Лямбды это лишь встроенный код, как код может быть не нужен? Функторы это указатели на функции, они и так есть и нужны естественно.
И какие такие у С++ проблемы, если это та же сишечка, только дополненная? Если для тебя наличие кучи возможностей, которыми можно спокойно не пользоваться или пользоваться по желанию, это плохо, то советую в дурку проследовать. Наличие не может быть плохо в принципе, если оно не навязано, а кресты ничего не навязывают, это не жаба с решетками и прочими хаскелями.
>>1485835 Не в этом дело. Если даже процессоры и ядра на низком уровне используют исключения, значит исключения это хорошо, это действительно удобно, а в языке для приложений и подавно. Не иметь их неудобно, это инвалидность, поэтому чистая сишка это убогий ненужный язык. В С++ я могу писать как на Си, но кидать исключения, это очень удобно, а еще использовать классы, например для СОМ или GUI библиотекэ, то очень удобно.
>>1485843 > У C++ тот же SEH внутри насколько я помню. Да, но оно не умеет ловить другие виндовые исключения, оно работает только со своим собственным (0xe0чтототам), поверх которого реализует все свои raise.
Пишем на работе драйвер на С++, никакой стандартной библиотеки само собой, но, тупо уже шаблоны и RAII\Деструкторы настолько упрощают разработку, что я тоже искренне не понимаю, зачем вообще писать на С в 2019
>>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 Толстота, нет? Сейчас куча фазеров и прочей лабуды на автомате находит баги, остаются только уж совсем сложные UB, которые невозможно воспроизвести или заметить одним лишь чтением исходников.
>>1486205 Тогда бы issues на гитхабе были пусты, а они полны. Берешь один такой баг, воспроизводишь, фиксишь. В опенсорсе дохуя багов, которые живут не потому что они сложны, а потому что некому фиксить. Если совсем лениво, можешь спросить у мейнтейнера какую фичу запилить. Но это сложнее
>>1486238 Я дожил до века мультигигабайтных плашек ОЗУ не затем, чтоб юзать только 24 бита адресного пространства. Ну а так да, крестовекторы не нужны, когда есть охуительные макросы.
>>1486623 Я про архитектуру, а не ОС. О какой крестовой STL может идти речь под всякие STM32? А Сишный код с няшными макросами аккуратно перенес, и все ок. Согласен, хуйню несу...
>>1486628 На самом деле на крестах очень интересно с memory-mapped портами работать, в том числе и с bit-bands в STM32: красиво, удобно, безопасно. Но цена этого - несколько абсолютно нечитаемых файлов с шаблонами, в которых хуй разберешься, когда/если что-то пойдет не так. Так что мы уж лучше как-нибудь по-старинке, на сишке с дефайнами.
Сап, /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. Даже если ты мигаешь диодом. Вообще ноль смысла.
>>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]); // Работает в >C99 int foo
4) Если ты, мамкин оптимизатор, захотел юзануть 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 > Он тоже 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 для записи в файлы или обмена по сети.
>>1488366 Зависит от ситуации. Если ты просто выделял память под маленький объект, а она кончилась, то все, приехали. Если ты хотел выделить 8гб памяти под какой-нибудь йоба кэш, то можно сказать "ну ок, попробую обойтись четырьмя"
>>1487685 >указал на тупость и лицемение конкретного автора поста >ЮНИКСВЕЙ ХЕЙТЯТ! РЯЯ!! Классика маргинальныех ничтожеств - обобщать и прятаться за чужими спинами общих понятий, тем самым уводя разговор от конкретного мерзкого лицемерного чмошника. И неудивительно, ведь ничтожество поэтому и ничтожество, что нуль, не существует как личность, отсутствие которой заменяется причастностью к чему-то общему.
>>1488459 Рот ебал этого GAS! Там синтаксис под древний парсер, который давился, если составляющие инструкции даны не в той последовательности, в которой их в маш.код складывать. Кровь из глаз, сука. Зато выглядит так коркорно, тип технарь дохуя, короче заебись тема, отвечаю.
>>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 >инфа о типе Катись обратно в свою скриптопарашу. Здесь этого кала нет. >А что происходит, если несколько разных тайпов имеют один и тот же размер? Ничего, такая программа не компилируется, а значит не существует. Получится только текстовый файлик с твоими тупыми писульками, никому не нужный как и ты сам.
>>1488715 0x привычнее для сишников, но ты, как истинный демагог, мешаешь все в кучу, $ тут ни к чему. Насчет справа налево господин выше уже ответил. Алсо, операнда назначения ближе к мнемонике органично продолжает случаи, где является несменной частью инструкции, как та же DIV/IDIV, которая всегда оставляет целую часть в RAX, а остаток - в RDX. Ну, и про вертикальную читаемость выше писал.
>>1488969 GAS умеет в интеловский синтаксис? Ебать я танкист, оказывается можно без NASM обойтись. И ведь задним числом очевидно же, что раз gdb и gcc поддерживают...
>>1489092 Ты че, совсем еблан? В каком месте, ХОТЬ РАЗ БЛЯДЬ СУКА ПОКАЗАЛ ПАЛЬЦЕМ А ТО МАТЬ ВЫЕБУ, кто-то писал, что не осилил? Это тот случай, когда легко в учении, тяжело в бою. Выучить AT&T можно за вечер, но к постоянной работе в жизни не привыкнешь - всегда будешь больше страдать физически. Этот синтаксис родился не от хорошей жизни, а от ограниченности тогдашних ассемблеров, не умевших в стек, чтоб читать предварительные указания с конца. Человеческое зрение, в отличие от однопроходного транслятора, склонно упускать детали по первом проходе и любит, когда уточнения выведены дальше, когда пространство слева и справа равномерно используется. И, конечно же, глаз только спотыкается об закорючки, в которых нет нужды, ведь для этого существует целая живая нейросеть, которая прекрасно распознает на лету, как выглядит константа, а как имя регистра, блджад. Как только появилась возможность, сразу реализовали такой человекочитаемый синтаксис. Я тоже любитель всей этой первичной романтики, но искать плюсы в том, что хуево по определению, попахивает шизой.
>>1489087 >операнда назначения Просто потому, что у тебя слово "операнд" женского рода, ты тупой хуесос, и читать твои высеры бессмысленно. Подучи русский язык, потом приходи.
Анон, привет, прошу накидать годных видео по Си на ютубе. Я не могу найти ничего интересного кроме туториалов для новичков(которые мне уже не нужны) и несмотрибельных индусских видео.
Вообще все интересное по темя языка сгодится, в том числе и в текстовом формате. Любая годнота вроде статей/блогов, форумов Особенно реквестирую видео про написание каких-нибудь интересных проектов типа написания шелла или системных утилит, псевдоооп в Си, а также туториалов для "продвинутых нубов", где разжевываются всякие интересные штуки, типа Flexible Array Member. (А по Си вообще проводятся конференции, как в других языках типа CppCon?) Можно скинуть мне напрямую в телегу @littlerichard
Просто нравится Си, заебись язык (по ANSI C угораю). Хочу писать реально крутой идиоматический код, эффективно работать с гдб из под командной строки, научиться тесты писать.
Но, к сожалению, не могу себя заставить читать гигантские талмуды на 300 страниц на английском, концентрации не хватает. Мой идеал - небольшая статья, где теории поровну с практикой. Или книга /брошюра на 40-50 страниц простым языком. Сколько раз пытался читать книги, всё равно итоге хуй забивал. Целую библиотеку мощных книг собрал, толку ноль. Поэтому, раз я не могу потреблять контент через книги, то ищу что-то более легкоё для восприятия. Ничего плохого в этом не вижу и думаю, что я не один такой.
Вообще, хочется дойти до того уровня, чтобы устроится "джуном" куда-нибудь в системную разработку или embedded через ещё полгода дрочки Сишечки, но хз, нужны ли кому-нибудь такие джуны и набирают ли не студентов техвузов на такие места.
>>1489819 Да я... Да я... Я "Войну и Мир" читаю, вообще-то, так что не надо! А с операндами не ебу, как там правильно, пушто, как уважающий себя элитарий, технолитературу читаю на инглише! Ну скажите ему, затролльте его, ну пазязя!
>>1489849 Так он написал, что можно в телегу, я так понял, если отвечающий сам не захочет мусорить в треде контентом зумеро-ориентированного формата, но в то же время сам шарит в подобном контенте, лол. >>1489825 Анон, сам себе могилу роешь. Тебе все равно рано или поздно придется много читать скучные тексты без экшона. Вот прям неизбежно и дохуя, или ставь крест на карьере Сишника. Чем раньше превозмогёшь эту слабость, тем дешевле потом выйдет.
>>1489914 > не захочет мусорить в треде контентом зумеро-ориентированного формата У нас в треде вообще контента нет. Последние два треда - исключительно срачи.
>>1489825 >Но, к сожалению, не могу себя заставить читать гигантские талмуды на 300 страниц на английском, концентрации не хватает. Так нахуй из профессии, маня.
>>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, и т. д, с ростом экспоненты числа становятся все менее точными.
>>1490520 Когда работаешь с флоатами, пиши 2e20f вместо 2e20, или не удивляйся.
Потому что a = 2e20 это на самом деле a = (float)2e20; При конверсии double во float у тебя теряется точность, а именно 2e20=200000000000000000000.0000 2e20f=200000004008175468544.0000
Далее при вычислении a-2e20, ты из 2e20f вычитаешь 2e20, то есть 200000004008175468544.0000 - 200000000000000000000.0000.
Само вычисление считается в double, и только после вычисление результат конвертируется во float.
Пиздец как же меня бесит этот ебучий тред. С удовольствием разъебал бы ебасосы половине пишущих сюда. Фу ебучие студентишки и вкатывальшики, срущие своим ебанутым недомнением. Сдохните
>>1491281 >зачем предлагать читать k&r Лучше книги нет >если она устарела Си тоже устарел >кто нибудь выполнял там задания?(вам не кажется что они не для новичков?) Они не для тупых, но ничего того, что бы не знал новичок, там нет
>>1491839 после k&r вышло много изменений, вышло несколько стандартов, в которых писать некоторые вещи стоит по-другому. Ок задания не для тупых. Кто их выполнил все? есть тут в треде герой?
>>1491839 > Си тоже устарел Он не может устареть. Или кучу кода вдруг перепишут на rust? Нет, конечно. Ядро Linux как писали на C/C++, так и будут писать. А оно используется везде: от листрибутивов Linux до android смартфонов.
>>1491860 > фортран В науке используется до сих пор. Да, скорее из-за легаси. > А за сочетание C/C++ вообще нужно пиздить обломком трубы. А на чём писать? Неужели всё-таки на Rust?
Нужно написать свой принтф, переменное число параметров я уже понял откуда и как Основная суть какая? Парсить первый аргумент-строку, пока не встречу какой-то флаг %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.
Полгода разбитой самооценки и попыток разлюбить дело о котором думал на протяжении нескольких лет и к которому собирсялся серьезно готовиться.
И все из-за того, что невнимательно прочел мануал.
Мне не место в программировании, ибо я тупой мудак.
Я тот парень сверху с символами/цифрами,кароч,мне училка затирала ,что увеличение массива на единчку для цикла(17,30 строка),как то хуево меняет массив
Сама суть,изменить каждый символ-цифру на 9- символ-цифра
Вообщем,если не сложно поясните,что не так с прогой
Антоны, почему приведенный код дает такой странный вывод? По идее, функция должна изменить указатель на тот, который указывает на массив в ней созданный, но этого не происходит. Почему?
>>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).
>>1493768 Нет. >>1493786 >попробуй найти работу на пьюр си НИИ И И >>1493778 >Такой себе индекс для суждения о популярности. Он, кажется, ориентируется по гуглежу этого языка, поэтому популярный в иностранных ВУЗах VB.NET такой крутой. Так что рейтинг сосет. Хотя если посмотреть сколько написано в данный момент на си, то он действительно будет в топах, только вопрос в том, что он нового не пишут и работы чистой не найдешь сука.
Никак не могу понять, что за чистый си про который тут все говорят? Это те самые 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"...).
>>1494220 Компилятор допускает, потому что легаси. Сначала было просто соглашение, что в "" писать нельзя. Если бы сделали строки константными указателями после того, как в языке появился const, сломался бы весь существующий на тот момент код, который ожидал и передавал обычные char *. Поэтому строки как бы const, но без const.
>>1494220 Запись по const указателю ловится во время компиляции, а запись в read-only память - во время выполнения. Первое нужно для себя, чтоб не забыться и не сломать логику. А константность "" заключается в самом способе реализации - использование readonly памяти, как и для исполняемого кода. Как анон выше написал, "" не являются const char ∗ в системе типов, потому что многие старые функции, часто используемые с "" в качестве аргументов, объявлены как func(char ∗, ...); и компилятор просто кидал бы error.
>>1494807 Спасибо, анон! И главное, ведь, читал про 2 байта у utf-8, выше в этой же книге и вот теперь до меня дошло! Мог либо перекомпилить, чтобы длиннее строка была или юзать wchar_t word[10];
>>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.
>>1495334 >Ниет. Символов в юникоде внезапно больше Дия. Внезапно, в реальной жизни более чем достаточно для всеязыковых программ. Нет дикого жора лишней памяти как в UTF32 и тем более нет пизданутого парсинга как в UTF-8, этот шлак вообще неюзабелен кроме экспорта на диск. Так что сосите писосы, дегенераты, но UTF16 как был идеально оптимальным для программного кода, так и остался.
>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.
Сам уровень я уже прошел методом тыка, но возникло несколько моментов, которые я не понял. В уровне надо хакнуть программу через 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?
>>1495816 1. Так и есть, стек растёт вниз. -0x8 потому что 4 байта уже заняты push %ebx 2. Да, буфер заполняется от вершины стека, последнее значение будет после val 3. Связано, в 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 до максимального размера буфера.
>>1496776 Мне нужно чтобы считывало максимум 100 эл-ов,проверка на дурака есть,но у меня сомнения насчет максимума,если while (i< p-1)и p=101,то он проверит до 99 элемента,100 элемент станет /n,да?
Если лимит в 101,то он будет с 0-99 будут элементы с символами,а последний 100- /n?
>>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 -- broken CMake Error at /Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.14/Modules/CMakeTestCCompiler.cmake:60 (message): The C compiler
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".
>>1494250 >>1495293 Извините что беспокою. Но. Где прописано что char* это const?? Разве это не декларация массива char[] просто через указатель?? Каков механизм? Я просмотрел спецификацию, но то ли я хуеглазый, то ли это какое-то соглашение. Опять же, каков механизм? Мне это важно, потому что я не догоняю какую-то фундаментальную мелочь и мне это мешает.
>>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-кун
>>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 кодить вообще.
> Какой инструментарий посоветуете, чтоб писать под DOS? Turbo C, Watcom C, Digital Mars C, Microsoft C четвертая Visual C++ в дос точно могла, пятая - не знаю - тысячи их.
>>1498904 Понимаю, что рофл, но текстовая консолечка тут ни при чем. Просто раз уж не разрабатывать ничего масштабного, то хоть учиться грамотно использовать ресурсы и обходиться без готовых велосипедов.
>>1498936 Даже создание 2d игрушки должно быть чем-то интересным, когда есть ограничения по памяти и мощности. Не получится совсем уж гавнокодом все делать.
>>1497109 >В контексте Си символы и байты равнозначны. Не думаю. Строки бывают мультибайтовые или юникодные. Байту эквивалентен только тип char, но это конкретный тип с именно таким названием, а никакой не абстрактный "символ". >Виртуальная позиция в памяти. Что это? Процессор работает либо с числами напрямую, либо с указателями. Что за маня-"позиция" такая? Не понимаю. Я знаю позицию-указатель на выполняемую инструкцию в специальном регистре процессора. Вот это можно назвать абстрактный словом "позиция", не вдаваясь в детали, ведь оно само работает на уровне процессора и программиста не касается, но с массивами не такой случай. А что я понимаю, так это то, что массив не является "переменной-указателем языка Си", но это вовсе не значит отсутствие указателя, строки без указателей не работают. Там нарисована схема бинарного представления массива и указателя на литерал, и в массиве отсутствует указатель. Как тогда это работает? Магия? >Это значит, что ты слишком молодой по сравнению с сишкой. Спасибо, но такого написания даже во времена DOS не было. Слишком молодой, лол.
Ку, не понимаю че происходит с открытым файлом если мы форкаем процесс. Новый процесс получает копию открытого файла или файл закрывается для одного процесса, и открывается для нового?
>>1499338 Упитанно. Язык Си как таковой - бесполезная хуйня. Там везде главное - железо, нужно разбираться в апи конкретной системы. А учитывая что в треде даже винапи никто осилить не может (все пукают в консольку), какие там несы/плейстэйшены, окстись.
>>1499115 > и в массиве отсутствует указатель Зачем ему там быть? > Виртуальная позиция в памяти. Что это? Чтобы прочитать символ, процессору нужно выставить на адресную шину адрес. Этот адрес нужно вычислить. Под позицией/перемещениями в том FAQ понимается текущее вычисляемое значение адреса (не обязательно в конкретной переменной или регистре). Да, объяснение не лучшее, и если ты знаешь что такое адрес, то думай об адресах. А что касается того ответа в целом, то смотри:
> генерирует код, позволяющий переместиться к месту под именем "a" ; Где-то в секции данных у тебя есть: a db 'xyzw', 0 mov eax,offset a > перемещается на три символа вперед add eax,3 > и затем читает требуемый символ mov al,[eax] При чтении символа по указателю тебе понадобится дополнительный шаг: ; Где-то в секции данных у тебя есть: a db 'xyzw', 0 ; Где-то в секции данных у тебя есть: strptr dd a mov eax,offset strptr mov eax,[eax] add eax,3 mov 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-ом ни одной тройки. Достаточно ли этого, чтобы я мог называть себя технарём?
>>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.
> это устаревшая ерунда Виндой мир не ограничивается.
Пожалуйста, пользуйтесь 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/