Вы видите копию треда, сохраненную 18 ноября 2019 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Пожалуйста, пользуйтесь 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)
typedef struct array {
...
} array_t;
Можешь, не зарезервировано.
Достаточно редко используется, отлично распознается компиляторами. Смотри: https://godbolt.org/z/SnIAwS Для тех, кому хочется гарантий, есть интринсики.
>>480866
Стандартом Си не зарезервировано, но зато зарезервировано стандартом POSIX.
>>480935
CMake оставляет за собой кучу говналогов, посмотри в них конкретное сообщение об ошибке.
Как раз дочитал эту Перри Г., Миллер Д. «Программирование на C для начинающих».
Попробую теперь её.
>Охуенно ты придумал. Вот у тебя скомпилированы .o, использующие одну библиотеку. Функции же библиотеки не находятся в отдельном .o, а продублированы в каждом из твоих .o. И откуда линкеру-то, блядь, знать, что они идентичны, и какие копии можно выбросить?
Но такая библотека у меня работатет и компилятор даже не ругается.
А тела inline-функций можно разместить только в .h файле.
https://nanochess.org/toledo_nanochess.c
Языки придуманы для того чтобы человек смог их прочитать, а не для мастурбирования на количество букав. Считайте по количеству операций что-ли, а не такую фигню мутите. Если уж хотите минимализм, то ебоште сразу машинными кодами.
jff
>какой спортивный интерес так минимизировать код?
Любой код надо минимизировать и делать, как можно проще и понятнее. Есть же такой принцип KISS(Keep it simple, stupid). Это только индусские макаки наоборот писали тонны нечитаемого говнокода, потому что им платили за количество строк.
Что касается твоего примера - там просто нет табуляции и его нельзя прочитать.
>там просто нет табуляции
>там просто нет табуляции
И да, code golf это непросто, это уже совсем не KISS
Написал библиотеку полностью в .h, файле.
Потом решил сделать правильно: все тела функций вынес в .с файл, а в .h файле оставить прототипы функций, глобальные переменные, массивы, структуры(я скачивал некоторые библиотеки с гитхаба, и там все так делают).
Всё сделал как надо, на .h файл поставил guardы, к .с файлу подключил .h файл, но ничего не вышло. Компилятор выдавал десятки ошибок multiple definition в объект-файлах.
Долго не мог понять, в чём причина, и только сегодня, после долгого гугления нашёл ответ в яндексе на первом ответе: глобальным переменным нельзя присваивать значения в .h файле, их там можно только объявлять.
А у меня там всем переменным были присвоены нули.
ПОЧЕМУ ОБ ЭТОМ НЕ СКАЗАЛИ НИ В КЕРНИГАН РИЧИ НИ ДАЖЕ В СПРАВОЧНИКЕ ШИЛДТА!!??
Это же очень важная проблема, я МЕСЯЦ ломал голову, почему не могу разнести свою библиотеку в пух и прах на два файла.
Потому что это очевидно вытекает из базовых знаний. Если ты инициализируешь static, то это уже не bss, а data, то есть в каждом .o хардкодятся значения под этими символами, и линкер не вдупляет, где правда. Выхода два. Либо в .h без инициализации (bss заполняется нулями, когда разворачивается в памяти процесса, так что норм), либо в одном из .c инициализируешь, а в других объявлешь extern. Ответ гугла - рациональное, а не эмпирическое. То есть в принципе можно, но лишено смысла, ведь если один .c, то нет смысла в .h.
Короче, чем забивать голову частными случаями магии инклудов и золотых правил, с ней связанных, лучше понять, что инклуд - тупо вставка текста. Представил, что вместо отдельного .h его содержимое продублировано в шапке каждого .c, и сразу все ясно.
>ПОЧЕМУ ОБ ЭТОМ НЕ СКАЗАЛИ НИ В КЕРНИГАН РИЧИ НИ ДАЖЕ В СПРАВОЧНИКЕ ШИЛДТА!!??
синтетическая инфа, необходимость которой возникает от непоследовательного изложения основного материала
Ежедневная рубрика читаем k&r жопой.
Тред заполнен ньюфагами на сто один процент. Но ньюфаги на то и ньюфаги, чтобы показывать им http://ioccc.org/ и зоонаблюдать.
Зря ты так. Кто не прочел про IOCCC в комментарии и рассматривает код, как промышленный, тот уже безнадежный долбоеб без всяких объяснений, а сейчас еще налетят долбоебы претерминальной стадии и будут рассказывать тебе, какая бессмысленная хуета все эти контесты, а какие вы вообще все несерьезные в сравнении с мамкиными Стивенами Сигалами, 24/7 думающими о сиюминутной пользе занятия.
Так ведь это и правда бесполезная хуйня, в 16 лет баловался пару раз таким, пользы ноль, одно веселье.
Называется олимпиадство.
Проблема в том, что ум это далеко не всегда что-то хорошее, т.к. он позволяет человеку чувствовать превосходство над другими. В результате многих интересует в основном эта сторона, реализуемая решением задачек. Такому человеку нужен челлендж, безотносительно пользы. Зависимость скорее даже наоборот, чем полезнее софт, тем более там банальной работы, суть рутины, не дающей никакого челленджа, ну как таскать кирпичи для строительства дома, но это совершенно необходимо. А умные не хотят, это чсв не греет, им скучно, унизительно, нужно выебываться крутыми решениями неординарных задач. Однако такое поведение это не порождает полезного, даже часто как таковых программ не производит, потому что есть огромная разница, скажем, изобрести двигатель внутреннего сгорания или сконструировать реальный качественный, удобный людям автомобиль.
>изобрести двигатель внутреннего сгорания или сконструировать реальный качественный, удобный людям автомобиль
Надеюсь не к изобретению ДВС ты относишь олимпиадную матанопетушню?
>матанопетушню
Да пошел ты нахуй. Эти, как ты считаешь, бесполезные выебоны - жизненная необходимость для умного человека. Даже если несовершенное потреблядское общество перепроизводства килотонн хуеты тысячу раз обесценивает эти скиллы. Талантливому человеку отнюдь не легко довольствоваться примитивщиной, не впадая при этом в депрессию. Эгоист ты, макака.
Просто к изобретению. Изобретение это придумывание чего не было, вот и решение задач это получение решения, которого (у тебя) не было. Но решение задач это не программирование, ведь программ не дает. Получается через жопу: когда задача решена, нужно начинать делать программу, а пациент наоборот теряет интерес и уходит в другие задачи, где процесс повторяется. И даже если программа есть, такие не фиксят элементарные баги и неудобства, однако доставляющие пользователям много боли, которые могли бы быть исправлены за пять минут одной строчкой - как раз потому что слишком просто, вот и висит говно буквально годами, ёжики колются, а разрабу поебать, он сидит над умными проблемами.
Как-то раз видел вообще прикол, картина маслом: разработчик очень известной тулзы внедрил новую крутую фичу и релизнул "смотрите как теперь можно, воу!", но никакой документации как пользоваться не дал, а вопросы игнорировал. Так никто ни разу этим не воспользовался, тупо все проигнорировали. Нафига спрашивается делал? А потому что интеллектуальная маструбация, по определению служит лишь самоудовлетворению.
Однако забавно, но т.к. причина в чсв, а значит в отношениях с другими людьми, получается на них влиять. Сам я тупая макака, делаю простые вспомогательные вещи, но ради удобства. Сделал - люди пользуются, а потом эти умники разрабы у себя делают аналогично. Что-то вроде ревности наверное, лол.
>>482275
Непонятно к чему ты упоминаешь производство, а значит работу. На работе работники подневольны, делаю что велено. При чём тут эгоизм или "довольствоваться чем-то"? Эти вещи как раз зависят от тебя, чего на работе нет.
>Непонятно к чему ты упоминаешь производство, а значит работу. На работе работники подневольны, делаю что велено. При чём тут эгоизм или "довольствоваться чем-то"? Эти вещи как раз зависят от тебя, чего на работе нет.
Я к тому, что реальная жизнь (работа) уныла по определению. А оратор выше назвал занятие уничжительным термином лишь за то, что оно невостребовано в этой реальной жизни. Эгоизм же в том, что люди заурядные способны оставаться психически здоровыми, довольствуясь потреблядскими ништяками за непосредственную работу, а люди талантливые лишены такого похуистичного спокойствия ума, и нельзя их за это считать шизиками и создавать насмешливую репутацию вокруг олимпиадной движухи вцелом. "Мне не надо, значит вообще не надо" - натуральный эгоизм. Олимпиадная движуха - смертельно необходимая вещь хотя бы потому, что удовлетворяет потребности интеллектуальной элиты, которая двигает прогресс в самом качественном плане.
>Олимпиадная движуха - смертельно необходимая вещь хотя бы потому, что удовлетворяет потребности интеллектуальной элиты, которая двигает прогресс в самом качественном плане.
Нет, олимпиады это как раз говно. Если хочется чего-то возвышенного, лучше изучать алгебраическую геометрию, теорию категорий и схемы. Но олимпиадники часто те еще потребляди, и красоту математики пытаются обесценить и свести к надоям чугуна. Олимпиадники это та же продакшен чернь, только сбоку.
>Представил, что вместо отдельного .h его содержимое продублировано в шапке каждого .c, и сразу все ясно.
Но в .h файлах ставятся guardы и прочитаться содержимое, заключенное в эти guardы может только один раз.
Поэтому я долгое время и не мог понять, почему это multiple definition, guardы ведь стоят и по идее множественного присваивания быть не должно.
>Если ты инициализируешь static
Я там инициализировал просто переменные, без дополнительных эпитетов, вот так:
unsigned char Char = 0;
>Тред заполнен ньюфагами на сто один процент.
Так это хорошо же.
Значит, язык живой, и много людей желают в него вкатиться.
gcc -c yoba1.c yoba2.c
то же самое, что
gcc -c yoba1.c
gcc -c yoba2.c
При чем тут
#ifndef YOBA_H
#define YOBA_H
...
#endif
???
Это надо, чтоб в отдельно взятом компилируемом модуле ничего не повторялось. Те же определения структур и т.д., словом, все, что определяет поведение компилятора. Переопределения же инициализированных данных и функций во всем проекте при попытке сборки воедино результатов компиляции - это уже линкер в ахуе. Грубо говоря, работа компилятора - заготовить маш.код процедур, со всеми обращениями к полям структур по соответствующим оффсетам и прочей хуетой, а работа линкера - превратить все символы в адреса.
Это и есть static. Просто в теле функции надо явно указывать, а глобальные один хуй другими не бывают.
Короче, гарды работают независимо для каждого файла, юзающего этот хедер. А как иначе? И зачем? Это если ты инклудишь хедер1 и хедер2, а хедер2 сам инклудит хедер1, то получаются повторы. Как анон выше писал, нехуй жёппой читать. Препроцессор осиль.
> Однако такое поведение это не порождает полезного
Такое поведение дало тебе qemu и tcc, например. Оба проекта начинались как работы для ioccc.
>>482445
Да, по-хорошему не стоит зависеть от чужих инклудов, потому что (в теории) они могут что-то у себя поменять, и твой код сломается. С другой стороны, например, в сишной стандартной либе есть гарантии, что stdio.h обязательно принесет тебе size_t и NULL, поэтому пока тебе не понадобится какой-нибудь offsetof, ты можешь обойтись без stddef.
>что оно невостребовано в этой реальной жизни
Сейчас ты называешь изобретения созданные математиками, благодаря которым произошел прогресс технологий или вся твоя маняматика пук.
двач
>Теория вероятности
Всего лишь маня-теория, оторванная от реальности
>теоретическая физика
О да, это еще те говноеды, посредством какой среды распространяются радиоволны в вакууме/космосе?
>криптография
Нинужна
Маняматик, плез
Но нужно ли учитывать эти невидимые байты при чтении с файла?
Нужно, конечно. Когда файл прочитается до конца, возвращается EOF, а не '\0'.
Но не делай так в текстовых файлах.
Для текста есть специальные функции записи/чтения, где не нужно беспокоиться о нулях и прочих управляющих символах. Если же залез в бинарные данные, там пишется и читается всё буквально, каждый байт как нужно тебе и разбираться тебе.
Да, всё так. Попробовал сейчас перекрестно подключить 2 хедера(в хедере 1 инклюдил хедер 2, а в хедере 2 - хедер 1) - выдало кучу ошибок redeclaration. Вот же я жопочтец.
Я про то, что они не бывают в стеке.
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?
Я аллоки никогда не проверяю на НУЛЬ))0)
У меня 16 гигабайт РАМ, ведьмак тянет - почти на ультрах, а тут это говно память может не дать. Если не даст - снесу нахуй и всё.
>У меня 16 гигабайт РАМ, ведьмак тянет - почти на ультрах, а тут это говно еще оптимизировать?
Разработка типичного хеллоуворлда или пиксельного восьмибитного платформера в 2019.
> Принято ли вообще обрабатывать ошибки слишком тщательно и обширно использовать goto
Принято обрабатывать ошибки тщательно. Часто можно обойтись без goto, используя более мелкие фукнции и/или множественный return.
>>483956
> Я аллоки никогда не проверяю на НУЛЬ))0)
А потом тебе придет размер чего-нибудь по сети, ты попробуешь столько выделить, а дальше будет так: http://ideone.com/QepQ2j
Не понял. Это типа хацкер запросил заведомо нереальный размер, чтоб malloc() вернула NULL, а в качестве индекса - абсолютный адрес взламываемой жёппы, чтоб, не проверив успех маллока, жертва своими же руками оффсетнулась по нулю куда надо хакеру?
Привет, двач. Есть у кого на примете годный курс лекций по алгоритмам? Знаю, что библией алгоритмизации считается книга Кормэна(потом по нисходящей идут Дасгупта и Бхагарва, тоже знаю) и мне нравится её полнота, однако, формальный язык очень и очень отталкивает, не способствуя пониманию. Да и вообще, формат лекций мне как-то ближе, нежели просто чтение книги. В общем, какие требования? Полнота(речь не об N-полноте, лол) Кормэна в сочетании с интересным, не сухоформально рассказывающим преподом. А, да, и чтобы на русском(знаю, что охуел). Подскажите чего по сабжу?
Погугли лекции Хирьянова Т. Ф., По информатике и математике у него одни из самых охуенный лекций что я посещал. Правда хз сколько записей есть.
"Уязвимости" это мем. По факту ты говоришь, не понимая смысла своих слов, просто мемекаешь.
пошел нахуй филолог ебаный
Кто проплатил налет армии хуесосов против КиР? Это единственный пик для шапки треда. Кто возразит - матерей всех ебал.
Не ебу ваши местные мемы. Какого хуя на форумах советуют древнее говно, я заёбся уже. Не спорю, хуй сосать на ровном месте может быть полезно, но блядь я же ещё учусь.
UB UB гроб кладбище.
Чтоб ты скончался от разрыва селезенки, псина.
Это реальный баг, если что. Но, конечно, совсем не такой простой, как в примере.
>>484231
Да. Тут очень упрощенно, на самом деле это может быть несколько разных запросов, integer overflow в офсете и все такое прочее. Но не проверять malloc() надеясь на сегфолт - глупо.
>>484528
> Т.е. free(*) нихуяшеньки не чистит (не обнуляет байты) память, а просто возвращает её ОС?
Даже в ОС не сразу/не всегда возвращает.
>возвращает её ОС
Если бы malloc/free каждый раз дергали sbrk, ты бы охуел от "производительности". Вероятнее всего, после free() ты все еще сможешь прочитать что-то по тем же указателям.
есть у кого-нибудь?Слейте пожалуйста
>free(*) нихуяшеньки не чистит (не обнуляет байты) память
Где в слове "free" ты видишь значение "очистить"? Или в документации этой функции покажи пункт.
Это процессорные исключения, не крестовые. Но в сишечке исключений нет вообще никаких, зато в ней есть UB, позволяющие программе после возникновения UB вести себя так, как ей вздумается. Вот этой вздумалось вызвать исключение, потому что ты пишешь по неинициализированному указателю p (или lineptr, там не совсем понятно без кода).
Это риторический вопр.знак был. Я сначала подумал, что это и вправду крестовые исключения, и имел ввиду, что нет прямой иерархии между низкоуровневыми и высокоуровневыми языками, то есть никто не запрещает использовать библиотеку, собранную с крестовым конпелятором, на Сишечке.
> Исключения ядра ОС
Ядро ОС их переименовало, источник - все равно процессор.
> Процу не все ли равно, какие байты дрочить?
Нет. Он не знает, как писать в незамапленные страницы виртуального адресного пространства и плюется #PF (page fault), а винда видит, что мапить туда ей нечего, и говорит access violation.
мои пардоны, чет подзабыл
Ну я же тебе написал, у тебя p == NULL. Ты делаешь strcpy(NULL, line), дллка никакой магии не делает, там внутри будет что-нибудь типа while(∗p++ = ∗line++); только оптимальнее, оно пишет по NULL, проц/ядро генерируют исключение, студия его перехватывает и показывает.
У сишечки все еще есть доступ к использованию системных обработчиков ошибок.
>>485829
На малинках линукс, на ардуинах плюсы. Ты наверное имел ввиду embedded в целом.
>Зачем нужен язык без исключений
А зачем нужны исключения? С это кроссплатформенный ассемблер. То, что его использовали как источник вдохновения для большинства популярных императивных и ООП языков, является большим недоразумением. Отсюда представления, что Си -- какой-то хуевый язык, в нем нет исключений, ООП, метапрограммирования, лямбд, функторов и монад, что за хуйня. В то время как проблемы не у Си, проблемы у всех остальных императивных языков, начиная с C++, и проблемы очень большие.
А да, ты прав, я с access denied перепутал, сцуко опять. ОС также сама может генерировать исключения.
Access violation page fault - железячное прерывание, а Access denied - софтверное.
У C++ тот же SEH внутри насколько я помню.
Окей, вот только не надо максимализма. Я же не зря написал "в чистом виде".
ООП не нужен, но классы нужны, без них плохо.
Лямбды это лишь встроенный код, как код может быть не нужен?
Функторы это указатели на функции, они и так есть и нужны естественно.
И какие такие у С++ проблемы, если это та же сишечка, только дополненная? Если для тебя наличие кучи возможностей, которыми можно спокойно не пользоваться или пользоваться по желанию, это плохо, то советую в дурку проследовать. Наличие не может быть плохо в принципе, если оно не навязано, а кресты ничего не навязывают, это не жаба с решетками и прочими хаскелями.
>>485835
Не в этом дело. Если даже процессоры и ядра на низком уровне используют исключения, значит исключения это хорошо, это действительно удобно, а в языке для приложений и подавно. Не иметь их неудобно, это инвалидность, поэтому чистая сишка это убогий ненужный язык. В С++ я могу писать как на Си, но кидать исключения, это очень удобно, а еще использовать классы, например для СОМ или GUI библиотекэ, то очень удобно.
> У C++ тот же SEH внутри насколько я помню.
Да, но оно не умеет ловить другие виндовые исключения, оно работает только со своим собственным (0xe0чтототам), поверх которого реализует все свои raise.
Я поддвачну этого оратора.
Пишем на работе драйвер на С++, никакой стандартной библиотеки само собой, но, тупо уже шаблоны и RAII\Деструкторы настолько упрощают разработку, что я тоже искренне не понимаю, зачем вообще писать на С в 2019
Ага, нинужны короче сишечке эти крестовые пердоли, которые в ядре не работают, между прочим. SEH с головой хватает.
Удвою коллегу, очень удобно прогать драйвера на плюсах, а то лапша из goto try except finally глаз мылит, да и сишный код дебажить в голове не комильфо.
Кому-то нравится жрать говно (С++), а кому-то важна аскетичная эстетика кода (C)
Твой порванный пукан лишь подтверждает мои слова
>Но дело в том, что нет достаточно крупных идей, чего такого наваять, чтоб прибегание к плюсам было оправдано.
Тебе выше написали, что RAII и деструкторы настолько упрощают жизнь, что нет смысла писать на си в 2019.
Можно не использовать стандартную либу (особенно iostream какой-нибудь), классы с VMT или исключения (тут сложнее, но век пиковских контроллеров ушел), но у С++ всегда было что предложить для аскетичного сишника. Всего два класса - vector и string, уже упрощают код в разы.
>С чего же начать заселение своего гитхаба, чтоб зашло работодателю Junior C++?
Самая главная прелесть С++ в том, что даже 1 пуллреквест в крупный проект - это 100% прием на работу джуном.
Не нужно годами пилить какие-то имиджтудулисты, не нужно даже думать о пет-проекте, если ты способен
1. Открыть проект на гитхабе и изучить его
2. Найти там баг
3. Пофиксить его и правильно оформить
Тебе уже есть работа на крестах. Потому что крестоджунов, умеющих это, очень мало, кресты учат в универах на уровне laba.cpp.
А если патчить Linux пулл реквестами это может с поиском будущей работой на C/C++? Хоть там и чистый С, но все же
За принятый патч в ведре тебя сразу мидлом возьмут. Но этого не случится конечно
тру стори, бро
> Всего два класса - vector и string, уже упрощают код в разы
Под них все равно придется аллокаторы переписывать.
Толстота, нет? Сейчас куча фазеров и прочей лабуды на автомате находит баги, остаются только уж совсем сложные UB, которые невозможно воспроизвести или заметить одним лишь чтением исходников.
потому-что стэк оверфлоу
Тогда бы issues на гитхабе были пусты, а они полны. Берешь один такой баг, воспроизводишь, фиксишь. В опенсорсе дохуя багов, которые живут не потому что они сложны, а потому что некому фиксить.
Если совсем лениво, можешь спросить у мейнтейнера какую фичу запилить. Но это сложнее
Так их фазерами/анализаторами и ищут, 2019 год на дворе, никто не будет тонны кода разбирать руками.
Два чую, а двач это киберпространство с одним аноном, который застрял на корабле посреди космоса.
Я дожил до века мультигигабайтных плашек ОЗУ не затем, чтоб юзать только 24 бита адресного пространства. Ну а так да, крестовекторы не нужны, когда есть охуительные макросы.
Ну, обернуть операции с массивами в макросы, чтоб все реаллочилось и т.д. и т.п.
Переизобретатель велосипедов в треде, все в Тур де Франс.
Нет, я как раз тот, кто его хуесосил. Чини детекторы.
А как тебе такое?
https://github.com/attractivechaos/klib/blob/master/khash.h
Я припух если честно, когда в первый раз увидел.
Я про архитектуру, а не ОС. О какой крестовой STL может идти речь под всякие STM32? А Сишный код с няшными макросами аккуратно перенес, и все ок. Согласен, хуйню несу...
Оба кроссплатформенные.
>>486628
На самом деле на крестах очень интересно с memory-mapped портами работать, в том числе и с bit-bands в STM32: красиво, удобно, безопасно. Но цена этого - несколько абсолютно нечитаемых файлов с шаблонами, в которых хуй разберешься, когда/если что-то пойдет не так. Так что мы уж лучше как-нибудь по-старинке, на сишке с дефайнами.
>Так что мы уж лучше как-нибудь по-старинке, на сишке с дефайнами.
На крестах дефайны запретили?
Пытаюсь использовать simavr для, собственно, симуляции avr контроллеров в linux у меня arch. Симуляция, вроде, работает, но при попытке подключится с помощью gdb, simavr пишет
>remote_gdb_handler opened
>remote_gdb_handler closed
и нихуя не происходит. В Гугле забанили за тупые вопросы таких проблем не нашёл. Знает кто, что и куда пердолить, чтобы заработало?
Пиздец какой-то, чем только байтоебы не оправдывают свое нежелание учиться.
Алло, STM32 - это 32-х битные контроллеры, работающие быстрее машин какого-нибудь 1996 года, при чем стоят они по 100 рублей за штуку в розницу и их сейчас можно чуть ли не в магнитики для холодильника пихать. Сейчас спорить можно о том, можно ли использовать на контроллерах минималистичный жаваскрипт, а не о С vs. C++.
Что касается непосредственно "портянка макросов" vs "темплейты", то разницы в оверхеде между ними нет никакой. Но при этом ты теряешь поддержку системы типов, и, что более важно, RAII.
> работающие быстрее машин какого-нибудь 1996 года
Тактовую частоту сравнил, лол? Нет, это так не работает. Это мало того что тормозной ARM, так еще и неполноценный от рождения Thumb. И памяти там нет. Ну это если мы про F1 говорим, которые за 100 рублей. Поэтому нет, никаких крестов там близко не нужно, нет для них задач. И выбор стоит такой: простая, понятная и предсказуемая сишечка vs. очередная ебань, которую притащит WG21 уже вот-вот, и которую обязательно нужно начать использовать, потому что теперь так модно.
> минималистичный жаваскрипт
Ясно, ты из этих. А тут-то ты что забыл в таком случае?
А зачем?
Микроконтроллеры надо симулировать на реальном железе с осциллографом.
А для простой отладки на компе достаточно AvrStudio и Протеуса.
>Поэтому нет, никаких крестов там близко не нужно, нет для них задач
Это для тебя, чмоня из /ra/, которая в 2019 году не может разобраться с темплейтами и RAII, нет задач. Нормальные люди берут С++ просто потому, что никакого смысла брать сишку нет. Даже если у тебя в память не влезает STL. Даже если ты мигаешь диодом. Вообще ноль смысла.
Какие самые актуальные фреймворки по Си в данный момент?
анус_твоей_мамки.h
libanal_tvoego_bati.so
Не, в C это так не работает. Нельзя выучить какой-то конкретный набор фреймворков, после чего можно было бы рассчитывать на позицию джуна. Тут используют сравнительно небольшие библиотеки, причём выбор конкретных библиотек определяется целями проекта, и везде он свой. GLib, GTK, C POSIX library
>убогому напомнили о существовании приличного мира с приличным софтом
>ВРАГИ ХЕЙТЕРЫ НАПАЛИ! РЯЯ!! СПАСИТИ!!
Не могу остановиться проигрывать.
На всё твой личной выбор, петушило. Выбрал пердомир, отринув адекватный, так пердолься, страдай сам, преодолевай сам, это был твой выбор. Но нет же, лицемерной шлюшке хочется два слула сразу, и понтоваться хардкорщиком, но и чтобы было легко как казуалу.
Это не сишники такие, а двачеры.
Подводные есть. Кто там говорил, что С это подмножество С++?
>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};
Подводные есть. Кто там говорил, что С это подмножество С++?
>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};
блять, сори за формат
Тут просто сидят тупые школьники/студентишки на первой стадии Даннинга/Крюгера, отсюда и нападки на красноглазиков и крестовиков. Просто игнорируй их, и все будет хорошо. Ещё лучше будет каждый раз когда видишь их посты просто отвечать им пидорас съеби или типа того
Просто съеби.
Да он почему-то решил, что ты C99 код будешь миксовать с С++. Нахуя так делать, вместо того, чтобы взять С++ и писать на си с классами - не понятно.
Нихуя, про _Generic первый раз слышу, круто анон.
Потому что у тебя там 32-битный int? Используй long, например, или перепиши на stdint.
Благодарствую, пойду
int64_t
Нафига long тоже самое что и int?
Почему не сделали так:
char - 1 байт
short - 2 байта
int - 4 байта
long - 8 байт
long long - не нужон.
С фига, что инт зависит от архитектуры, а формальные определения типов - от соглашений языка. Когда я учился в школе, он еще был 16 битным.
long - размер регистра, long long - 64 бита, и если регистр меньше, то усложняется маш.код, а int - просто int, лол
> Он тоже 32 битный вообще то.
Это зависит от ОС: у тебя либо модель LP64 (линукс) либо LLP64 (винда).
>>487935
> Почему не сделали так
Легаси. Изначально инт должен был быть самым быстрым целочисленным типом из поддерживаемых, а 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 для записи в файлы или обмена по сети.
Двачую.
Итт нет никаких вордов. У нас абстрактная машина, у которой даже процессора нет по стандарту. Страдай.
malloc () == NULL? Просто exit () или попробовать снова?
Зависит от ситуации.
Если ты просто выделял память под маленький объект, а она кончилась, то все, приехали.
Если ты хотел выделить 8гб памяти под какой-нибудь йоба кэш, то можно сказать "ну ок, попробую обойтись четырьмя"
Анончики посоветуйте хорошие интерактивные курсы
С меня как всегда - нихуя
>указал на тупость и лицемение конкретного автора поста
>ЮНИКСВЕЙ ХЕЙТЯТ! РЯЯ!!
Классика маргинальныех ничтожеств - обобщать и прятаться за чужими спинами общих понятий, тем самым уводя разговор от конкретного мерзкого лицемерного чмошника.
И неудивительно, ведь ничтожество поэтому и ничтожество, что нуль, не существует как личность, отсутствие которой заменяется причастностью к чему-то общему.
Вкатись сначала в ассемблер и посмотри архитектуру процессора.
Тогда в Си сможешь вкатиться как по маслу.
Что, простите? Везде использую DWORD и BYTE, а ваши инты и лонги в душе не понимаю, мутная фигня.
Какой из ассемблеров взять? Сижу под linux, люблю кроссплатформенность и поддержку нескольких архитектур.
В вики написано, что да.
Рот ебал этого GAS! Там синтаксис под древний парсер, который давился, если составляющие инструкции даны не в той последовательности, в которой их в маш.код складывать. Кровь из глаз, сука. Зато выглядит так коркорно, тип технарь дохуя, короче заебись тема, отвечаю.
Наша шарага, конечно, не пример, но не всем же учиться в MIT.
FASM - это такой котлин он мира ассемблеров. Вот.
Вывести сообщение юзеру, мол у тебя нет памяти или просто записать это в лог и выйти из программы.
А может все таки Кнута, наконец?
[eax+size∗2] или (%eax,%ebx,2) - что понятнее? Алсо, такая хрень чаще встречается на месте source операнды, соответственно, лучше ставить ее в конец, чтоб все лежало под линеечку (в AT&T для этого надо ставить дохера табов). % $ туда же - кровь из глаз. И так видно, где константа, а где регистр. Закорючки только мешают, они древним ассемблерам нужны были, чтоб в один проход все делать без разбору. Суффиксы b/w/l/q слитно с мнемоникоми, когда есть божественные Intel-овские byte, word, dword, qword... Короче, Intel - человекочитаемый.
Но осилить AT&T и забыть как страшный сон - must have, соглашусь. Он первичен, а Intel не везде есть. Образованный человек не имеет права не разбираться в нем в случае чего.
>что понятнее?
Второе, кровь из гоаз, это интеловская залупа, где они перемащают справа на лево, как пидоры, да и $0x20 более наглядней чем 20h
В поинтере хранится только адрес. Типы известны только во время компиляции, в рантайме их нет.
Образованный человек должен знать об AT&T всего две вещи: -masm=intel и -Mintel для gas/gcc и objdump соответственно.
ХЬЮСТОН, У НАС ПРОБЛЕМЫ. ВАМ СЛУЧАЙНО НИКАКИЕ ЛОГИ НЕ ПРИХОДИЛИ?
Есть, не пизди
x = 0xA
>инфа о типе
Катись обратно в свою скриптопарашу. Здесь этого кала нет.
>А что происходит, если несколько разных тайпов имеют один и тот же размер?
Ничего, такая программа не компилируется, а значит не существует. Получится только текстовый файлик с твоими тупыми писульками, никому не нужный как и ты сам.
0x привычнее для сишников, но ты, как истинный демагог, мешаешь все в кучу, $ тут ни к чему. Насчет справа налево господин выше уже ответил. Алсо, операнда назначения ближе к мнемонике органично продолжает случаи, где является несменной частью инструкции, как та же DIV/IDIV, которая всегда оставляет целую часть в RAX, а остаток - в RDX. Ну, и про вертикальную читаемость выше писал.
GAS умеет в интеловский синтаксис? Ебать я танкист, оказывается можно без NASM обойтись. И ведь задним числом очевидно же, что раз gdb и gcc поддерживают...
Ты че, совсем еблан? В каком месте, ХОТЬ РАЗ БЛЯДЬ СУКА ПОКАЗАЛ ПАЛЬЦЕМ А ТО МАТЬ ВЫЕБУ, кто-то писал, что не осилил? Это тот случай, когда легко в учении, тяжело в бою. Выучить AT&T можно за вечер, но к постоянной работе в жизни не привыкнешь - всегда будешь больше страдать физически. Этот синтаксис родился не от хорошей жизни, а от ограниченности тогдашних ассемблеров, не умевших в стек, чтоб читать предварительные указания с конца. Человеческое зрение, в отличие от однопроходного транслятора, склонно упускать детали по первом проходе и любит, когда уточнения выведены дальше, когда пространство слева и справа равномерно используется. И, конечно же, глаз только спотыкается об закорючки, в которых нет нужды, ведь для этого существует целая живая нейросеть, которая прекрасно распознает на лету, как выглядит константа, а как имя регистра, блджад. Как только появилась возможность, сразу реализовали такой человекочитаемый синтаксис. Я тоже любитель всей этой первичной романтики, но искать плюсы в том, что хуево по определению, попахивает шизой.
>операнда назначения
Просто потому, что у тебя слово "операнд" женского рода, ты тупой хуесос, и читать твои высеры бессмысленно.
Подучи русский язык, потом приходи.
Вообще все интересное по темя языка сгодится, в том числе и в текстовом формате. Любая годнота вроде статей/блогов, форумов Особенно реквестирую видео про написание каких-нибудь интересных проектов типа
написания шелла или системных утилит, псевдоооп в Си, а также туториалов для "продвинутых нубов", где разжевываются всякие интересные штуки, типа Flexible Array Member. (А по Си вообще проводятся конференции, как в других языках типа CppCon?)
Можно скинуть мне напрямую в телегу @littlerichard
Просто нравится Си, заебись язык (по ANSI C угораю). Хочу писать реально крутой идиоматический код, эффективно работать с гдб из под командной строки, научиться тесты писать.
Но, к сожалению, не могу себя заставить читать гигантские талмуды на 300 страниц на английском, концентрации не хватает. Мой идеал - небольшая статья, где теории поровну с практикой. Или книга
/брошюра на 40-50 страниц простым языком.
Сколько раз пытался читать книги, всё равно итоге хуй забивал. Целую библиотеку мощных книг собрал, толку ноль. Поэтому, раз я не могу потреблять контент через книги, то ищу что-то более легкоё для восприятия.
Ничего плохого в этом не вижу и думаю, что я не один такой.
Вообще, хочется дойти до того уровня, чтобы устроится "джуном" куда-нибудь в системную разработку или embedded через ещё полгода дрочки Сишечки, но хз, нужны ли кому-нибудь такие джуны и набирают ли не студентов техвузов на такие места.
Бля, вот сейчас проснулся и понял, что еще пару постов назад толстота была.
Да я... Да я... Я "Войну и Мир" читаю, вообще-то, так что не надо! А с операндами не ебу, как там правильно, пушто, как уважающий себя элитарий, технолитературу читаю на инглише! Ну скажите ему, затролльте его, ну пазязя!
Так он написал, что можно в телегу, я так понял, если отвечающий сам не захочет мусорить в треде контентом зумеро-ориентированного формата, но в то же время сам шарит в подобном контенте, лол.
>>489825
Анон, сам себе могилу роешь. Тебе все равно рано или поздно придется много читать скучные тексты без экшона. Вот прям неизбежно и дохуя, или ставь крест на карьере Сишника. Чем раньше превозмогёшь эту слабость, тем дешевле потом выйдет.
> не захочет мусорить в треде контентом зумеро-ориентированного формата
У нас в треде вообще контента нет. Последние два треда - исключительно срачи.
>Но, к сожалению, не могу себя заставить читать гигантские талмуды на 300 страниц на английском, концентрации не хватает.
Так нахуй из профессии, маня.
Для практики и понимания сути. Я ведь не собираюсь тягаться с фреймворками типа tensorflow. Простенькие хотя бы научиться.
Для понимания сути нужно освоить matrix calculus и подифференцировать с ручкой и бумажкой. Кодить там нечего.
Кринж. Так не общаются.
Короче matrix calculus это часть multivariable calculus. Дифференцировал несколько переменных? Вот тоже оттуда примерно тема.
Нейроны это вообще не используемая в нейронках абстракция. Минимальная абстракция - это слой. В случае полносвязного слоя это f(W*x) например, где W - матрица весов (технически строка такой матрицы это веса одного нейрона, но это довольно бесполезная инфа), а x - вектор входных данных, f - функция активации.
В случае сверточного это f(conv(x, W)). Ну и так далее. Никаких нейронов нет, тебя наебали.
Пишешь на си интерпретатор питона или на чём там сейчас нейроночки пишут и хуяришь на питоне свою нейронку, запуская на своём интерпретаторе.
Ж звтр тм г плнст втстнт рст
как на счет дабла?
"Влезает" и "можно точно представить" - это разные вещи. Полный диапазон float ограничивается максимальной/минимальной поддерживаемой экспонентой, но для конкретной экспоненты ты всегда ограничен размером мантиссы, т.е., для каждой конкретной экспоненты у тебя есть "текущий" диапазон, который равномерно разбит на фиксированное количество чисел (223 позиции).
Например, для диапазона 223 и 224 ты можешь сохранить 8388608 числа с шагом 1.0. Между 224 и 225 у тебя чисел вдвое больше, а "мест" для них все равно 8388608, поэтому ты уже не можешь позволить себе хранить нечетные числа, и , между 225 и 226 тебе уже не хватает мест для всех чисел, которые не кратны 4, и т. д, с ростом экспоненты числа становятся все менее точными.
Все это приводит к забавным эффектам типа http://ideone.com/ZeHtT5
Когда работаешь с флоатами, пиши 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.
Подскажите плес какую программу использовать на вын 10 для программирования на C. Знаю о VS 6, Builder.
Зачем мне это надо? Хочу попробовать для сравнения написать простейшее приложение в связке с OpenGL.
Вопросы отпали, забыл, что всё в шапке есть.
>Если хочется чего-то возвышенного, лучше изучать алгебраическую геометрию, теорию категорий и схемы
А еще дискретную математику. Без нее канплюктер саенс невозможен
>Они месят говно и думают, что занимаются чем-то возвышенным.
Ну относительно промышленных программистов - да. Как и маняматики свысока смотрят на олимпудников по программированию
Вообще не понял о чем и главное зачем.
Computer Science
кто нибудь выполнял там задания?(вам не кажется что они не для новичков?)
Типа классика,на самом деле советуют просто потому что самая распиареная.Если говорить об обучение с нуля,то это прата какой-нибудь наверное
Нет. У оригинального K&R только два издания. А третье издание на руском - это перепечатка второго издания на русском.
обоснуй? все задания выполнил?
>зачем предлагать читать k&r
Лучше книги нет
>если она устарела
Си тоже устарел
>кто нибудь выполнял там задания?(вам не кажется что они не для новичков?)
Они не для тупых, но ничего того, что бы не знал новичок, там нет
> Они не для тупых,
Это точно. Я над блядскими вертикальными гистограммами бился явно дольше нормального человека.
Мимо
после k&r вышло много изменений, вышло несколько стандартов, в которых писать некоторые вещи стоит по-другому.
Ок задания не для тупых. Кто их выполнил все? есть тут в треде герой?
> Си тоже устарел
Он не может устареть. Или кучу кода вдруг перепишут на rust? Нет, конечно. Ядро Linux как писали на C/C++, так и будут писать. А оно используется везде: от листрибутивов Linux до android смартфонов.
Устареть он может, как и кобол, и фортран, и куча других легаси-языков.
А за сочетание C/C++ вообще нужно пиздить обломком трубы.
> фортран
В науке используется до сих пор. Да, скорее из-за легаси.
> А за сочетание C/C++ вообще нужно пиздить обломком трубы.
А на чём писать? Неужели всё-таки на Rust?
блябуду лучше дрочить кобол/фортран чем гомогейскую хуйню для хеллоуворлдов
Нет смысла писать отдельную функцию ради arr[ i] - '0'.
if ( isdigit(n) ) { Не работает,но
подозреваю,что я дебил
n = n -'0';
n = 9- n;
n = n +'0';
}
Так все,я даун,забудьте
Не,не все получилось,я тупанул с n
тестируеш...
NEEQUAQUE
Символы это и есть числа, тупорылый дегенерат.
Основная суть какая? Парсить первый аргумент-строку, пока не встречу какой-то флаг %f, как только встречу передавать следующий аргумент в отдельную функцию по обработке флагов? Никаких подьебов нет? Кроме даблов, хуй знает как их выводить вообще
Нахуя? Студент? Если да то забей, даже близко не сможешь. Если реально надо, то кури <libioP.h> , <libio/stdio.h>, <libio/ioputs.h>, только там все это реализовано в докрестовом ООП стиле, ахуеешь разбираться
> как только встречу передавать следующий аргумент в отдельную функцию по обработке флагов?
Сначала парсишь спецификатор, потом достаешь аргумент, потому что va_arg() хочет тип, и обязательно правильный тип.
> Никаких подьебов нет?
Никаких подъебов, никакой магии. Обычная функция, внутри длинный switch. Вот с snprintf чуть посложнее из-за необходимости контроля границ.
> Кроме даблов, хуй знает как их выводить вообще
Обычная математика, делишь, умножаешь.
>Кроме даблов, хуй знает как их выводить вообще
Сейчас бы заниматься байтоебством, когда проц в одну инструкцию переводит float в int.
print_int((int )n);
putchar('.');
print_int((int )((n - (int n))∗prec))
prec - кол-во знаков после запятой
> Сейчас бы заниматься байтоебством
> когда проц в одну инструкцию переводит float в int
Тогда, наверное, для тебя не составит труда перевести в строку вот это число:
float value = ((union {uint32_t v; float f;}) { 0x00ffffff }).f;
На выходе я хочу увидеть точное значение. 0.00000000000000000000000000000000000002350988561514728583455765982071533026645717985517980855365926236850006129930346077117064851336181163787841796875. Именно его и выводит printf("%.149f", value).
Закончив читать прату на ~75%, я решил зарегаться на рекоммендуемом ресурсе Codewars, дабы начать прокачивать скиллы.
Я крайне поверхностно ознакомился с FAQ и мануалом.
Выбрал себе задачку для начинающих. Какой уровень задач для начинающих? Естественно, как я думал, 1kyu. Задачка с матаном, матричками, как я люблю.
И тут начался пиздец.
3 недели решал частный случай, вроде работает алгоритм. Вроде как набросал стратегию решения общего случая. Читал пейперы про способы решения. Начал это все кодить. Через месяц бросил, ибо если я настолько тупой, что не могу решить задачу самого базового уровня - какой смысл в этом вообще?
Прошло полгода, в течении которого я уговаривал себя что программирование не для меня.
И вот, вчера я узнал что 1kyu это практически мастер. А нумерация (обратная) начинается с 8kyu.
Полгода разбитой самооценки и попыток разлюбить дело о котором думал на протяжении нескольких лет и к которому собирсялся серьезно готовиться.
И все из-за того, что невнимательно прочел мануал.
Мне не место в программировании, ибо я тупой мудак.
Норм, через подобное все проходят. А кто говорит, что нет, тот дохуя пиздит.
ой, перепрошую, панове, я трішечки обісрався
Сама суть,изменить каждый символ-цифру на 9- символ-цифра
Вообщем,если не сложно поясните,что не так с прогой
https://pastebin.com/vxRiYYBc
Ты просто пытаешься сделать так:
n = arr;
n++;
Такое тут не прокатит, потому что ты просто скопировал в переменную n, которая ничего с массивом общего не имеет, значение массива и затем изменяешь не сам массив, а эту переменную. Надо сделать так.
arr++;
У даблрв мантиссу считай
Задачи норм.
Ты в укозателях запутался. Тебе нужно сначала дереференснуть, а потом уже ебаться в арифметику. Т.е., ∗(∗a + i). Чтобы такого не происходило, и код нормально читался, не стесняйся создавать дополнительные переменные:
ptr = malloc(...);
...
...
∗a = ptr;
Спасибо большое!
> увеличение массива на единчку для цикла хуево меняет массив
При N = 3 ты индексируешь массив целыми значениями [0;2]
> for (i=0;i<N+1;i++)
При i = 3 < 4 ты выходишь за пределы массива.
> int N=3
> char Ni[N]
> Введите размер массива
т. е. ты сначала объявляешь массив из N элементов, а потом вводишь его размер?
Тип,я не понимаю,как массив по другому прогонять?
При в строгом неравенстве (i < N - 1) при (i = N - 1) цикл будет завершаться без инициализации (N - 1)-го элемента. т. е. можно заменить на нестрогое неравенство (i <= N - 1) или же записать (i < N).
Спасибо что предупредил.
поздно, петушок, поздно
Не 10 = x, а 10 -> x
roll
Я работаю поваром. Я, как говорится, поварёнок.
>зачем учить си в 2019? какие перспективы?
Может потому, что это самый популярный язык, наравне с Джавой?
Нет.
>>493786
>попробуй найти работу на пьюр си
НИИ
И
И
>>493778
>Такой себе индекс для суждения о популярности.
Он, кажется, ориентируется по гуглежу этого языка, поэтому популярный в иностранных ВУЗах VB.NET такой крутой. Так что рейтинг сосет.
Хотя если посмотреть сколько написано в данный момент на си, то он действительно будет в топах, только вопрос в том, что он нового не пишут и работы чистой не найдешь сука.
>basic bootloader сложнее, чем компилятор C?
Как по мне здесь сложности неадекватно распределены.
Потому что это первое что мне представляется при слове ЧИСТОЕ СИ. а вы, сдается мне, представляете себе синтаксис уровня laba.cpp и подгораете что с ним нет работы? Серьезно?
>void••• ANUSAPI CALLBACK WIERDSTACKRULE fn(void•,void•,void,void•,void•, FUNC•, void,void)
Да, это то самое. Это memaset(228, anusStruct->huj->pidor);
Да, у тебя %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"...).
Создал указатель на константный строковый литерал и пытаешься менять ридонли память.
Хм. Спасибо.
Я не ставил const нигде, но скопировал пример для C++. А именно это в С немного по-другому.
Компилятор допускает, потому что легаси. Сначала было просто соглашение, что в "" писать нельзя. Если бы сделали строки константными указателями после того, как в языке появился const, сломался бы весь существующий на тот момент код, который ожидал и передавал обычные char *. Поэтому строки как бы const, но без const.
Запись по const указателю ловится во время компиляции, а запись в read-only память - во время выполнения. Первое нужно для себя, чтоб не забыться и не сломать логику. А константность "" заключается в самом способе реализации - использование readonly памяти, как и для исполняемого кода. Как анон выше написал, "" не являются const char ∗ в системе типов, потому что многие старые функции, часто используемые с "" в качестве аргументов, объявлены как func(char ∗, ...); и компилятор просто кидал бы error.
Чувак,я не соображаю щас ничего,но очень срочно надо,пожалуйста скинь кусок готового кода
Аноны, не скидывайте этому джахилю решение, а то совсем уже офигели. В двач как ГДЗ для них.
Лучше тележку @yab0id4c
или gmail
Постить тут вкшку не очень безопасно
Потому что в UTF-8 один русский символ занимает 2 байта, а у тебя буфер всего 10 символов. Поэтому лучше играй с латиницей, пока язык учишь.
Спасибо, анон!
И главное, ведь, читал про 2 байта у utf-8, выше в этой же книге и вот теперь до меня дошло!
Мог либо перекомпилить, чтобы длиннее строка была или юзать wchar_t word[10];
лол, как можно было повестись на такую толстоту
>>494791 (Del)
>>494627
>>494611
Скинь с пастбина ссылучку,меня тут аноны деваноном запугивают(
Мы не будем тебя диванонить, если ты извинишься перед бордой и Абу лично за свое наглое поведение.
О,великий и всемогущий Абу и милостивый народ Двощевской земли,я ,Антон Анонов,прошу простить мою наглость и неблагоразумие
Это только UTF32, с которым получается лютый оверхед по памяти.
Плюс, для простых операций вроде поиска подстроки или поиска ASCII символа (вроде разделителя пути \ или /) в UTF8 строке не нужно никакой дополнительной магии, с ней можно обращаться также как и с ASCII строкой.
> с ней можно обращаться также как и с ASCII строкой
У меня от тебя имена файлов в линуксе, которые могут быть чем угодно, лишь бы \0 на конце. И ебись как хочешь.
Сажедебил, разберись с UTF8, потом пиши.
>'strcmpi': The POSIX name for this item is deprecated. Instead, use the ISO C and C++ conformant name: _strcmpi. See online help for details.
не экстраполируй, мань
но онлине хэлп еще меньше говорит
Достаточно написать char strin[] = "HELLO WORLD";, тогда константая строка скопируется на стек и будет все работать
http://ideone.com/Lt5D6x
У белых людей уже 20 лет UTF16 - идеальный аналог char для современной эпохи.
* бит
Ниет. Символов в юникоде внезапно больше, чем влазить в 16 бит, так что UTF16 ничем не лучше, чем UTF8, но при этом жрет больше места.
Так что или UTF8, или UTF32.
>Ниет. Символов в юникоде внезапно больше
Дия. Внезапно, в реальной жизни более чем достаточно для всеязыковых программ. Нет дикого жора лишней памяти как в UTF32 и тем более нет пизданутого парсинга как в UTF-8, этот шлак вообще неюзабелен кроме экспорта на диск.
Так что сосите писосы, дегенераты, но UTF16 как был идеально оптимальным для программного кода, так и остался.
UTF16 это 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.
>Всё равно на серверах дохуя рамы и срать на лишний жор 32 бит, или дохуя ядер и срать на оверхед парсинга UTF-8.
В голосину
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?
1. Так и есть, стек растёт вниз. -0x8 потому что 4 байта уже заняты push %ebx
2. Да, буфер заполняется от вершины стека, последнее значение будет после val
3. Связано, в little-endian 0xdeadbeef побайтово записывается как 0xef 0xbe 0xad 0xde, от младших адресов к старшим
>начала стека отнимается 8, а не 4?
Передача параметров перед вызовом
call 80483f0 <puts@plt>
>на стеке как и в буффере
Long хранится в обратном порядке, в таком его и нужно записывать в буфер char
puts быстрее printf потому что ему не надо ебаться с форматной строкой
Чтобы писать на питоне мне надо скачать питон с оффсайта, прописать его в PATH, чтобы командная строка подхватывала, и установить редактор кода с посветкой синтаксиса вроде Sublime.
В принципе, можно уже начинать работать.
А в C/C++ можно так сделать?
Или надо обязательно тянуть эту майкрософтовскую IDE хуйню (Visual Studio) из интернета на 20+ гигабайт?
Тут можно тупо скачать пакет основных библиотек, подцепить их к редактору и чтобы он мне компилировал мой код в exe файл?
Или особенность компилируемого языка не позволяет так делать?
Качаешь gcc или clang и прописываешь точно так же в path. Можешь заодно скачать make и cmake, иначе заебешься компилировать проект из >2 файлов.
В линуксе кстати это проще делается, пишешь sudo apt install gcc && apt install make, ничего в path прописывать не надо, сразу идешь байтоебить.
двачну господъ на Линуксе,ибо сам им являюсь.
На работе же я 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 на борту.
А так дело твоё: можно набрать код хоть в нотепаде, откомпилить в консоли что на винде что на *никсе и радоваться жизни.
>Или особенность компилируемого языка не позволяет так делать?
особенность компилируемого языка состоит в том, что его надо компилировать. И всё. Прелюдии с кодом компилятор не заботят.
Можно хоть в нотепад++ плагинов наставить, чтобы он компилил все, что ты накодил там. Только нотепаду надо будет указать, где лежит компилятор.
>В линуксе кстати это проще делается, пишешь sudo apt install gcc && apt install make, ничего в path прописывать не надо, сразу идешь байтоебить.
Сразу идешь читать доки по ключам компилятора, make и gdb
Ну если тебя нужен make, то идешь. Если тебе нужен gdb, тоже идешь. А если тебе нужно отладить, то ты уже заранее установил qtcreator с интерактивной отладкой на кнопочку и там же пишешь код
> Пацаны,покажите ебаманный динамический массив символов ,а то хуета какая то получается
Ебать ты мемер,но спасибо
>MISRA
Он запрещает использовать адресную арифметику с указателями(инкремент и декремент указателя).
Как тогда без этого обходиться?
Например, при выводе нуль-детерминированной строки куда-нибудь или перемещении N переменных из одного места в другое.
>Например, при выводе нуль-детерминированной строки куда-нибудь или перемещении N переменных из одного места в другое.
Например, циклом for от 0 до максимального размера буфера.
Не слушай долбоёба, настоящая проблема в том, что getchar считывает перевод строки после p.
Да, когда вводишь p, во входном потоке будет, допустим, 10\n. scanf заберёт 10, а \n останется. getchar его считает и break-нет цикл.
А как исправить?Проверка чтобы первый С был любой?Или пропустить его как то?
Если массив вводишь не по цифре на строку, а слитно, то выкинь второй getchar из цикла
Мне нужно чтобы считывало максимум 100 эл-ов,проверка на дурака есть,но у меня сомнения насчет максимума,если while (i< p-1)и p=101,то он проверит до 99 элемента,100 элемент станет /n,да?
Если лимит в 101,то он будет с 0-99 будут элементы с символами,а последний 100- /n?
Окей,значит все правильно?
Оверфлоу баффера не будет?Типа элемент какой нить закродется за массив и на "миллион и первый раз" прога не сработает и ебгнется RAM?
Фух,тогда все.Бессконечно благодарю за оказанную помощь,/б/ратик
Чувак,извини за беспокойство ,но еще помоги плез:
При p>64 не работает ,не выводит последний элемент(ввел 77776 вывело 2222(то есть без последнего)
https://pastebin.com/2P6Z7Dw9
Иди своей дорогой,прогер
ЧТобы исправить не вывод последнего числа я p++ после ввода и проверок
А,лол,тогда все опять решено,p++ вроде не ломает,я проверил если p==102(101 элемент ,с 101 /n) выкидывает,осталось сделать принудительный ввод подходящего числа,но это я сама вполне сделать могу(если есть свободная минутка можешь помочь ;3 )
Аноны, 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
"/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]
Аноны, 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
"/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]
xcode-select --install
>>495293
Извините что беспокою.
Но.
Где прописано что char* это const?? Разве это не декларация массива char[] просто через указатель?? Каков механизм? Я просмотрел спецификацию, но то ли я хуеглазый, то ли это какое-то соглашение. Опять же, каков механизм?
Мне это важно, потому что я не догоняю какую-то фундаментальную мелочь и мне это мешает.
char c1[] = "nosorog"; - это массив на стэке, не константный
const char* c2 = "zhiraf"; - это read-only память в секции экзешника
>Разве это не декларация массива char[] просто через указатель
Добавьте в шапку http://faqs.org.ru/progr/c_cpp/cfaqrus.htm
А ты прочитай пункт 2 в этом факе
>char c1[] = "nosorog"; - это массив на стэке, не константный
>const char c2 = "zhiraf"; - это read-only память в секции экзешника
Это я понял. Но каким образом
char c1 = "lol"
Становится
const char* c1 = "lol"
Огромного добра тебе!!
>Смотри: 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? Ничего не нашел.
>прочитай пункт 2 в этом факе
Что за шизофазия там написана?
- Имя массива не существует, он считает его макросом?
>он генерирует код, позволяющий переместиться к месту под именем "a", перемещается на три символа вперед и затем читает требуемый символ
Ничего не понял. Кто, куда и как перемещается? Веллосипедист из точки А в точку Б? Розовые слоники в страну чудес? На какие символы происходит "перемещение"? Генерится машинный код, в компьютере нет никаких символов!
f(a)
char a[];
Господи, что это за код?
f(a) char a[];
У меня крыша поехала, что это значит?
> то ли это какое-то соглашение
Вот. char *x = "test" - это НЕ константный указатель, по которому нельзя писать, потому что ты присвоил ему строковый литерал. Под "нельзя" подразумевается UB, компилятор может тебе ничего не сказать, в рантайме запись может оказаться успешной (например, если под DOS соберешь), но на какой-нибудь другой платформе твой код упадет. Поэтому просто не пиши, и все будет хорошо.
> в компьютере нет никаких символов
В контексте Си символы и байты равнозначны.
> Кто, куда и как перемещается?
Виртуальная позиция в памяти. Да, сформулировано плохо, но понять можно. Имеется в виду, что для 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;
{ ... }
Прошу прощения аноны, я долбоеб, и как видно навсегда. После 2-х суток курения спецификации и FAQ-ов и всевозможного гугления, я досконально разобрался в вопросе.
Сегодня увидел что именно этот блядь вопрос досконально объясняет Прата, буквально через пару страниц.
С онлайн задачками покончено, пока не пройду всю книгу и не решу задачи оттуда.
Спасибо большое всем.
>>496927-кун
Ты хоть понимаешь какую просто дикую, сочную годноту принес?
Мое понимание масштабов пиздеца прокачалось до небес.
Я разобрался, нет это не форк-бомба, ведь он не выходит из цикла и не увеличивает i перед созданием ноаого процесса
2^3 процессов в итоге
Как это реализовать? Пропустил одну пару и уже нихуя не ясно. Как с помощью main прочитать файл, тем более указывая его имя а не путь к нему
Найти сайт с решениями простых задачек и сопоставлять решения, используя всю мощь своего IQ. Компилировать эти решения, менять рандомные вещи и смотреть что происходит. И так пока не придет понимание.
Мне надо не решение как считать среднее арифметическое или кол-во чисел больших предыдущего, а то как сделать чтобы программа прочитала данные из файла. Есть file.txt и из него надо достать числа и сделать массив размера n где n это количество чисел в файле
Запрос в гугле: c++ примеры чтения из файла
> после vim
Ясно.
> Какой инструментарий посоветуете, чтоб писать под DOS?
Turbo C, Watcom C, Digital Mars C, Microsoft C четвертая Visual C++ в дос точно могла, пятая - не знаю - тысячи их.
Открой в линуксе терминал на весь экран и представь, что это DOS. Ты даже vim сможешь пользоваться.
Понимаю, что рофл, но текстовая консолечка тут ни при чем. Просто раз уж не разрабатывать ничего масштабного, то хоть учиться грамотно использовать ресурсы и обходиться без готовых велосипедов.
Даже создание 2d игрушки должно быть чем-то интересным, когда есть ограничения по памяти и мощности. Не получится совсем уж гавнокодом все делать.
Почитай game engine black book про doom и wolfenstein, там подробно описано как в те временя игори писали ты так не сможешь
Еще есть computer graphics black book by Michael Abrash, классика своего времени, доступна бесплатно.
>В контексте Си символы и байты равнозначны.
Не думаю. Строки бывают мультибайтовые или юникодные. Байту эквивалентен только тип char, но это конкретный тип с именно таким названием, а никакой не абстрактный "символ".
>Виртуальная позиция в памяти.
Что это? Процессор работает либо с числами напрямую, либо с указателями. Что за маня-"позиция" такая? Не понимаю. Я знаю позицию-указатель на выполняемую инструкцию в специальном регистре процессора. Вот это можно назвать абстрактный словом "позиция", не вдаваясь в детали, ведь оно само работает на уровне процессора и программиста не касается, но с массивами не такой случай.
А что я понимаю, так это то, что массив не является "переменной-указателем языка Си", но это вовсе не значит отсутствие указателя, строки без указателей не работают. Там нарисована схема бинарного представления массива и указателя на литерал, и в массиве отсутствует указатель. Как тогда это работает? Магия?
>Это значит, что ты слишком молодой по сравнению с сишкой.
Спасибо, но такого написания даже во времена DOS не было. Слишком молодой, лол.
Поставь ограничения по памяти в виртуальной машине и вперед.
Тогда лучше под NES что-то делать. Какие у DOS ограничения, практически никаких.
Ну если сишка-хуишка, я бы смотрел в сторону первой соньки. NES это все-таки больше про 6502 ассемблер
Упитанно. Язык Си как таковой - бесполезная хуйня. Там везде главное - железо, нужно разбираться в апи конкретной системы. А учитывая что в треде даже винапи никто осилить не может (все пукают в консольку), какие там несы/плейстэйшены, окстись.
Собственно вопрос: почему??? ни на этапе компиляции ни на выполнении нет ошибки?
Везде const же!
> и в массиве отсутствует указатель
Зачем ему там быть?
> Виртуальная позиция в памяти. Что это?
Чтобы прочитать символ, процессору нужно выставить на адресную шину адрес. Этот адрес нужно вычислить. Под позицией/перемещениями в том 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), там почти все вычистили к шестой версии, но если покопаться, можно пару десятков мест найти.
#if defined(_WIN32) || defined (_WIN64)
#define ...
#elif defined(__linux__) || defined(__APPLE__)
#define ...
#endif
qsort_r(base, nmemb, size, memcmp, size);
Ладно, допустим тут достанет каста, size_t и указатель обычно соразмерны long, но все таки блджад...
> size_t и указатель обычно соразмерны long
А вот в винде - нет.
> маллокать
По-хорошему - да. Заодно положишь туда же sockaddr, все равно пригодится рано или поздно. А заодно и еще какие-нибудь данные, которые process() стал бы выделять сам.
> Zed A. Shaw "Learn C the Hard Way" (2015): годное пособие для гуманитариев!
А как понять достаточно ли я гуманитарен, чтобы читать это? С программированием знаком был поверхностно с С++ в 9 классе, тогда форк лазаруса от борланда у нас на компах ставили и мы в них всякие программки писали. Немного умею в линукс. Люблю математику и физику, за всю школьную жизнь 11 классов, сейчас в 12-ом ни одной тройки.
Достаточно ли этого, чтобы я мог называть себя технарём?
> А как понять достаточно ли я гуманитарен, чтобы мне нужно было читать это вместо первых двух книг?
Фикс
Здравая мысль, однако. Но что делать в случае с тем же qsort_r? Этот void ∗ так и просится третьим аргументом memcmp. Вот ни разу не прикольно писать какие-то обертки, чтоб не выходить за рамки предназначения типов. Там же void ∗ крайним параметром задекларировали для максимальной универсальности, но никак не для того, чтоб я пил кофе из графина. Интересно узнать, насколько дурной тон подобные шорткаты? Сильно обоссывают за такое?
Алсо, насколько я понимаю, с float/double подобные не прокатит, потому что вызывающий код сложит в RCX/RDX/R8/R9 ничего не подозревающий обработчик будет искать в XMM0/1/2/3. СУКАНАХУЙБЛЯДЬ
Благодарю от души, теперь всё понятно. Если бы еще та писанина была написана подобным образом.
Потупил глядя на код, а потом решил проверить и точно, просто массив и адрес массива (в коде offset a) это одно и то же. Ну и дыркозатыкатели, млин.
Заодно исчезнет куча вопросов типа "Что же мне запилить на ЭТОМ язык программирования" и "Почему мне запилить ЭТО именно на ЭТОМ языке"?
В СИ это как минимум микроконтроллеры и прыщи.
Нет, это файловые дескрипторы (неужели никогда не слышал, что в *nix все есть файл?), по умолчанию они связаны с терминалом. При желании ты можешь заставить шелл использовать вместо терминала реальные файлы, примерно так: myprogram < stdin.txt > stdout.txt 2> stderr.txt
Про linux не знаю, в шинде это хэндлы файловых объектов в ядре, эти объекты ссылаются на объекты устройств, с объектами устройств связаны драйверы. Когда прога читает/пишет драйверы получают соответствующие запросы. Что конкретно они с этими запросами делают зависит от конкретного места записи/чтения.
Если это консоль, драйвер консоли перенаправит запрос соответствующему процессу консоли и вернет ответ. Если это реальный файл, запрос пройдет по всему стеку драйверов от файловой системы до диска. Ну короче ты понял.
Книжку писал юниксоид, там всё - файлы. В винде так не принято, да и тут написано же "стандартные потоки ввода/вывода" консоли.
На самом деле это устаревшая ерунда, ведь если программа с WinMain никаких консолей не создается. Если надо, можно создать консоль вручную или прицепить чужую.
В винде хэндлы принципиально ничем не отличаются. GetStdHandle(STD_OUTPUT_HANDLE) - точно такой же "файл", в который можно писать с помощью WriteFile.
> это устаревшая ерунда
Виндой мир не ограничивается.
Вы видите копию треда, сохраненную 18 ноября 2019 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.