Тред, посвященный прародителю всех С-подобных языков и по совместительству единственному идеальному и всесторонне годному средству программирования как на системном, так и на прикладном уровне.Пожалуйста, пользуйтесь https://ideone.com/ или http://pastebin.com/ для вставки кода, если он длиной больше нескольких строк или содержит [i] или ∗.Что читать:- Классика от Отцов: http://www.cypress.com/file/56651/download- Годное пособие для гуманитариев: http://c.learncodethehardway.org/book/- Немного примеров хорошего стиля: http://www.oualline.com/books.free/style/index.html- ООП, например: http://www.cs.rit.edu/%7Eats/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 умеет компилировать код в память и запускать его, что позволяет писать скрипты прямо на сишечке.Что еще почитать:Stephen Prata "C Primer Plus, 6th Edition" (2014)Свежая знает про C89, C99, C11, описывает различия, объемная около тысячи страниц, годная хотя есть некоторые шероховатости, с вопросами, упражнениями и ответами. Читать после K&R или до.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://www.iso-9899.info/wiki/Books#Learning_CОнлайн-утилиты:- https://godbolt.org/ - Compiler Explorer позволяет посмотреть выхлоп компиляторов для введенного куска кода (больше полусотни разных версий компиляторов).- http://cdecl.org/ - С Gibberish ↔ English помогает читать сложные сишные декларации.Прошлые треды:- №20: https://arhivach.org/thread/254158/- №21: https://arhivach.org/thread/260316/- №22: https://arhivach.org/thread/262491/Шапка: http://piratepad.net/bJ1SdmkZyu
Первохуй.
>>1019702> Зачем нужны указатели на указатели и даже о, ужас, указатели на указатели на указатели и дальше по глубине?Тройные используются редко, обычно на этом этапе уже появляются дополнительные данные, и возникают мысли о структурках. А двойные очень часто нужны. Допустим, есть у нас текстовый буфер, и мы его парсим. Можно передавать стейт (в структурке), но это часто избыточно, поэтому функции дают указатель на текущую позицию в буфере. Но как узнать, сколько данных обработала функция? Можно вернуть новый указатель. Но если нужно вернуть что-то еще, то разумно передавать указатель на указатель на текущую позицию, и обновлять его содержимое перед возвратом из функции. Или, например, при манипуляциях связанным списком может понадобиться вставить узел в самое начало - можно возвращать новое начало списка, а можно передавать указатель на переменную, которая хранит начало списка и модифицировать его.
А тип памяти register это пережиток прошлого, так же как и кнопочка Turbo на системниках?
Как программировать на Си без использования оперативной памяти?
>>1020421куришь дескрипторы и работу с файлами. Своп юзаешь вместо оперативы, но код так или иначе будет храниться в оперативке: загружаться и выгружаться в неё. Хотя при должном скиле, можно вообще свести использование оперативы к минимуму.
>>1020424Я больше о регистрах и процессорном кеше.
>>1020357С register получается такая же автоматическая переменная, как и другие. Это не "тип памяти", это просто хинт компилятору плюс ограничения на использование. Но на этот хинт большинство компиляторов не обращают никакого внимания.>>1020421Никак. Единственное, что стоит сделать, выполняясь из кэша - инициализировать DRAM. И делают это обычно на ассемблере.
>>1019934 (OP)Ананасы, как думаете, что лучше делать с зомби процессами в POSIX? Мне нужно запустить процесс, подождать пока он завершится, получить код выхода. Ждать долго нельзя, есть максимальный таймаут. Если таймаут прошел (очень редкий, но возможный случай), нужно ругнуться. И дальше 2 варианта: 1) забить на процесс, и он будет себе болтаться как зомби когда все-таки завершится 2) принудительно SIGKILL-нуть и тут же вызвать waitpid (надежно, но больно если процесс таки собирался выполнить своё дело). В общем вопрос: приемлемо ли оставлять зомби или нужно обязательно их избегать?
>>1020535>Но на этот хинт большинство компиляторов не обращают никакого внимания.Очень даже обращают если свободные регистры закончились.
>>1020648> Очень даже обращают если свободные регистры закончились.Ты, видимо, не понял. Современные оптимизирующие компиляторы срать хотели на register (как и на inline, который тоже хинт), они сами решают, как им будет оптимальнее распределить регистры или инлайнить функции. Если переменной пользуются редко, никто ее в регистр не положит, несмотря на register. Справедливости ради, в embedded все не совсем так, и там есть компиляторы, которые если уж не подчиняются, то хотя бы прислушиваются.
Собираюсь использовать Clion + mingw-w64 на винде, какие подводные?
>>1019934 (OP)Собираюсь использовать Clion + mingw-w64 на винде, какие подводные?
>>1020754Зачем ебать вола?
>>1020693не пользовал register, но инлайнил активно с arm-none-eabi-gcc, ну так там прост ключиков полно для управления процессом, в т.ч. "инлайнить все что с атрибутом inline" (по умолчанию отключено)
>>1020756А что тут такого?
>>1020760Да ничего, просто у тебя наверняка не соберется какой-нибудь ncurses и ты часами будешь сидеть и чинить это говно.Не проще накатить линукс виртуалкой или дуалбутом?
>>1020763>не соберется какой-нибудь ncursesПочему не соберется?
>>1020763Проще сразу пересесть или хотябы чрутом.
>>1020765Потому-что на венде гцц это порт.
>>1020767>на венде гцц это портПоэтому ncurses не соберется?
>>1020774Ну порт он бывает баганным (коим и является). Есть некоторая вероятность, что не соберётся приложение.
>>1020779Ну а MSVC не поддерживает C99 и C11, а также не полностью поддерживает C++98 (sic!), про это анон писал в прошлом крестотреде.
>>1020791Проиграл. А что на этот счёт говорят некрософт?
>>1020779давно mingw щупал? там сейчас все охуенно, по крайней мере я из-под линукса весьма большие и разнообразные ехе-шники собираю, никаких проблеи
>>1020809ну хз. Обычно порты убогие.
>>1020797Пишут, что стараются реализовывать стандарт как можно быстрее.Но стандарты С99 и С11 реализовывать не стали вообще.С++11 они смогли полностью реализовать спустя 5 лет после выхода этого стандарта, С++14 реализован еще не полностью, С++17, видимо, ждет участь С++11.
>>1020811>Обычно порты убогие.Там хотя бы заявлена реализация стандарта и она действительно есть.Можно, конечно, пользоваться msvc в котором не осилили до сих пор С++98, зато не порт, да.
>>1019934 (OP)cап, кто нибудь сейчас пишет вирусы на си?
>>1020791ни разу не видел c11 ни в продакшне, ни в опенсурсе
>>1020881нет, их пишут на джаваскрипте и бейсике
>>1020893на жс вроде страницы веб делают?
>>1020791> не полностью поддерживает C++98 (sic!), про это анон писал в прошлом крестотреде.Ха-ха-ха-ха. Я вижу, пример с некорректной работой two-phase name lookup в шаблонах тут хорошо запомнили. (Я его с cppquiz взял, если что.)Подкину вам ещё одну несовместимость. Как известно, есть такой (ненужный) тип, как wchar_t (typedef в C и самостоятельный тип в C++). Стандарт говорит, что одним wchar_t должны кодироваться все возможные символы из расширенного набора символов, поддерживаемых платформой. Не будем сейчас начинать буквоедствовать о том, что такое символ. Я прекрасно знаю обо всех этих графемных кластерах. Стандарт, скорее всего, имеет в виду code points. Как известно, в Windows wchar_t имеет размер в 2 байта. Но используется для кодирования UTF-16, в которой, как известно, code point может состоять как из одного code unit (двух байт), так и из двух code unit (четырёх байт) (суррогатные пары, или как там это называется). В MSVC заявлена поддержка расширенного набора символов UTF-16, но вот беда, в один wchar_t символ из этого набора может и не влезть!Короче, если даже проблему с two-phase name lookup исправят (недавно появились со стороны MS какие-то вялые движения в сторону более строгой совместимости со стандартом), то несовместимость wchar_t не исправят НИКОГДА!!!!!! НИКОГДА, БЛЯДЬ!!!!!! СЛЫШИТЕ? ПОТОМУ ЧТО ЭТО СРАЗУ ОТПРАВИТ НАХУЙ НА ПОМОЙКУ ВСЕ КВАДРИЛЛИОНЫ СТРОК КОДА ПОД СПЕРМУ, В КОТОРОМ ЭТОТ WCHAR_T ИСПОЛЬЗУЕТСЯ ВОВСЮ.Так что, если какая-то спермоблядь вдруг закукарекает из-под шконки что-то про "лучшесть" MSVC, то всегда будет пункт стандарта, в который спермоблядь можно будет ткнуть носом и спросить: а с совместимостью со стандартом у вашего MSVC как?
>>1020779> Ну порт он бывает баганным (коим и является).Если ncurses не соберется - виноват ncurses. Еще ни разу не слышал про серьезные баги гцц под виндой. Ну разве что веселье с _wWinMain есть и отсутствие -fsanitize (последнее печалит).>>1020791> Ну а MSVC не поддерживает C99 и C11Все, что тебе может потребоваться для сборки сурса на C11 в Visual Studio есть.>>1020921> Как известно, в Windows wchar_t имеет размер в 2 байтаА на линуксе? Сходи посмотри и нам напиши. Я не помню, что точно говорит стандарт про wchar_t (не пользуюсь по очевидным причинам), но вот в char вполне хранится UTF-8, и стандарт об этом знает (u8 string literals), и да, в UTF-8 кодируются все символы юникода, просто не всегда в один.
>>1020965Сходил посмотрел. В стандарте в 6.4.4.4 черным по белом написано implementation defined, т.е., компилятор имеет полное право использовать суррогатные пары и хранить их в нескольких wchar_t.
>>1020965>А на линуксе? Сходи посмотри и нам напиши.Эка тебя порвало.> Я не помню, что точно говорит стандарт про wchar_tА я тебе сейчас напомню, блядьhttp://eel.is/c++draft/basic.fundamental#5Type wchar_t is a distinct type whose values can represent distinct codes for all members of the largest extended character set specified among the supported locales.Ясным по белому написано, что ALL members (а не some members) и не какой-то extended character set, а LARGEST. Среди всех поддерживаемых локалей. Сперма поддерживает, например, локали 12000 и 12001 — UTF-32 LE и BE соответственно. wchar_t не может представить все различные коды, имеющиеся в UTF-32.> в char вполне хранится UTF-8, и стандарт об этом знает Да, стандарт явно пишет, что char должен вмещать UTF-8 code unit, т.е. иметь как минимум 8 бит. Он не требует вмещать весь юникод в один char.> u8 string literalsПро строки не написано, написано про 1 wchar_t.>>1020965> В стандарте в 6.4.4.4 черным по белом написано implementation definedДа, размер у wchar_t implementation defined. Достаточный, для выполнения условия выше. Implementation defined-размер не отменяет его.> компилятор имеет полное право использовать суррогатные пары и хранить их в нескольких wchar_tПо стандарту — нет.
>>1020974> can represent distinct codes for all members of the largest extended character setОк, убедил почти: осталось доказать что отдельные части суррогатной пары не являются character с точки зрения стандарта (это будет непросто). И осталось принести пруфы, что не винда, а именно Visual Studio поддерживает указанные тобой локали. Причем именно их, а не UCS-16.Алсо, никто не мешает майкрософту увеличить размер wchar_t (хотя бы и с ключиком, или наоборот оставив -fshort-wchar для совместимости, как в GCC). Они этого не сделают, потому что у них апи в UTF-16, а лишние преобразования внутри библиотечных функций замедлят код абслолютно безо всякого профита. Правильно написанный код не сломается. Алсо, с выходом C11 все нормальные люди пересаживаются на char32_t, ибо wchar_t - это официально хуй знает что, не обязательно юникод. Еще более нормальные люди в рот ебали wchar_t, потому что UTF-8 вполне достаточно в большинстве случаев. Но это так, к слову.
>>1020987>осталось доказать что отдельные части суррогатной пары не являются character с точки зрения стандарта> это будет непростоЭто будет не просто, а ОЧЕНЬ простоhttp://www.unicode.org/faq/basic_q.html#11Loose surrogates have no meaning.> И осталось принести пруфы, что не винда, а именно Visual Studio поддерживает указанные тобой локали. Причем именно их, а не UCS-16.Это уже схоластика в попытке спасти трескающийся шаблон. Так можно договориться до того, что компилятор собирает приложения под студию, а не под Windows.С помощью вызова std::locale или ещё как можно запросить локаль с кодировкой UTF-8 или -16 или -32? Если можно, то execution environment поддерживает эти локали. Компилятор может не поддерживать сорцы ни в чём, кроме кодировки, кодирующей базовый набор символов. Он может не поддерживать кодирование всех возможных значений wchar_t или u8-строк литералами. Это нигде и никак не запрещает в рантайме выставлять локали с другим набором символов и читать/писать юникод или ещё что.> Алсо, с выходом C11 все нормальные люди пересаживаются на char32_t, ибо wchar_t - это официально хуй знает что, не обязательно юникод. Еще более нормальные люди в рот ебали wchar_t, потому что UTF-8 вполне достаточно в большинстве случаев. Но это так, к слову.С этим я полностью согласен. Я же написал, что "есть такой (ненужный) тип, как wchar_t".Но если ты его не будешь использовать, это не отменит факта несовместимости MSVC со стандартом в этом пункте.
Чёт я задумался. Стоит ли продолжать метать бисер?
>>1020991> в попытке спасти трескающийся шаблонНу я же согласился, что в целом ты прав.> Loose surrogates have no meaningЮникодовый консорциум много чего говорит. Они вон говорили, что 65к символов достаточно всем, собственно этим и создав обсуждаемую нами проблему, а завтра у них эмодзи с зелеными гомосексуальными неграми-трансвеститами не влезут, и они опять что-нибудь придумают. Но мы-то не про Unicode, мы про сишные стандарты. И вот там определение character настолько расплывчатое, насколько это возможно.> можно запросить локаль с кодировкой UTF-8 или -16 или -32? Если можно, то execution environment поддерживает эти локали.Можно сделать memcopy(&foo, &foo, sizeof(foo)), и это скомпилируется и даже будет работать скорее всего. Но будет ли правильным так делать? Идентификаторы локали - implementation defined, и очевидно, что если в документации явно не написано, значит все на твоей совести.> так можно договориться до того, что компилятор собирает приложения под студиюВ данном случае компилятор собирает приложения под процессорную архитектуру, а Windows начинается где-то в линкере. Проблема размера wchar_t на стороне компилятора - это всего лишь проблема размера и содержимого литералов с префиксом L. Не более. Никто не заставляет линковаться с MSVC-шной стандартной либой, которая ожидает 16-битный wchar_t. Никто ничего не говорит про Windows вообще: можно линковать объектники в ELF или, прости господи, Mach-O, хотя, конечно, никто таким извращением заниматься не будет. Я давным давно, еще в шестой студии писал под MenuetOS, мне было норм.>>1020994> Стоит ли продолжать метать бисерНу мы уже высказали все доводы, убедили меня полистать стандарт насчет extended character sets, достаточно засрали тред, убедились, что студия нинужна, и что Microsoft изменит размер wchar_t не раньше, чем появится вариант стандартной библиотеки с UTF-8 в качестве execution character set (обещают последние пару лет).
>>1021000>Но мы-то не про Unicode, мы про сишные стандарты. И вот там определение character настолько расплывчатое, насколько это возможно.Т.е. ты хочешь от меня чтоб я показал в стандарте C или C++ определения того, что является Character в любой существующей в мире кодировке? А ничего что, на минуточку, это стандарт C[++], а у кодировок свои стандарты? Лол.Стандарт говорит о том, что должны быть представимы символы из кодировки локали. Что есть символы — определяется, естественно, кодировкой, а не стандартом C[++].>>1021000>В данном случае компилятор собирает приложения под процессорную архитектуру, а Windows начинается где-то в линкере.Читай про hosted/freestanding environment. http://eel.is/c++draft/intro.compliance#7 Стандартная библиотека (в особенности) и даже наличие ОС (про которую стандарт говорит may и ничего специального от неё не требует, кроме поддержки стандарта, но в общем если она есть — она есть) ожидаются в наличии в hosted-окружении. Наличие фич стандартной библиотеки и их поведение регулируется стандартом. Так что твой абсолютистский минимализм> а Windows начинается где-то в линкереничем не подкреплён. (кроме юношеского максимализма).> Проблема размера wchar_t на стороне компилятора - это всего лишьЯ выше привёл требование к wchar_t. К чему эти переливания из пустого в порожнее? "Если бы ELF, да кабы Mach-O."Если wchar_t удовлетворяет стандарту в данном hosted-окружении, то он удовлетворяет. Если нет — нет.> убедились, что студия нинужнаЯ такого не говорил. Вообще я не собираюсь кого-то убеждать или разубеждать. Я тут просто привёл ещё один примерчик несоответствия стандарту. Вряд ли кому-то это помешает пользоваться студией.
>>1019934 (OP)Поясните по хардкору, почему символ указателя "*" лепят то к спецификатору типа, то к названию переменной или функции? Это дебильные художества за которые надо в руки насрать, или это классика, это знать надо разные вещи?
>>1021075>Это дебильные художестваThis.
>>1020965> Если ncurses не соберется - виноват ncursesСолипсизм уровня windows
>>1020921>НИКОГДА!!!!!! НИКОГДА, БЛЯДЬ!!!!!! СЛЫШИТЕ? ПОТОМУ ЧТО ЭТО СРАЗУ ОТПРАВИТ НАХУЙ НА ПОМОЙКУ ВСЕ КВАДРИЛЛИОНЫ СТРОК КОДА ПОД СПЕРМУ, В КОТОРОМ ЭТОТ WCHAR_T ИСПОЛЬЗУЕТСЯ ВОВСЮ>Этот самоподрыв пидорахи
>>1021075> или это классика, это знать надо разные вещи?Haдо лепить их исключительно к имени переменной, потому что оно так работает.
>>1020991Хуесосы, кроме ASCII ничего не нужно.
>>1021094>хрю-хрю-хрюЧто, простите?
Сначала вкатиться в си, а потом в кресты, или наоборот?
>>1021303Сначала в си, а потом во что угодно, но не в ц++
>>1021350Почему? Во многих вакансиях требуют знание как С, так и С++.
>>1021353если для работы, то можно.
Блин, смотрю на книги и не понимаю с чего начать:Параллельное программирование с использованием OpenMP;Advanced Programming in the UNIX EnvironmentAdvanced Bash Scripting Guide, но это же тоже надо для UNIX'а Не понимаю, с чего начать. APUE даст знания по целевой ОС, OpenMP даст знания по многопокпоку, на который дрочу.В самой книге по OpenMP про UNIX'ы ничего нет, там какие-то мокрые письки в качестве компиляторов рассматриваются, благо руководства по GCC и OpenMP можно найти в интернете.С чего бы ты начал, анон? С понимания ОС или конкретного стандарта языка?
>>1021446да
>>1021462Но почему?
>>1021446>>В самой книге по OpenMP про UNIX'ы нСмотри со своими многопотоками не обосрись. Большинство задач быстрее выполнятся в одном потоке. Многопоток это огромный оверхед на создание потоков, имеет смысл только если без этого программа заметно быстрее.
>>1021627В любых программах для научных вычислений актуально, любителям синглтхреада пора руки ломать, имхо
>>1021627Хотя, может, ты и прав.Просто почитать APUE, там посмотреть про межпроцессные взаимодействия и pthreads заодно.
>>1021628Если что-то вроде физики, рендеринга, нейроночек то разумеется это многопоточные вычисления по своей природе.Но можно говна наделать когда пытаешься сделать простые вещи паралельными, потому что по природе они последовательны.
>>1021086#include <conio.h>@НИСОБИРАЕТСЯ ПОД ЛИНУКСОМ@ВИНОВАТ КОМПИЛЯТОР>>1021627> Многопоток это огромный оверхед на создание потоковИменно поэтому при нормальных многопоточных вычислениях потоки чаще всего создаются однажды, кладутся в пул и выполняют задачи, ну ты пони. Или если много IO, то создаются однажды и выполняют каждый свою задачу (или не выполняют, ожидая этого самого IO).
>>1021698>#include <conio.h>>@>НИСОБИРАЕТСЯ ПОД ЛИНУКСОМ>@>ВИНОВАТ КОМПИЛЯТОРестественно. компилятор visual studio может собрать conio.h, а vim не может.
Правильно ли я понимаю, что на Си мне лучше писать что-то низкоуровневое (работа с периферией, памятью, быстрая числодробилка), а основной код лучше реализовывать через вызовы Си библиотек в более высокоуровневых языках?
>1021075>Haдо лепить их исключительно к имени переменной, потому что оно так работает.Если только это не приведение типов
>>1021776Первое - да. Второе - не лучшая идея. В высокоуровневых языках уже есть аналоги всех функций.
>>1019934 (OP)Анонасы помогите новичку, есть куча-же книг по программированию и видео курсы. Подскажите, где рассказывается как юзать не стандартные библиотеки API в программах? Например всякие arpa/inet.h winsock.h sys/socket.h sasl.h
>>1021794man
>>1021794>winsock.h>видео курсы>cПошел нахуй
winsock победный носок
Хуль указателей нет в том же джаваскрипте?
>>1022064Потому-что ц для низкоуровневых програм, а жс для анимаций кнопок.
>>1022064Они есть.
>>1022064В жс есть ссылки, то есть те же указатели, только всегда гарантированно валидные (или не валидные, и тогда это серьезный баг в движке JS, за который можно срубить бабла).
Обнаружил, что в С99 были массивы переменной длины, которые в С11 зачем-то убрали?Как на них можно взглянуть?
И да, почему в литературе почти нигде не упоминается про стандарт С95? Хоть он и был расширением к основному в то время стандарту - С89/С90, почему он не заслуживает упоминания?
>>1022188> взглянуть-std=c99 ?А убрали, потому что говно, грозящее переполнением стека и сегфолтами на ровном месте, ну и потому что не приняли в крестах.>>1022189Так дополнение же. Никаких киллер-фич по сравнению с C99/11 нет, синтаксис вообще не затронут, только мелкие уточнения и wchar.
>>1022205>Так дополнение же.C++03, несмотря на то, что он тоже дополнение к C++98, упоминается довольно часто.
бамп
Как прочитать прату (1000 страниц) и не сойти с ума?
>>102225403 плюсы это вообще один большой багфикс, а не дополнение даже. Просто этот багфикс в отличие от диграфов и ещё какой-то непонятной хунты оказался кому-то нужен и зашёл.
>>1024175По частям. Хотя если раньше ты никаких книг в руках не держал, то проблему никак кроме как анальной болью не решить.Если не нюфаг — смотри только то что нужно. Если таки нюфаг — возьми книжку потоньше, благо C небольшой.
>>1024185>По частям.Вроде как читаешь по частям, а все равно что-нибудь упускаешь.>возьми книжку потоньшеКакую?
>>1024175> Как прочитать прату (1000 страниц) и не сойти с ума? Разбить на месяц, а лучше два. Вдумчиво читать каждый день понемногу. Стараться понять суть, логику происходящего, а не тратить время на заучивание правил и кейвордов. Обязательно писать хелловорлды на каждую новую для тебя вещь. Собственно, так со всеми книгами, если тебе нужно разобраться, а не ознакомиться.
>>1019934 (OP)Вопрос треду, на сколько живой С в современных реалиях , учу этот ЯП и дико доставляет , но сейчас появляется куча "модных" ЯП не вытеснят ли они С?
>>1024307>появляется куча "модных" ЯПКаких? Приведи примеры.>не вытеснят ли они С?Си в основном и полностью живет в программировании микроконтроллеров и в системном программировании. Учитывая, что почти весь код написан на Си, то он еще будет жить очень долго, но в специальных местах, как и любой другой язык.
>>1024236Просто когда я читаю, то понимаю, что все это уже знаю (был небольшой опыт на С# и C++) и чтение становится очень нудным.
>>1024314>понимаю, что все это уже знаюНе делай так больше.
>>1024323Ну вроде как я читаю, но мне это все знакомо.Просто нудно читать все это пока не дойдешь до последних глав, где будет новый и интересный материал
>>1024313всякие Go Scala
>>1024375На го и scala пишут вебсервисы, причем если го еще компилируемый, то скала работает на джава машине.А на си программируют драйвера и микроконтроллеры.
>>1024378>на си программируют драйвера и Спасибо анон , то есть если вкатываться в глубь С и математику , то без работы не останешься?
>>1024389> то без работы не останешься?Весь Linux и ядро Windows на Си. А ты подумОй.+ embbed почти целиком на Си. Да даже обычные программы часто на Си пишут.
>>1024392> ядро WindowsProofs?
>>1024389>без работы не останешьсяЯ тебя разочарую.Если живешь в россии, то как раз таки есть высокий риск остаться без работы, потому что вакансий на С/С++ мало и они в основном в оборонной промышленности.Если хочешь работу, то иди в жс/пеашпи тред и вкатывайся. Сайты нужны всем и в большом количестве, а микроконтроллеры/драйверы - нет.
>>1024392Только если ты живешь за рубежом.
>>1024392>обычные программы часто на Си пишутОбычные программы сейчас пишут в ентерпрайзе, где очень популярны джава и сишарп
>>1024393Хуювс. А начем по твоему ядро Windows могли написать? на ГОВНЕ С++? лол. Вот тебе самый простой пруф - посмотри на функции Winapi и как они реализованы. Чистый Си код. P.sНасчет С++ http://eax.me/c-vs-cpp/согласен не со всеми аргументами но с большинством
>>1024396сайты не интересуют и всем нутром их ненавижу, буду учить и постараюсь стать крутым программистом С
>>1019934 (OP)Чо такое стандартная библиотека си, точнее как она реализована? Можно ли ебашить на си под чистое железо без ничего? Оно в асм чтоле компилируется и всё?
>>1024525> как она реализованаКак хедер.> Оно в асм чтоле компилируется и всёС ключом -S у жцц в асм
>>1024526>Как хедер.Нет. Определения функций в скомпилированных библиотеках, а объявления в хедерах.
>>1024307Даже если все перекатятся на "модные" языки, сишечка все равно - этакий английский от айти. Нужно хотя бы уметь ее читать. Вторым таким языком понемногу становится питон.>>1024392> embbed почти целиком на СиЕсли под архитектуру есть гцц, то нередко на "Си с классами".>>1024525> Можно ли ебашить на си под чистое железо без ничего?Можно, но обычно некоторое количество асма все равно нужно (грубо говоря, лоадер, чтобы минимальный набор железа инициализировать, загрузить код с какого-нибудь флеша, инициализировать проц, прерывания, стек и т. д.).
>>1024552>этакий английскийанглийский это скорее плюсы, когда нормальный франко язык был деградирован уебанами
Как можно реализовать подобие шаблонов в крестах?
>>1025010> Как можно реализовать подобие шаблонов в крестах?Только макросами.
>>1025034Где про это можно почитать?
>>1025036Делаешь что-нибудь вроде #define TYPE int, инклудишь какой-нибудь foo.с, в котором вместо нужного типа TYPE, после инклуда делаешь #undef TYPE int. Потом можно использовать _Generic для автоматического выбора нужной функции в зависимости от типа. Но лучше так не делай. Если жизненно необходимы шаблоны - используй кресты.
>>1025130> #undef TYPE intПросто #undef TYPE конечно же.
Какую IDE прикрутить к mingw?
Когда уже полностью портируют llvm-гомосятину на винду?Заебался использовать сlang вместе с уебищным mingw или msvc.
>>1024398Активных контрибуторов всяких линупс-кернелов и всего похожего заграницей с руками отрывают, на самом деле. Так что вполне себе даже вариант для съеба.
>>1025344>Когда уже полностью портируют llvm на гомовинду?ftfy
>>1024389> если вкатываться в глубь С и математику , то без работы не останешься?В РФ работы мало и она оплачивается хуже, чем какая-нибудь Java.мимо 7 лет системного программирования
>>1025355Вау , расскажи чем занимался что входило в твои обязанности ?
Пишу PE-загрузчик. Как в этом уебищном языке хранить адреса: как void* или DWORD, чтобы избежать преобразований типов которых на асме не возникло бы?
>>1025216Notepad++ + NppExec
>>1025382>NppExecТам дебаггера нет
>>1025355да, дакоротко и яснотолько тебя не будут слушать, прямо сейчас дурачки штудируют сишечку и прочую системщину
>>1025348nop(хоть один пример приведи)
>>1020646>принудительно SIGKILL-нуть и тут же вызвать waitpidSIGTERM + waitpid.SIGTERM должен корректно обработаться в дочернем процессе.Ну либо IPC прикручивай и следи за стейтом.
>>1024389>Спасибо анон , то есть если вкатываться в глубь С и математику , то без работы не останешься? Если middle/senior, то не останешься. Оплачивается тоже ничего, мне 200к в ДС предлагали, например, за матан и C, только не мой профиль там.Вот нормальное место найти, чтобы до соответствующего левела дорасти - это может быть проблемой.
Расскажите, как программируют на Си под голое железо?Вот допустим я хочу вывести хеловорлд на си, но у меня нет ничего, кроме UEFI/BIOS. Что делают в этом случае?
>>1025938Накатывают Linux.
>>1025938Ну ты берешь и реализуешь стандартную библиотеку. Например, printf с помощью int 0x10 или прямой записью в видеопамять. Или реализуешь какую-нибудь прослойку, на которой реализуешь printf. И так для каждой использованной функции.
>>1026009>printf с помощью int 0x10Это на старых биосах, а на EFI?>прямая запись в видеопамятьЭто надо драйвера писать? Или что надо сделать, чтобы в видеопамять писать и выводить на экран?
>>1026053> EFIПредоставляет соответствующие сервисы. Погугли EFI hello world.> Это надо драйвера писать?Нет, просто писать в нужное место видеопамяти. http://wiki.osdev.org/Printing_To_Screen
Парни, а почему иногда MSVS пропускает gets_s()? Очень рандомно, и очень бесит. Имеется в виду, что во время выполнения тупо проскакивает эту функцию. В MinGW этой проблемы не наблюдается.
>>1026242Может у тебя остается символ новой строки в буфере? Типа scanf("%d", &n); fgets(buffer, sizeof(buffer), stdin), и ты такой вводишь число, нажимаешь Enter, и gets у тебя получает только символ новой строки. Проверь, что возвращает, и что кладет в буфер.> _sНе используй это говно.
>>1026245Через fflush же очищается буфер? Я его для stdin перед вызовом ставлю, результат тот-же.
>>1026246fflush(stdin) - undefined behavior. Осознай и живи с этим.
>>1026254Ну и нахуй так жить?
Есть один даун (я), и я прошу помощи.Кровь из носу нужно использовать функцию MD6. Нагуглив единственную реализацию, я собрал оригинальную прогу - все пашет. Попытался использовать этот код и заголовки - соснул, пишет undefined reference. Так вот, как бы его заюзать-то?https://groups.csail.mit.edu/cis/md6/downloads.html
>>1026535Отредактировать функцию main в файле md6sum.c так, как тебе нужно?
>>1026541Несмотря на всю очевидность, я до этого не догадался. Ну ебана. Хотя я не сказал бы, что это будет удобно использовать, но, видимо, придется.
>>1026535> Попытался использовать этот код и заголовки - соснул, пишет undefined referenceНу очевидно же, что не всё подклчил.
>>1026545Ну, все заголовки, в количестве двух штук я цепанул.
>>1026546А .c файлы в соответствующую директорию перенес?
>>1026548В какую? Все в одной, должно работать. В проект (Code::Blocks) тоже добавил.
>>1026550залей куда-нибудь своё творение, посмотрю
>>1019934 (OP)тест
>>1026553Уже не надо. Вроде как распердолил это дело. Осталось написать нормальную обертку, и будет готово.
>>1026564Заебись. Возникла необходимость собрать это в Студии. А она ругается на повторяюшееся определение, хотя там такого нет и MinGW это съел спокойно. Заебись.
>>1027346Ты блять начнешь уже постить сообщения об ошибках целиком, или ты думаешь, что тут все телепаты?
>>1027475Чем поможет-то, лол?
>>1027478ебать ты даун
>>1027480Это я уже знаю.
>>1027478Дай угадаю, ты определил функцию с именем compression_hook, хотя должен был присвоить указателю compression_hook адрес функции, названной как-нибудь по-другому?
>>1027485Маленькая поправочка - не я, а некий профессор из США. Но что-то такого я там не замечаю. И MinGW это переварил без проблем.Ну и вот собственно все, что по этому в исходниках и заголовках находится
>>1027485Хотя погоди. У тебя же кресты, а кресты тебе не сишечка, там логика другая. Думал, расширение сменил, и норм будет? Короче, сходи в md6.h, напиши там extern перед compression_hook, и еще само объявление скопируй (без extern) куда-нибудь в начало md6_compress.c, вот тогда соберется.Если не будет extern, у тебя будет по переменной на каждый файл, куда инклудится .h, если не воткнешь определение без extern в одном из .cpp, тебя спросят, а гиде собственно переменная. В Си же для деклараций глобальных неинициализированных переменных extern подразумевается автоматически, а если инициализация так и не найдется, линкер создаст переменную вместо тебя.
>>1027491Был бы я Брежневым - расцеловал бы. Спасибо огромное.
Анон, помоги мне, я уже всю голову сломал с этой хренью.Ну что с этим не так.
>>1027502На выходе должны быть рандомные восьмибитные числа. А у меня стабильно вылазит гордая единица. Уже второй день не могу с этим разобраться.
>>1027502Что-то я нихуя не понимаю, особенно про делай после ретурна.Но если подумать, то tmp = 10000000 , а потом 7 раз сдвигается в единицу.Т.е. чтобы было отлично от 1 нужно чтобы if(DO) сработало ещё хотя бы один раз, чтобы оно не значило.
>>1027514DO просто сыпет восьмибитные числа.На выходе "Data" иногда появляется "1".Значит что-то проходит (0b00000001 или 0b10000000).Какого чёрта оно отрубает остальные 7 бит? Вот это я не понимаю.
>>1027502> if (DO) temp |= 0x80;Если в DO (видимо, выходной порт shift-регистра) не ноль, ты ставишь старший бит числа (или не ставишь: если на выходе регистра ноль, у тебя старший бит тоже будет 0). Потом сдвигаешь число вправо и сдвигаешь регистр вправо. Таким образом, повторив цикл 8 раз, ты пишешь в temp бит за битом содержимое регистра. Почему у тебя получается что-то неожиданное - искать тебе. Смотри схему, смотри, откуда в регистре содержимое.> delay после returnНе сработает, не нужен. Разве что выравнивание кода какое.
>>1027529"return" внутрь скобок возвращает?
>>1027527Поставь лог внутри if, и узнай когда он срабатывает.Меня это> DO просто сыпет восьмибитные числа.как-то напрягает. Ведь условие IF(DO) это тоже самое если if(DO !=0 ) Если там не только 0 или 1, то он может слишком часто срабатывать или хз ещё чего.
На чистой сишке в студии 2017 можно уже писать? Хочу обмазаться винапи и чистым си и заебенить какое нить приложение. Как пример беру эту апликуху https://github.com/hfiref0x/WinObjEx64 стоит ли на неё ориентироваться?
>>1027588> На чистой сишке в студии 2017 можно уже писать?Всегда можно было. C11 по большей части есть.> стоит ли на неё ориентироватьсяЧто ты под этим подразумеваешь? Программа норм. Хочешь написать такую же? Незачем. Их и так минимум две, эта лучше.
>>1027594>Всегда можно было. C11 по большей части есть.А почему тогда не вижу что бы было можно делать сишные проекты? Вижу только визуальные плюсы.>Что ты под этим подразумеваешь?Организация логики и кода. Тк сложно представить программу на си и винапи без ооп. Но знаю, что пишут.
>>1027597> А почему тогда не вижуПотому что Microsoft официально забила на Си в юзермоде (хотя ядро у них по-прежнему по большей части на Си). Создавай крестовый проект, сохраняй файлы как .c, и они будут компилироваться именно как Си. Алсо, раньше были ключики /TC и /Tc<filename> (должны были остаться), которые говорят компилятору работать с Си вне зависимости от расширения.
>>1027601Благодарю тебя антош, буду осваивать мир байтоёбства и низкоуровнего погромирования.
>>1027606>низкоуровнего погромирования>clol
Хочу пощупать таблицы экспорта и импорта в PE-файлах. Какой инструмент имеет удобную навигацию по смещениям для этого?
>>1027741Ну вообще достаточно IDA. В каких-нибудь PETools/LordPE есть редакторы и вьюверы разного рода, ну или можешь какой-нибудь CFF Explorer взять.
>>1027502>>1027514>>1027529>>1027537Короче разобрался. Проблемы было две:Сдвиговый регистр не 8 бит, а целых 32! И часть входных данных отсекалась.И ещё с таймингами проблемы, пришлось замедлить MCU и delay`в добавить.Осталось доработать напильником.
Анон, а как бы это сократить?
>>1028321Вынести цикл в отдельную функцию, temp передавать по значению, индекс цикла - по ссылке.
>>1028360Хотя temp тоже по ссылке инб4 в си нет ссылок
Анон, спасай.Для Visual Studio 2017 нужен плагин подсветки SASS.Web Compiler подсвечивает SCSS, а вот за sass очень обидно.В гугле нашел только протухший SassyStudio.
>>1028410> SASS> SCSS
>>1028412>>1028410>SCSS — "диалект" языка SASS. А что такое SASS? SASS это язык похожий на HAML (весьма лаконичный шаблонизатор), но предназначенный для упрощения создания CSS-кода.вот первый раз про эту хуйню услышал, да еще в ситрхеде. смузихлебы уже реально не могут в ксс в нотпаде и придумывают всякую поеботу?
>>1028569Ну CSS без переменных очень неудобен, это да. Хотя тред по сишечке - совсем не место об этом говорить.
>>1028578>Ну CSS без переменных очень неудобени зачем там переменные если операторов нет?
>>1028595а, глянул, вот такая шляпа$font-stack: Helvetica, sans-serif;$primary-color: #333;body { font: 100% $font-stack; color: $primary-color;}ну хз, по мне очередная хипстерская технология, которя нинужна поскольку все там можно разрулить грамотным наследованием
>>1028595Просто веб-макаки тупые, и не могут расположить блоки в правильном порядке. Мне всегда calc() хватало.
Не получается заебенить экзешник в 1кб как тут учат http://eax.me/winapi-dev-environment/На первой проге с изменёнными настройками проекта 1кб, у меня 2кб. На второй проге с меседж боксом у автора 2кб, а у меня 3кб. Откуда берётся этот сраный килобайт? Юзаю visual studio 2017 community edition на семёрке.>>1027588 кун
Ну какого чёрта оно не хочет считать..
>>1027594> Всегда можно было. C11 по большей части есть.Че там, к 2030 году завезут void указатели?
>>1028626Держи, няш.https://vxlab.info/1kb-programm/
>>1028635>temp << 1Что я блеять вижу? А точно, кто-то не знает языка> temp <<= 1;
>>1028723Да, спасибо, разобрался.
Аноны, спасайте.Есть два целых числа, их надо разделить и представить результат в double. Но как бы я не исхитрялся, в результате получается огромное число, не имеющее никакого отношения к реальности. Как это сделать?Код: int a = 5; int b = 2; double res; res = (double) a / (double) b; printf("Result: %d, \n", res);
>>1028867int a = 5;int b = 2;double res;res = (double) a / (double) b;printf("Result: %d, \n", res);
>>1028867%lf у printf вместо %d
>>1028869%lf - это long double. Надо просто %f, а еще лучше %g.
>>1019934 (OP)Всем привет, у меня появилось желание написать 2d образовательную игру на чистом C, чисто как челледж, с пиксельным графоном и тд. Программирую на питошке, С дается очень сложно, вот прямо со скрипом. Во вторых я не понимаю как писать игры без ООП, ну воот до меня что-то не доходит. Есть те кто пытался? Подкиньте литературы, библиотек, поделитесь опытом.
>>1028929long float - double
>>1028944Я недавно на С написал веб-программу. На середине хотел бросить, в конце зарёкся так больше не делать и юзать для этого питон или пхп.
>>1028712Благодарствую! Скажи, а что за makefile такой? Только слышал о нём. Получается работать буду всё же в студии, но билдить/дебажить где то в другом месте?
>>1028944Код дума почитай вдумчиво.
>>1028959Можешь те же самые ключики выставить в настройках проекта студии. Посмотри, там где-то можно было прямо текстом additional switches прописать.Алсо, зачем тебе вообще этот дроч на размер? Я еще понимаю, когда стремятся уместиться в десятки килобайт вместо сотен. Или ты демки делать собрался?
>>1019934 (OP)Тернарный оператор сосет или нет? Что более наглядно?https://ideone.com/41Zcgp
>>1028978На длинных строках сосет. Но тут строка влезает в нормальный монитор даже при наличии IDE с боковой панелью (на ретроградов с вимом и лимитом в 72/80 символов на строку традиционно насрать). Так что в принципе норм и тернарным оператором. Я бы, возможно, сделал ctx->reloc = NULL у нас тут не кресты при создании ctx, и выкинул бы ветку else в твоем коде.А вот ставил бы ты скобки в K&R стиле, тебе не жалко было бы тратить строки, и вопроса не возникло бы.
>>1028970>Можешь те же самые ключики выставить в настройках проекта студии. Посмотри, там где-то можно было прямо текстом additional switches прописать.Уже заметил>Алсо, зачем тебе вообще этот дроч на размер?Вобще всегда хотел попробовать злокодинг из за любопытства. Думал сначала написать кулхацкерский троянвася1337эдишон, ну ты понел, но чёт стало стрёмно да и вредить не хочу, переметнулся на создание читовлюто ненавижу читеров, но щито поделать, вроде там можно относительным злокодингом занятся и не вредить никому, кробе разрабов ест-но.Думал, если размер будет меньше и бинарник как можно "чище" от всего остального, то он будет легче криптоваться/паковаться. Думал в будущем просто криптовать бинарник что бы менять его сигнатуру. Но я наверное дебил, это мои догадки, не знаю где и как про это узнать и уж тем более кого спросить.А вобще вся эта поебень с низкоуровневым программированием аля чистый си и винапи почему то доставляет мне удовольствие. Как будто нахожусь на самом низком уровне в системена дне ебаном.Даже лабы по винапи в институте писал с теми же статьями про экзешники в 1кб "без всего лишнего", отрубал нахер crt и использовал только то, что винда давала, оттого простые консольные лабы превращались в лёгкоетяжёлое садо мазо, ведь консоль нужно создать, в неё писать и закрывать её. Раньше получалось захерачить 1кб бинарник, а теперь, в студии2017 почему то нет.
>>1029020Кстати, напрямую вставлял опции компиля и линкера, ничего не помогло, всё те же 2кб.>>1028970Няша, можешь попробовать у себя сбацать? Может у меня что то не то.
>>1029033> можешь попробовать у себя сбацатьЯ уже попробовал, у меня хелловорлд 1.5 КБ в 32-битном бинаре и 2.5 КБ в 64-битном. Не представляю, как отключить генерацию отладочной датадиректории, которую оно пихает в бинарь даже в релизе и убрать .idata внутрь .text. Собственно, если .idata убить, то будет как раз 512 байтами меньше. Но проще свой линкер написать или какой-нибудь ld/ulink прикрутить, чем ебаться.
>>1029066>Не представляю, как отключить генерацию отладочной датадиректории, которую оно пихает в бинарь даже в релизеА как ты это определил? Через какой то декомпилятор смотрел?А если поставить например студию 2015 и в ней те же манипуляции провести, стоит попробовать?
>>1029086Да любой инструмент показывает: dumpbin /headers, objdump, всевозможные PETools, IDA, глазами в хексредакторе все видно, наконец.> А если поставить например студию 2015Лучше возьми какой-нибудь другой линкер и пропиши его вызов в post-build action. Можешь, например, polink спиздить из Pelles C: polink /FIXED /NODEFAULTLIB /ENTRY:твояфункция /SUBSYSTEM:WINDOWS /MERGE:.data=.text /SECTION:.text,erw foo.obj user32.lib - и сразу килобайт без ебли.
>>1019934 (OP)Господа, я пишу базонезависимый кодес, в котором указатель на структуру, расположенной на стеке, передается в различные функции. Пишу на чистом WinAPI, сами API динамически дергаю при помощи парсинга PEB и таблиц экспорта. Не помешает ли передача указателя сделать кодес базоненависимым, или придется использовать дельта-смещение для доступа к этой структуре?
>>1029095Если у тебя оно на стеке лежит, это уже относительная адресация (относительно фрейма стека). Когда кладешь указатель на структуру в аргументы, будет та же самая относительная адресация, только относительно другого фрейма стека. Btw, что за эпидемия байтоебли итт?
Посоветуйте книжку где учат, как запустить процесс через C pipes отправить ему данные и получить от него данные назад? Желательно в кроссплатформенном виде.
>>1029154Advanced Programming in the UNIX Environment.
>>1029154Если без книг и с С++std::string exec(const char* cmd) { std::array<char, 512> buffer; std::string result; std::shared_ptr<FILE> pipe(popen(cmd, "r"), pclose); if (!pipe) throw std::runtime_error("popen() failed!"); while (!feof(pipe.get())) { if (fgets(buffer.data(), 511, pipe.get()) != NULL) result += buffer.data(); } return result;}В шиндовс pipe заменить на _pipe, pclose на _pclose.
>>1029396> \t Ах ета VS
>>1019934 (OP)Написал минималистичный PE-лоадер и успешно загрузил им хелловорлд на masm32, в котором есть секция релоков. Когда я попытался загрузить этим лоадером многопоточную программу, собранную студией, лоадер рухнул. В этой программе были секции .text, .idata, .tls, .gfids, .00cfg, .rsrc, .reloc. Почему загрузка провалилась? Это из-за TLS и какого-то дерьма в секциях типа .gfids?
>>1029442Вполне возможно, что и из-за TLS.> лоадер рухнулА ты знаешь такую штуку, называется отладчик? Он дает какую-нибудь информацию вместо кофейной гущи и пустых предположений. Алсо если рухнул твой лоадер, то в нем есть ошибки.
LOL https://www.youtube.com/watch?v=XrFegNHpHfc
>>1029454У меня ломка началась от этого видео.
>>1029454У Кэролайн хуевые ASMR получаются. Она гонит сотни одинаковых видео про потирание и нашептывание бинауральному микрофону без всякого разнообразия. Внешне рыжая сучка, понаехавшая из США в Германию, охуенная, но ее ASMR делает мне cringe и становится несмотрительным.
Комрады, нид ёр хелп.Решил вкатиться, и начал штудировать Ричи.И вот стопорнулся на задаче с вертикальными гистограммами.Освежу память:Напишите программу, печатающую гистограммы длин вводимых слов. Гистограмму легкорисовать горизонтальными полосами. Рисование вертикальными полосами — более трудная задача.Попробовал пару идей, и вроде все скомпилировалось и запустилось, но вот незадача:1. Оптимальность. Если слов больше 10к, то программа не будет работать корректно. Если меньше, расходуется лишняя память, пусть и малое её кол-во(всё равно косячно).Посему встаёт вопрос, сколь реально решить оптимально данную задачу со знаниями, которые по учебнику у меня должны быть в данный момент?2. После подачи EOF на getchar ничего не происходит. Не рисуются гисты, ничего. Оставил в коде комменты, чтобы понятней было, на листочку расчерчивал примерные итерации, ошибки по идее нет, но она есть. Ломаю голову уже часов 6, ничего не могу понять. ПОМОГИТЕ!Сам код.https://pastebin.com/0BiKnK4bp.s.Не понял как учитывать ру-символы, 'А'-'Я' не зашло.p.s.s. ОС linux mint 18.1 cinnamon, в си вроде бы есть различия между окнами и unix системами.
>>1029963Ужос.> int mainint main(void).> Оптимальность. Если слов больше 10кНе сохраняй слова. Тебе не нужны слова для построения гистограммы. Тебе нужны длины, вот их и храни. Ограничь максимальную длину слова 64 символами (почти вдвое больше длины supercalifragilisticexpialidocious), все что длиннее - относи к ней.> расходуется лишняя памятьПохуй.> после подачи EOF на getchar ничего не происходитУ тебя внутри цикла еще один цикл с getchar(), и там ты не учитываешь EOF. Подумай, как сделать так, чтобы был ровно один цикл ввода с ровно одним getchar() (подсказка: конечный автомат, у которого два состояния).> Не понял как учитывать ру-символы, 'А'-'Я' не зашло.У тебя ввод в UTF-8, почитай про UTF-8, там русские символы представляются двумя последовательными байтами (а другие символы могут быть закодированы еще длиннее, вплоть до пяти). У тебя есть четыре варианта:1) забить (это простенькая задачка, ебаться не имеет смысла);2) написать свой декодер UTF-8 (не слишком сложно, но наверняка запутает тебя, особенно если с обработкой ошибок делать);3) взять готовую либу (ICU, iconv, utf8proc) и ебаться с юникодом вместо изучения языка;4) представить, что у тебя ввод в Windows-1251, сделать сравнения типа (c >= 0xe0 && c <= 0xff) || (c >= 0xc0 && c <= 0xdf) || c == 0xa8 || c == 0xb8 (строчные, прописные, Ё, ё). С консоли ты Windows-1251 не введешь, конечно, поэтому запускать можно ./a.out < file.txt, где file.txt - файл с русскими символами в кодировке Windows-1251.Лично я советую первый вариант.> в си вроде бы есть различия между окнами и unix системамиЕсть, но не такие большие, чтобы обращать внимание. Не забывай про атрибут "b" у fopen(), не забывай про возможный \r\n (а то и просто \r) вместо \n, не забывай, что названия локалей для setlocale() везде разные, не забывай, что стандартная либа в винде хочет какой-нибудь Windows-1251, а не UTF-8, ну и про Ctrl+D vs. Ctrl+Z в винде ты, наверное, уже знаешь. На более неочевидные вещи ты напорешься сильно потом.
>>1029975>вплоть до пятиЧетырёх
>>1029981Да, ты прав. Но пятью можно кодировать вплоть до 0x7fffffff. Всегда так делаю, срать хотел на консорциум, использую излишки на технические нужды. Ввод извне декодирую по стандарту, естественно.
>>1029982шестью, ну ты понял.
>>1029975Огромное спасибо. Я оказывается дурак, очевидного не увидел. Накостылил, блин.>Похуй.Плохо же?>Не сохраняй слова. Тебе не нужны слова для построения гистограммы. Тебе нужны длины, вот их и храни.Длины вроде бы и сохраняю в массив. А про ограничения не подумал.
>>1029975>>1030022И ещё, забываю спросить. В чём существенные различия стандартов?И нужно ли учить все?Или стоит учить определённый? Но какой?
>>1024333Если знакомо, то отложи книгу и напиши по памяти краткий конь спект. Это покажет, знакомо или у тебя иллюзия знания.
>>1030025> плохо жеПока у тебя используется полсотни килобайт, да еще на стеке, тебе вообще не нужно думать о памяти (но подумать о подходе к подсчету длин слов безусловно стоит). В будущем тебе еще предстоит принимать интересные решения типа лукап 128 метров и пиздец кэшу vs. лютые тормоза на бранчах и пиздец конвейеру - тогда и будешь переживать.> Длины вроде бы и сохраняю в массивЯ код не читал нормально, но ты вроде зачем-то сохраняешь длины каждого слова, тогда как стоило хранить в ячейке массива количество слов с длиной, соответствующей ее индексу (ну или с длиной = индекс + 1, если ты у мамы эстет).> В чём существенные различия стандартов?В C11 выпилили gets() (используй fgets()). В остальном код C89 вполне скомпилится без или с минимальными правками. Разве что не приучайся пользоваться старым способом декларации аргументов функций (когда в скобках пусто и/или аргументы задекларированы между () и телом) и еще неявным int (например, main() { puts("Hello"); } и прочие register foo = 1) - просто считай, что этого говна в языке нет.> Или стоит учить определённый?Новые стандарты по большей части надмножества старых (обратная совместимость, миллионы строк уже написанного сишного кода, вот это все). Прату после K&R прочитай, там есть про C11, на текущий момент это последний, C2x еще не скоро. Под какой стандарт ты будешь писать - зависит от компилятора и работодателя. Кто-то вон до сих пор сидит на C89 и злобно выпиливает из кода случайные "C99измы" (чаще всего это опенсорс с портируемостью головного мозга, ну или embedded, когда компилятор кастомный и древний одновременно).
Из-за чего может получится: Исключение в операции с плавающей точкой (сделан дамп памяти)?c++ // Библиотека SFML // Linux
>>1030037Поделил на ноль например.
>>1028944оставь свое мыло, у меня есть небольшой проект на Си с использованием sdl2
>>1019934 (OP)Изучаю С по пику.Там присутствует задачка по написанию програмки по подсчету карт в блекджеке.Изучается if и switchКраткий алгоритм програмки:1)Проверяем карту. Если король, валет или королева то оцениваем карту в 102) Если туз, то оцениваем в 11.3) Иначе atoi4) Поверка на недопустимый ввод\выход\обнуление счетчика5) Если цена < 10, то уменьшаем счетчик6) Если цена >=10, то увеличиваем.7) Вывод8) Пускаем по кругуОднако, к моему стыду, switch оказывается работать. Вроде по книге все делаю. Не в один в один. Слегка переделал програмку однако все равно - хуй. Хелп, анон.https://pastebin.com/yWfgvyAt
>>1030099>>1029963Вы заебали, форматируйте код нормально. У тебя там break забыт.
>>1019934 (OP)Господа, я пытаюсь загрузить XP-шный calc.exe своим лоадером и получаю сегфолт. Почему-то не грузятся две библиотеки. Почему?Алгоритм загрузки:1) Пробую GetModuleHandleA (вдруг модуль уже загружен)2) Если не загружен, вызываю LoadLibraryA.
>>1030120Зря вопрос задал. Туплю. Библиотеки грузятся, проблема где-то еще. В OllyDbg видно, что дебагер виснет при чтении по какому-то адресу.
>>1030118Но для сурова же Брик не критичен. Он будет просто дальше перебирать условия же.
>>1019934 (OP)Почему при выделении памяти по адресу ImageBase возникает ошибка ERROR_INVALID_ADDRESS и возвращается nullptr?void mem = VirtualAlloc(nullptr /(void)NtHeaders->OptionalHeader.ImageBase/, NtHeaders->OptionalHeader.SizeOfImage, MEM_COMMIT, PAGE_READWRITE);
>>1020965>А на линуксе?4, все символы Юникода помещаются.Винда, ЕМНИП, символы больше 0xFFFF не поддерживает.
>>1024378>то скала работает на джава машинеУже нет, scala native может компилироваться в машинный код.
>>1024525>Можно ли ебашить на си под чистое железо без ничего?А как по-твоему ОС пишут?
>>1024525Для написания ОС нужен Тьюринг-полный язык программирования, который должен уметь управлять памятью и компилятор.
>>1025414Сишку знать надо, даже если пишешь веб-сайты. Чтобы не быть быдлокодером. Ту же Java вообще нельзя изучать до Си.
>>1024525>Чо такое стандартная библиотека си, точнее как она реализована?Библиотека, включающая стандартные функции Си, вроде strlen, printf, malloc, rand и т.д. Обычно сделана в виде динамической библиотеки и входит в состав ОС. В Windows это msvcrt.dll (для старого Visual C++ 6.0) и msvcr.dll (для более поздних версий). В Linux это libc.so. (GNU C Library, написанная лично дедушкой Штульманом, из-за чего он считает, что система должна называться GNU/Linux).В C++ функции из стандартной библиотеки С объединены в пространство имен std.>Можно ли ебашить на си под чистое железо без ничего? Оно в асм чтоле компилируется и всё?По умолчанию компилятор C автоматически прилинковывает эту библиотеку к программе (в хэдерах типа <stdio.h> содержатся лишь прототипы функций). Специальным ключом можно отключить при компиляции эту линковку и писать ядра ОС, загрузчики и другой низкоуровневый софт, не требующий ОС.
>>1030258>msvcrN.dll>libc.so.NВсе время забываю про звездочки в макабе.
>>1030099> char a[3]> char sub[] = a;> switch(sub)a - это указатель (ну то есть, записано как массив трех char, но массивы в аргументах функций неявно преобразуются к указателям на их первый элемент). Ты пытаешься инициализировать им массив sub, тогда как инициализировать этот массив ты можешь только одним или более символом (ну или строковым литералом), но никак не указателем. Потом ты просишь switch сравнить массив с указанными тобой символами. Целый массив. С одним символом. Тогда как switch работает исключительно с целыми числами, и ни про какие массивы знать не знает. Что ты должен сделать: никуда аргумент не присваивать (зачем вообще ты это делаешь?!), взять из него один нужный тебе символ (видимо первый по счету) и уже его матчить switch-ем. Алсо, там у тебя break после return, до него управление не дойдет, выкинь. Алсо, цикл for ты тоже не понял, в 30 строке у тебя нечто странное. Хотел бесконечный? Сделай for (;;) или while (1). Строка 44: точка с запятой после if - явно не то, что ты хотел. Строка 48: несколько выражений между if и else. Пока не выучишь язык, всегда ставь фигурные скобки в теле if/for/do/while (можешь и потом продолжить). И присоединяюсь к >>1030118: выравнивай код! Лень самому, возьми IDE или любой продвинутый редактор (саблайм, npp), там обычно есть автоформатирование одной кнопкой. Можешь еще astyle или clang-format осилить.>>1030121Телепаты по-прежнему в отпуске. Код тащи. Или снапшот из ольки с открытым окном модулей и памяти. Но лучше все же код.>>1030136> Почему при выделении памяти по адресу ImageBase возникает ошибка ERROR_INVALID_ADDRESSЗанято? ImageBase не выравнен по allocation granularity? Алсо, правильно делать MEM_COMMIT | MEM_RESERVE, ведь ты страницы не резервировал.>>1030226> Винда, ЕМНИП, символы больше 0xFFFF не поддерживает. Очень устаревшие сведения времен NT. Да, изначально никто не знал, какую свинью подложат разработчики Unicode, 65к символов достаточно всем, поэтому был UCS-2. С тех пор успели придумать UTF-16, и винда в него научилась. Символы больше 0xffff в UTF-16 представляются теми самыми обсуждаемыми выше суррогатными парами.>>1030259> msvcrN.dllТы забыл статическую линковку. Алсо, с некоторых пор в винде динамически линкуются не к msvcr*, а ко всяким vcruntimeN.dll и прочим API sets типа API-MS-WIN-CRT-STDIO-L1-1-0.DLL (пидоры!).
>>1029090А я могу использовать другой компилятор?Слышал что то про makefile'ы, как я понял они связаны с cmake. Т.е. например, пишу код в студииили в vscode на крайняк, а компилю уже другими средствами, не студию. Это реально?
>>1030369> могу использовать другой компиляторМожешь использовать другой тулчейн (банально сохранил все и сказал make в соседней консольке), можешь как я предлагаю через post-build использовать только внешний линкер (может быть, можно и просто внешний линкер указать вместо стандартного, я в студии не спец): т.е., cl генерит объектники, link линкует из них стандартный .exe, а ты потом берешь эти же объектники и линкуешь каким-нибудь другим линкером скукоженный .exe.> vscodeВообще никаких проблем со сборкой чем угодно. Туториал по настройке прямо на официальном сайте.> Слышал что то про makefile'ы, как я понял они связаны с cmakeНу так потрать десять минут, разберись с синтаксисом мэйкфайлов. Нет, makefile-ы не связаны с cmake. Это cmake связан с makefile-ами. cmake - это генератор makefile-ов под разные тулсеты (в том числе, он, например, может автоматом создать проект для студии).
>>1030373Спасибо тебе за твои ответы, анон, но я не на столько разбираюсь в этом на данный момент.Я не знаю как использовать эти линкеры-хункеры, работаю пока что с тем, что есть.Я думал, раз уж 2017 студия добавляет эти ссаные 512 байт и не дает мне сделать желанный мной экзешник в 1кбещё и изъябываться надо что бы на сишке писать а не наплюсах то стоит попробовать сбилдить через что то другое. Ведь по сути, мне надо указать опции для компиля и линковщика, импорты либкстати, что за либы .lib и почему я должен их импортить? я ведь могу динамически подгружать длл и работать с ними, верно?Но я туговато соображаю, как мне это сделать.Туториал который был в ответах на мой пост предлагает юзать мейкфайл и nmake, но он выдаёт ошибку, говорит там что то не так с синтаксисом, а гугл нихуя не знает.
>>1030373>(в том числе, он, например, может автоматом создать проект для студии). Т.е. через него, я смогу сделать себе шаблон проекта на си и что бы без лишнего для студии?
>>1019934 (OP)Посоветуйте ТУЛЧЕЙН для разработки под STM32 для линукса. Мне нужен тулчейн с дебаггером GDB. Если можно, ссылку тоже киньте.
>>1030383ARM же. GNU ARM + OpenOCD. Оба гуглятся, в каком-нибудь арчике есть прямо в репозиториях, ничего качать не нужно. Надеюсь, STLink у тебя есть.
>>1030392>GNU ARMТам нету gdb.
>>1030393Кому ты пиздишь?
>>1030381> но я не на столько разбираюсь в этом на данный момент> не знаю как использовать эти линкеры-хункерыЯ тебе выше командную строку кидал. Готовую. Всего-то делов - спиздить polink.exe из дистра Pelles C.> что за либы .lib и почему я должен их импортитьТы их не импортируешь, ты с ними линкуешься. А в либах этих лежат куски, из которых с помощью магии и сортировки по алфавиту собирается таблица импортов .exe. Ну это если ты про всякие import libraries типа user32.lib спрашивал.> выдаёт ошибкуГде ошибка? Алсо, если собирать по туториалу тому, будет 3 КБ, а то и больше.>>1030382> что бы без лишнего для студии?Нет. Без разницы, как именно ты будешь вызывать студийный линкер, это он портит всю малину, и он будет ее портить как с ручным вызовом командной строкой, так и через CMake. При этом, с CMake еще и поебаться придется, это такая технология, которая сделана нелюдьми для нелюдей (особенно на винде).
Хелп ми, двач.Или лыжи не едут, или какого хуя в гетчар нельзя засунуть символьную константу?Ругается именно на эту строчку и я просто не понимаю почему
>>1030489Там снизу какая-то хуета, но я ее уже переписал и дело не в ней
>>1030489p кириллическая или ascii?
>>1030489Ругается не на эту строчку, дебил.
>>1030397Нет там нихуя: https://www.archlinux.org/packages/community/x86_64/arm-none-eabi-gcc/usr/bin/arm-none-eabi-c++usr/bin/arm-none-eabi-cppusr/bin/arm-none-eabi-g++usr/bin/arm-none-eabi-gccusr/bin/arm-none-eabi-gcc-7.1.0usr/bin/arm-none-eabi-gcc-arusr/bin/arm-none-eabi-gcc-nmusr/bin/arm-none-eabi-gcc-ranlibusr/bin/arm-none-eabi-gcovusr/bin/arm-none-eabi-gcov-dumpusr/bin/arm-none-eabi-gcov-tool
>>1030909А ты читать умеешь? Какой пакет по твоей ссылке? А вот по этой: https://www.archlinux.org/packages/community/x86_64/arm-none-eabi-gdb/ ?
Решил вкатиться в погроммирование. В приличные конторки не пошел (я не умею программировать, только в алгоритмистику могу), а вот в нии решил тестовое задание и попал на работу. Получил задание, первый день отработал. Насколько я понял, назвать мою (и всего нии) работу "программированием" сложно. Скорее это решение некоторых сложных физических задач численными методами. Программирование занимает лишь часть времени, значительная часть (и не только у меня, но даже у коллеги-доктора) - курение мануалов или разработка нового скорее "подработка старого" численного метода для задачи.Возник вопрос. А эта хуйня вообще кому-то нужна или удел всяких физических нии? Стоит вкатываться или это болотце, единственным вариантом развития в котором является дрочь на научные знания, аспа и статейки в ваковских журналах (я глуповат, вряд ли смогу в статейки)?
>>1030956Добавлю, что плюсов нет. Я сказал, что умею лишь в плюсы (и то посредственно), мне ответили: переучивайся, плюсы ненужное говно.Я думал, ненужное говно С.
>>1030956Рашкинские нии это такой мультиверс полный чудес, каждая инста почти как новый мир:можно найти и глухой тупой совок, и даже иногда мир полдня, как у стругачей.Это совсем не программирование и не имеет ничего общего с ни с computer science, ни с греблей.Но некоторый спрос есть, обычно со строны прикладных исследований. В этой стране, например, актуальными задачами являются посчитать динамику вязкой жидкости в какой-нибудь инновационной трубе, или там отражение радиоволн от летящего сверхзвукового обекта, ну или там подобрать конфигурацию антенны и механизм шифрования, штобы сигнал было трудно перехватить. Корпорации, которые этим занимаются, на ярмарках вакансий и на собеседованиях смотрятся не слишком хуже, чем полноценная галера, внутро не ходил, ибо аспа, грант и дроч на научные знания в вакховских журналах.Пишу с нулевой, к С это отношения не имеет, язык в такой тусовке вторичен и зависит от специфики задачи и нии.
>>1030383IAR uber alles
>>1031019А что, оно таки стало бесплатным? А что, оно умеет в Linux?
>>1030958>плюсы ненужное говно.Мужики дело говорят. Видел недавно в новостях, что разработчики буста перекатились с собственного велосипеда на CMake наконец-то.Хотя асинхронщина что в сях, что в крестах это больно.
>>1030993> отражение радиоволн от летящего сверхзвукового обектаУгадал.Впрочем, пока моя задача скорее напоминает курсовик третьекурсника, чем что-то серьезное.
>>1019934 (OP)Пиздец, какого хера линкер помещает переменную i в .bss, а переменную off в .data? Из-за этого в i оказывается мусор, потому что я не обнуляю .bss в RAM. Почему линкер такой пидор?https://ideone.com/C2bgUt
Будет ли какое-либо увеличение производительности, если UDP сервер с большой нагрузкой будет разбивать коннекты по портам, или порт - просто абстракция?
>>1031952Кажется, ты хочешь скорее что-то вроде SO_REUSEPORT. То есть, множество процессов на одном порту
>>1032016Я хочу, чтобы сервер мог держать огромное количество клиентов и общаться с ними по UDP максимально быстро. Будет ли ускорение, если распределить клиентов по портам?
>>1031930> какого хера линкер помещаетКак раз именно того самого хера, что он ожидает нули в .bss. Это оптимизация такая, чтобы не хранить нули в бинарнике. Напиши кастомный скрипт для ld, чтобы он этого не делал, в чем проблема-то?>>1032022Вряд ли. Хочешь ускорения - делай больше потоков-обработчиков. Кстати, огромное - это сколько?
>>1031020Отладка в ворованной IDE на ворованной винде даже приятнее, чем за деньги. Тем более, что шведское поделие, в отличие от эклипсоидов, летает на любом калькуляторе.
>>1032022>Будет ли ускорение, если распределить клиентов по портам? Что будешь делать, когда порты закончатся?
>>1032385Добавит машинке еще один айпи?мимо
>>103224540к, как в eve>>1032385По 10-50 клиентов на 1 порт. Нет привязки клиента к порту, есть просто распределение, вопрос в том, будет ли от этого увеличвние перфоманса
>>1031952Тебе нужен бондинг.
>>1032612>будет ли от этого увеличвние перфомансанет
Что писать в main? return 0 или exit(EXIT_SUCCESS)?
>>1033075Можешь еще ничего не писать. Все три варианта равнозначны.
>>1033076ну если совсем доебаться, то формально разница есть:> int main(){return 0;} => > movl $0, %eax> popq %rbp> int main(){exit(0);}> movl $0, %edi> call exit@PLT>
Анон, что означает этот атрибут?void SysTick_Handler(void)__attribute__((weak, alias("default_handler")));Объявление функции линкер рассматривает как символ, который можно заменить другим символом с таким же названием, если он встретится в дальнейшем при линковке? Объясни подробно, как происходит замена этого дефолтного прерывания пользовательским обработчиком.
>>1033369А еще: атрибут указывается только после имени функции или до имени тоже можно?
>>1033238Наблюдаемой нет. Стандарт подразумевает что-то типа:void _start(void) { ...exit(main(argc, argv, envp));}>>1033369> Объявление функции линкер рассматриваетЛинкер не рассматривает объявления, он их не видит. Он видит атрибуты (флаги).> который можно заменить другим символом с таким же названием, еслиДа, weak означает "если ничего более подходящего не найдется".> как происходитСимволы бывают defined (определенные - "вот здесь есть такая-то сущность"). Бывают еще undefined символы (неопределенные - "где-то есть такая сущность"). Линкер по ходу обработки объектных файлов составляет список всех встреченных символов. Если встретился символ defined, а в списке есть undefined - ура, мы нашли определение. Если встретился defined, но в списке уже есть defined - это ошибка, потому что непонятно, какое определение из двух нужно использовать (на деле все сложнее). Если по окончанию работы в списке остались undefined - это тоже ошибка (опять же в реальности возможны некоторые варианты).Weak на самом деле - две разных фичи (не считая веселья с динамической загрузкой) - weak reference и weak definition. У линкера, умеющего в weak, обычные defined-символы (без weak) называются strong. Если в таблице у линкера лежит weak, а он видит strong (или если лежит strong, а он видит weak), то должна была бы возникнуть ошибка, но она не возникает - weak нахуй игнорируется, в таблицу попадает (или остается в ней) strong. Мало того, если по окончанию работы линкера в таблице остались undefined weak символы, это тоже не ошибка - считается, что значение символа (например, адрес функции) - ноль/NULL.Ну и соответственно: если у тебя где-то в системных хедерах лежит weak-reference (объявление) обработчика прерывания, а обработчика вообще нихуя нигде нет, то в таблицу обработчиков прерываний попадет NULL. Если у тебя есть (определена) своя функция с таким же именем, то в таблицу попадет адрес твоей функции. И, наконец, если в хедерах или либе лежит weak-definition (определение), а твоей функции с таким же именем нет, то будет использовано библиотечная реализация.>>1033371> только после имени функции или до имени тожеВ объявлениях или до имени, или после. В определениях только до имени.
>>1033672>Символы бывают defined (определенные - "вот здесь есть такая-то сущность"). Бывают еще undefined символы (неопределенные - "где-то есть такая сущность"). Линкер по ходу обработки объектных файлов составляет список всех встреченных символов. Если встретился символ defined, а в списке есть undefined - ура, мы нашли определение. Если встретился defined, но в списке уже есть defined - это ошибка, потому что непонятно, какое определение из двух нужно использовать (на деле все сложнее). Если по окончанию работы в списке остались undefined - это тоже ошибка (опять же в реальности возможны некоторые варианты)........что вы зделоли с сишечкой?
>>1033768А что не так, и при чем тут сишечка? Все линкеры делают делают это.
Пишу библиотеку длинной арифметики над конечными полями. Как эффективнее всего реализовать сравнение двух 256-битныхчисел, представленных пятью chunk'ами, в которых хранятся "цифры" размером 51 бит? Я реализую операции так, чтобы они могли выполняться над всеми цифрами числа одновременно за один такт, и для этого не использую прибавление с переносом adc. Сравние я тоже хочу сделать эффективно, чтобы оно выполнялось за такт над всеми чанками. Как? Одно условие с несколькими &&?
>>1034216> выполнялось за тактДля начала скажи, ты дизасм смотришь, или у тебя кофейная гуща?
>>1034231Пока что основную часть кода и вообще писал на асме.
>>1034232Ну покажи хотя бы свое сложение без adc. А то я слабо представляю себе софтовую реализацию за такт. В железе вот могу, а софтом нет.
>>1034233mov TempReg, [rax]shr TempReg, 51add ebx, TempReg ; в ebx - следующий чанк, к нему прибавляем carryand [rax], маска обнлуляющая carry бит и все старшие битыТут используем сокращенную запись чисел: 256 бит делим на 5 частей, в каждой части получается 51 бит. При сложении таких цифр переполнения не возникает,и дорогостоящая операция adc не нужна. Все carry, однако, нормируем самостоятельно.
>>1034235Ну все это к тому, что над векторами процессор может выполнять операции за такт, но при этом теряются carry, т.к. замедляют процесс. Поэтому нужна вся эта магия со сдвигами и масками.
Если я буду реаллокать char, то по сути все, что лежало в этом массиве будет лежать в новом, так? Будут ли утечки памяти при этом и высвобождает ли realloc ранее выделенную память? Вопрос встал потому, что сначала должны быть высвобождены все char, потом char, потом сам char*, чтобы не было утечек
>>1034819>Если я буду реаллокать charchar >высвобождены все charchar >потом charchar >потом сам charchar
>>1034822Уебите меня кто-нибудь
>>1034819> Будут ли утечки памяти при этом и высвобождает ли realloc ранее выделенную памятьНет и да.
>>1034826Как именно он высвобождает? Если я ему подам тройной char, то он снесет сразу его или начнет с более "низких" указателей? Т.е. сначала чар1, потом чар2, потом чар3. Если так, то все хорошо. Если же нет, то сто процентно будет утечка. Я именно это хоте уточнить
>>1034828>сто процентностопроцентно>хоте уточнитьхотел уточнить
>>1034819> то по сути все, что лежало в этом массиве будет лежать в новом, так?так> realloc ранее выделенную памятьэмм, ну должен вообще-то. Почитай man realloc.> Вопрос встал потому, что сначала должны быть высвобождены все char, потом charmi ne komprenas vin, ja tvoja ne ponimat?
>>1034819ответ
>>1034819malloc/realloc/free абсолютно похуй, что конкретно у тебя лежит в куске памяти. Все, о чем они знают - размер и адрес этого куска. Так что, если у тебя массив указателей, то realloc() сами указатели-то тебе, конечно, скопирует в новое место (или наоборот лишние из хвоста выкинет, если новый размер меньше текущего), но о том, что там указатели, он не знает и знать не может, поэтому если ты не озаботился - утечки будут. У тебя язык с ручным управлением памяти, каждым своим указателем ты рулишь сам. Сам насоздавал - вот и высвобождай все сам.
Почему здесь не ставится звёздочка? Спотыкаюсь о синтаксис как даун.
>>1035236char ∗lineptr[] в аргументах равносильно char ∗∗lineptr. В теле цикла lineptr[ i ] равносильно ∗(lineptr + i), т.е., одну звездочку (один уровень указателей) у lineptr ты убираешь, получаешь char ∗, именно его (адрес последовательности символов, завершенной \0) и хочет %s в printf. Если бы ты выводил только один символ через %с, то сделал бы ∗∗(lineptr + i) (убрали два уровня, получили char) или более читабельно с использованием синтаксиса массивов ∗lineptr[ i ].
>>1035089Я именно об этом и спрашивал, ибо писали, что высвобождает выделенную память. Я понять как раз не мог, как он может указатели более низкого порядка удалять (так как он и не может, лол), хотя обычно пишут, что нет никаких утечек и быть не может. Спасибо
>>1035254Ну про realloc обычно имеется в виду, что если foo = realloc(bar, length) успешен, и оно решит переместить содержимое bar на новое место, то память по адресу bar оно само освободит, тебе не нужно об этом думать. Никаких утечек в этом смысле.
>>1035245Блять. Вроде, улавливаю вершки. Так меня указатели путают почему-то.
- Годное пособие для гуманитариев: http://c.learncodethehardway.org/book/Просят деньги.Может есть что-то для нищебродов?
>>1035281Да все просто. Есть char ∗∗lineptr, у постфиксного ++ приоритет выше, чем у звездочки. Соответственно ++ увеличивает lineptr (и lineptr теперь указывает на следюущий char ∗), но до того, как постфиксный ++ что-то сделает, он (так как он постфиксный) "кладет" в выражение текущее значение lineptr значение, а звездочка читает из этого значения char ∗.Путаешься в указателях - обязательно смотри в отладчике (желательно в голом хексдампе памяти), путаешься в приоритетах - расставляй скобки, объявляй временные переменные. Алсо, попробуй думать об указателе, как о массиве (из нескольких, а иногда и из одного элемента) значений того типа, на который он указывает. Ну типа: ∗lineptr++ это char ∗line; line = lineptr[0]; ++lineptr.
>>1035291Ну охуеть вообще! Дожили! http://web.archive.org/web/*/http://c.learncodethehardway.org/book/
>>1035304Спасибо за разъяснения, переспал с твоими сообщениями, понял, что запутался, так как не сразу понял, что в printf и нужен указатель на строку.
>>1019934 (OP)C чем сравнить ctx->pPeHdr->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_TLS], чтобы определить, что TLS нет?
Гайс, как создать массив объектов класса?К примеру : for(int i = 0; i<VariableList.threads; i++) VkApi Api = new VkApi();Что бы в последующем мог использоватьApi[0].Auth();Api[1].Auth();...и т.п ?
>>1035626>VkApi Api = new VkApi();VkApi Api = new VkApi();Фикс
>>1035628Api
>>1035638api[ i ]
>>1035595Размер директории больше или равен размеру IMAGE_TLS_DIRECTORY?
Аноны, вот основы синтаксиса прочел, "опыта" на laba1 набрался.Интересует вот какой момент: где почитать про Си и сети? Как делать пост/гет запросы и прочее?
>>1035775В документации к библиотеке CURL?
>>1035775Ось какая? На форточках дрочи Winsock, там не сложно.
>>1035775Под линукс есть охуенный libsoup. Под винду даже хз что может по удобству сравниться с ней.
>>1035834В винде winhttp есть системный, но с удобством там некоторые проблемы.
Lua тут кто нибудь знает?
>>1035854Тут нет. Иди к ньюфагам в бесконечно-прикрепленный.
Всем привет! В процессе написания кода иногда приходится printfами выводить какие то значения или состояния, захотел эти конструкции обернуть ifndef DEBUG endif. Т.е хотел определить глобальную переменную DEBUG и если она определена,то выводим вспомогательное сообщения, если нет, то не выводим. Но как вы понимаете не получилось, гугл кидает на использование этой конструкции при подключении .h файлов. Помогите пожалуйста разобрася, спасибо.
>>1037071Заворачиваешь вызов функции в макрос, типа:#define dbgprint(x) \#ifdef debug \print(x) \#endif
>>1037071https://wandbox.org/permlink/N40JQaRzjUJzx0TX
>>1037071>>1037105#ifdef DEBUG#define DPRINTF(...) dprintf(__VA_ARGS__)/ void dprintf(const char fmt, ...) {va_list ap;va_start(ap, fmt); vfprintf(stderr, fmt, ap); va_end(ap); } */#else#define DPRINTF(...) ((void) 0)#endif
>>1037108>>1037105>>1037164Большое спасибо! Разобрался.
Почему после brk(heap_start + small_value) я могу сделать так heap_start[large_value] = some_value не словив segfault? Это как-то связано с тем, что ос выделят память постранично, и такая, мол, вот тебе страница, пездюк, еби ее как хочешь? Если так, то почему после выделения памяти с помощью brk, sbrk(0) возвращает адрес heap_start + small_value, а не heap_start + page_size?
>>1037662если ты прочитаешь windows internals или хотя бы пару книг рихтера являсь разработчиком под винду ну или пару аналогичных книг под юникс разработку то подобных вопросов не будешь задаватьа так иди нахуй, да
>>1037662> Это как-то связано с тем, что ос выделят память постраничноbrk() тебе дает сразу несколько страниц, даже если ты попросишь байт. Но да, причина в этом.> почему после выделения памяти с помощью brk, sbrk(0) возвращает адрес heap_start + small_valueПатамушта такой API, так сложилось. Сколько попросил - столько твое, ни байтом больше. И вообще, о том, что выделено больше, тебе знать не нужно. Попросишь потом еще раз small_value - вообще нихуя не выделится физически, только указатель brk передвинется. Хочешь выделять постранично - используй mmap. И вообще, управление виртуальной памятью в юзермоде в линуксе застряло в 80х, это тебе не винда. >>1037693А ты сам иди нахуй отсюда.
>>1037772помогаешь абсолютно незнакомому человеку, который в будущем станет твоим прямым конкурентом за жизненную нишусоси хуй, дурачок
>>1037782Какие-то жизненные ниши, конкуренты, что несёт этот поехавший?
>>1037827Чмо с двача же. Когда я нашел работу и тянку, то перестал думать о такой хуйне.
>>1037772>Патамушта такой APIБлядь, могли бы в man brk это добавить. Добра тебе.>>1037693>если ты прочитаешьХорошо, прочитаю.>>1037782>Непомахай блядь, он тебя сожретКаждый раз проигрываю.
Обосрался
>>1037864Не туда
Задача такая. Есть два канала. Нужно считать из них данные и вывести. Но при этом делать это с помощью селект, чтобы не дожидаться одного из них, а потом второго.Почему-то если со стандартным вводом (если написать fd1 = 0) работает, а с файлами -- нет.https://pastebin.com/AiyETnxAПомогите, люди добрые.
>>1038176> Помогите, люди добрые.Классика же. Прочитай внимательно (ВНИМАТЕЛЬНО!) про первый аргумент у select().
>>1038214зачем? можно просто спросить, и умный дурачок, поджав лапки, ответиттак гораздо быстрей чем самому грызть проблему
Может вы знаете? Как протраверсисть дерево без рекурсии? Я спрашивал у С++-уёбков, а они послали меня делать конечный автомат со стеком. Может, есть какое-нибудь решение попроще?
>>1037845когда ты потеряешь работу потому что на твое место взяли молодое мясо - студентика выпускника, и твоя шлюха соскочит с твоего пинуса на другой, надеюсь ты вспомнишь что нехуй помогать собственным прямым конкурентам
>>1038235Ебать ты мелочный. Ты сильно переоцениваешь свои возможности, считая, что твоя "помощь" или ей отсутствие может как-то сильно повлиять на состояние окружающего мира. Фактически, этот мир практически никак не изменится даже если тебя совсем не будет.
>>1038233С рекурсией ты просто используешь аппаратный стек неявно. И без рекурсии тебе тоже нужна какая-нибудь вспомогательная структура данных. Стек там или очередь. Да и куда уж проще-то? Стек из массива фиксированного размера хуячится четырьмя строками, считая обработку ошибок. Для начала кладешь корень, потом в цикле достаешь узел/кладешь его потомков, повторяешь, пока в стеке что-то есть.
>>1038241Но я не хочу массив фиксированного размера, это ведь ограничит уровень вложенности.
Нужно запрограммировать две функции. Есть два варианта как это сделать.1.double func1(всякие переменные);double func2(double(...), всякие переменные);В этом случае вторая функция реализуется элементарно и обладает некоторой вариативностью -- вместо func1 в нее можно засунуть кучу разных функций. Но норм пацаны почему-то (из-за необходимости потратить пару тактов на присвоение результата функции некоторой переменной?) так не делают, они делают вот так:2. int func1(всякие переменные, double result);int func2(всякие переменные, double* result);В таком случае внутри func2 придется явно вызывать func1 или существует способ этого избежать?, вариативность теряется.Какой способ выбрать? Первый мне ближе (потому что именно он обычно используется в других языках), но вроде бы хорошим стилем является второй способ.Как пофиксить второй способ таким образом, чтобы в него можно было засовывать разные функции, а не просто запустить func1 внутри?
>>1038245https://pastebin.com/UjfPxx1NПростите, забыл про звездочки.
>>1038214О, спасибо.>>1038218Ты какой-то обиженный.
>>1038244Ну блять динамический сделай тогда, это еще три строки.
>>1038249Ну и нахуя такая монстроузная конструкция? Тогда проще уж сделать рекурсию с каллбэком, раз и навсегда.
>>1038235Ты какой-то хуевый байтоеб, если тебя заменили студентом.
>>1038251> Ну и нахуя такая монстроузная конструкцияЭто мне надо без стека? Я-то откуда знаю? Видимо, чтобы не ограничивать уровень вложенности. Алсо, не вижу ничего монструозного в нормально написанном обходе дерева, если это не лаба1, а что-то применимое на практике.>>1038245Не совсем понятно, что именно ты там считаешь. Если тебе reduce нужен - делай reduce с колбеком, это нормально. Если функция считает какую-то конкретную вещь, тогда нахуя ей эта твоя вариативность?
>>1038256Просто мне лень плодить функции, а при рекурсии придётся.
>>1038256func1 - обычная математическая функция (правая часть диффура второго порядка).func2 - численный метод решения диффура.Формально мне нужно решить один-единственный диффур, просто начальные данные будут различаться.Но вангую, мне регулярно придется писать что-нибудь подобное, так что хотелось бы написать в общем виде.Смотрел код начальника. У него кругом указатели, препроцессорные директивы и функции именно второго варианта (то есть функция что-то делает с какой-то переменной, переданной по указателю, а выход unt просто говорит о корректности работы функции или о коде ошибки).
Никак не пойму. Как выделить структуру определенного размера? Например, под 512 байт. До этого создавал структуры и описывал в ней переменные, где по типам было понятно, сколько они займут места. Но сейчас мне надо выделить просто большую область для использовании в функции fread. Как это можно сделать?
>>1039209Это называется массив. char buffer[512] (ну или uint8_t buffer[512] - дело вкуса).
>>1039209uint8_t* buffer = new uint8_t[512];
>>1039235> newТуда ли ты зашел?
>>1039234Действительно. Спасибо тебе, анон.
Оказывается с графом на связанных списках вершин и рёбер работать намного удобнее, чем с корявым деревом. Как же охуенно стало! который-спрашивал-про-траверсинг
Хочу быть богом си, че делать
>>1040866сосать матчасть
>>1040866Завтра ищешь в интернете книжку K&R The C Programming Language. Похуй если ничего не поймешь. Затем идешь на cplusplus.com и изучаешь стандартную библиотеку от корки до корки. Потом зубришь, именно, сука, вызубриваешь конвенцию по написанию сишного кода - ANSI C, чтобы от зубов отскакивало. Когда напишешь свое первое ядро, по пути изучив ассемблер, покупаешь и изучаешь любой микроконтроллер, рекомендую TMS570. Как переделаешь ядро, чтобы было по крайней мере не монолитным, можешь идти дальше - тебя ждет увлекательный мир байтоебства. Byte stuffing, сверхбыстрые O(1) алгоритмы, экономия тактов процессора. Отсос хиккующих выблядков / просто неудачников типа рейфага или сисярп/джава-хуесосов, которые сосут хуй по жизни не заставит себя ждать и уже через пол года ты будешь собирать бинарники с такими флагами оптимизации, что любая баба будет течь при одном упоминании твоего тулчейна.
>>1040930
>>1040930В оригинале было примерно так: и уже через пол года ты будешь мыться так редко, что любая баба будет прикрывать нос от твоего запаха.
>>1040980> к тебе будут приближаться бабы
>>1040930Как в Си можно экономить такты процессора?
>>1040983Писать оптимизированный код, лол!
>>1040983_exit/_Exit
>>1040983Профайлером.
>>1019934 (OP)сап программач, дайте инфы для проекта нуфагу как работать с файлами и директориями в шиндовс, ну типа удалять создавать папки с реестром взаимодействовать
>>1041815Погуглил за тебя:https://msdn.microsoft.com/en-us/library/windows/desktop/aa364233.aspxhttps://msdn.microsoft.com/en-us/library/windows/desktop/ms724880.aspx
>>1041818двачаю ток это для какой-то библиотеки типо #include windows.h?
>>1041826> #include windows.hДля подключения ведра винды. В C/C++ нет стандартных функций для работы с файловыми системами. А что такое реестр они вообще не в курсе.
Анончики, помогите советом. Выбрал C, из-за высокого уровня возможности оптимизации. Планирую в дальнейшем под конкретное железо писать либы под нейросети. Правильный ли выбор языка я сделал?Используют ли вообще C для нейросетей?
>>1041896L I S PI SP
>>1041897>L I S PМожно чуть подробнее? Сколь востребован в нынешних реалиях в Рахе? Сколь востребован за бугром? Жив/Мёртв? Подходит ли для современных нейросетей? Есть на данный момент какие фатальные недостатки синтаксиса?
>>1041900Востребован как и нейросети, т.е. мёртв.За бугром используется для рекламы топовых железяк и ВЫСОКИХ технологий и выкачивания денег на самоуправляемое дерьмо.У нас денех не хватает на такое.Если быть серьёзным, у меня, как видишь, довольно мрачное представление об этом, но ты и вопрос задаёшь такой, что правильно хрен ответишь.
>>1041902> используетсяиспользуются* я про нейросети говорил, а не про язык, в этом посте
>>1041902Под нейросетями я имел ввиду и современные deep learning, которые по сути те же яйца - вид сбоку.
>>1041906Энивэй, это не вглядит, как что-то сишное.
>>1041896С используют для всего.
>>1038245>>1038256Я только вчера понял, как сделать это симпатично.Просто писать указатель на функцию вида int(type1 param1, type2 param2, ..., typen paramn, void params). В void пихать всё говно. И для реальных функций, использующих много разных переменных, писать что-то уровня обертки, которая будет запихивать факультативную часть переменных в params.Вангую, такому дерьму учат на первом курсе шараги. И как меня на работу взяли с такими знаниями?
>>1042480void две звездочки.
>>1042480https://www.gnu.org/software/libc/manual/html_node/Variadic-Functions.html
>>1042483Это не подошло бы. Функции (значительная часть из которых написаны давно и их нельзя изменять) вовсе не обязаны иметь схожую сигнатуру и отличаться лишь последними факультативными параметрами.
>>1042522> Просто писать указатель на функцию вида int(type1 param1, type2 param2, ..., typen paramn, void params). В void пихать всё говно.> И для реальных функций, использующих много разных переменных, писать что-то уровня обертки, которая будет запихивать факультативную часть переменных в params.> Функции (значительная часть из которых написаны давно и их нельзя изменять) вовсе не обязаны иметь схожую сигнатуру и отличаться лишь последними факультативными параметрами. Таблетки принял?
>>1042527Есть обязательные параметры:double xdouble tint size.Есть всё остальное.Нужно, написать функцию, которая получает на вход функцию с вышеназванными параметрами и чем-то еще. То есть любая из следующих функций должна пройти:int f(double x, double t, int size)int f(double t, double x, int size)int f(int size, double t, double x)int f(int size, type1 param1, double t, double x)int f(type1 param1, int size, type2 param2, double t, double x)И так далее.Это можно написать с помощью функций с переменным числом параметров?
>>1042536https://pastebin.com/6XLeJhRC
>>1038245В первом случае ты никогда не узнаешь, завершилась ли функция с ошибкой, а это первое, что хочется проверить после вызова, а результат уже дело десятое.>>1042536Ты, конечно, можешь передать любую из этих функций воид-поинтером, но как ты собрался их потом вызывать?
>>1042549Для этого приходится оборачивать функции. Вот пример: https://pastebin.com/89YB94Bx
>>1042556Ну и что мешает сделать типtypedef int ((зв)wrapper_t) (double date0, double (зв)initial_data, double (зв)result, int size, ...);и функции к нему:int EIH_wrapper(double date0, double initial_data, double result, int size, ...){}
Насколько легко/сложно будет учить C++ после Си, и с чего стоит начать?
>>1042561http://www.ozon.ru/context/detail/id/1273565/
>>1042563Зачем использовать архейскую книгу со старыми стандартами?
>>1042570>новичок>современные стандартыСовременные стандарты нигде не используются. Единственная реальное приложение - это Qt. Книга учит писать идиоматический код на С++
>>1042571Еще плюс книги - она не большего объема и без воды. А то понимаешь ли, любят они читать толстые учебники вместо писания кода.
>>1042574>не большегонебольшего
>>1042571>Современные стандарты нигде не используютсяОхлол. У меня на обоих работах C11, и мои проекты C11, и опенсорс выбираю, который не застрял на C89.
>>1042571>>1042574>>1042576Все равно придется читать про современные стандарты, вон уже 20 стандарт скоро выкатят.
>>1042582На чем вы компилируете? Даже gcc не поддерживает полностью С11.И кем ты работаешь?
>>1042583И кому он нужен? 99% до сих пор на С99 сидят, им норм.
>>1042563Спасибо!То есть, рекомендуете все же быть в курсе новых стандартов, а работать по старым?
>>1042584> gcc не поддерживает полностьюИ тут ты такой нам показываешь, что именно не умеет gcc, и почему без этого невозможно жить.> И кем ты работаешь? Говнокодером же.
>>1042651> И тут ты такой нам показываешь, что именно не умеет gcc, и почему без этого невозможно жить.А что умеет 11 из того, чего люто не хватало на 99? Без этого невозможно было жить?
>>1042651>И тут ты такой нам показываешь, что именно не умеет gcc, и почему без этого невозможно жить.Ну ладно, умеет во все, но threads.h есть только в васянских библиотеках.
>>1042665Не хватало static_assert без извращений с массивами отрицательной длины - костылем менеьше, атомики - огромной кучей костылей стало меньше, кроссплатформенный _Thread_local.> Без этого невозможно было жить?Жить можно было и без этого. Но тот факт, что язык и компилятор официально знают о существовании тредов (вне зависимости от наличия threads.h), он очень радует.
А когда в glibc добавят threads.h ?
>>1041826Там в каждой странице описания каждой сущности написано, какой заголовок и какую либу надо подключать.
>>1019934 (OP)> Что читать:>- ООП, например...Но ведь полноценного ООП на Си нет
>>1044616Проконсультируйтесь с предыдущими тредами на предмет срача о том, считать ли структурное программирование ООП или нет.
>>1044618Структура != объект
>>1044618На первом курсе что-то говорили о наследовании, инкапсуляции и полиморфизме.Инкапсулировать можно статиком. А наследовать и полиморфить как?
>>1044627Будет считаться наследованием, если создавать структуру потомка просто копируя поля родительской + добавляя свои?
>>1044627есть целая толстая книжка как делать ооп на сях )но тебе это не нужно
>>1044632>>1044634>>1044627>>1044618>>1044616Если нужно ООП, то лучше использовать С++ как Си с классами, чем пердолиться с чистым си
>>1044643Далеко не всегда есть чисто техническая возможность использовать кресты.
>>1044632Нужно еще и скопировать все функции с псевдородителем и переделать их для потомка.Уебанство какое-то получится.
>>1019934 (OP)Как с кириллицей работать в C? Вот достал кириллическую строку char *string из argv и дальше ее нужно сделать uppercase и какой функцией это проделать?toupper(ch) - игнорирует кириллицуЕбатся теперь с wchar_t?
>>1046593Да.towouuper. и сначала придётся переводить из utf-8 (mbtowc). И устанавливать локаль. Либо пользоваться icu/iconv
>>1044632Виртуальные методы придумай как реализовать, т.е., эмулируй vtable
Аноны, что я делаю не так (должно сохранять и выводить 10 чисел) :#include <stdio.h>#define N 9int main (void){ int i; int m[N]; for (i=0;i<=N;i++) scanf ("%d",&m); for (i=0;i<=N;i++) printf ("%-2d",m); return 0;} Результат работы:1 2 3 4 5 6 7 8 9 10 (ввожу)1 2 3 4 5 6 7 8 9 9 (получаю)
>>1049614Что-то не все скопировалось:#include <stdio.h>#define N 9int main (void){int i;int m[N];for (i=0;i<=N;i++)scanf ("%d",&m);for (i=0;i<=N;i++)printf ("%-2d",m);return 0;}
>>1049614Классическая ошибка на 1. Размер массива - 9, чисел ты вводишь 10 (у тебя диапазон включает и 0, и 9). Ты выходишь за пределы массива, и последняя девятка в выхлопе, видимо - значение переменной i или просто какая-то временная переменная.
кто нибудь обьяснит как это работает
>>1050323Что "это"?
Programming in C Дейтейлов это хорошая книга на первый раз?
>>1050323У тебя llvm есть же, куда ещё мингв.
Аноны, читал K&R, дропнул на средине т.к. мне подогнали бумажного Стивена Прата, которогоя только что дочитал. Есть ли смысл продолжать K&R? Заранее благодарю.
>>1050545> K&Rпараша
Нужно работать с питуном через C api, сишечка на уровне laba3, можно просто начинать все сначала учить или из-за специфики задачи часть можно опустить?
>>1050615Ну нам-то откуда знать, что именно ты там делаешь, и насколько глубокие знания тебе понадобится. В части взаимодействия с питоном все просто, и примеров овердохуя, но ведь тебе еще и что-то полезное нужно делать?
>>1050615> Нужно работать с питуном через C apiЧто-то удивительное. Я понимаю нужду в работе с си через петухон, петухон обеспечивает пользователеджружелюбность, си - скорость. Получается быстро и удобно.Но если поменять их местами, как хочет антоша, разве не получится медленная и сложная в написании программа?
>>1050844Посмотри на блендер или саблайм - если написать ядро на C или C++ и скриптовать плагины для него питоном, получается весьма годно.
>>1050849Я почему-то решил, что анон выше хотел сделать наоборот. То есть ядро на питоне, остальное на си.Так (ну, почти так) и в моем говнонии делают: пишут библиотечки на си, вставляют в питон и потом тестируют, рисуют графенчики и прочее.Но зачем для этого "Учить все сначала или часть опустить"? Вроде достаточно узнать одно слово на C и один пакет для питона.
>>1050933Или в промышленном погроммировании сложнее? Черт его знает, никогда им не занимался.Свалю, пока мне не пояснили, что я долбоеб
>>1019934 (OP)Господа, что вы имеете сказать за rust. Капец сям уже не за горами? Вообще стоит его учить/не забывать (если не под встроенные системы пишешь, конечно)?
>>1050995https://benchmarksgame.alioth.debian.org/u64q/rust.html
>>1050995>Капец хохол?
>>1050995> Капец сям> rusttry harder
>>1051016Справедливости ради, скажу, что Rust станет быстрее, когда завезут оптимизации, некоторые невозможны в C из-за системы типов. Примеры оптимизаций, которые ожидаются:1. SIMD(конец этого года)2. https://github.com/rust-lang/rust/issues/31681 это уже от llvm зависит
>>1050995Ну сишке конечно ещё очень долго не капец, но вообще Rust медленно но верно приближается к мейнстриму. И вот чего после Rust делать не хочется, так это прикасаться к C или C++.
>>1051148ты и так ни к чему из этого не прикасаешься, только шиллишь на бордах
В Rust слишком большие бинарники. На си вирмейкеры в нулевых писали программы размером 800 байт. В расте так можно делать?
>>1051164Можно. Там по умолчанию jemalloc используется, из-за этого хелловорлды жирные, но можно заюзать системный аллокатор.
У раста никогда не будут сравнимые с C бинарники, это не является целью языка
>>1051164Так ты приплюсуюй стандартную библиотеку сишную динамически линкованную, которая в системе предустановлена и для любой нехелловолдной программы получится совсем не 800 байт.
Говорят, что прежде чем изучать шарпы всякие и джавы, то лучше начать с простого Си. Так ли это? Или это заблуждение?
>>1051301Начни с ассемблера наркоманской выдуманной машины Кнута )
>>1051303>наркоманской выдуманной машины Кнутаесть же специально для петухов от Белоснежки Тюринга
>>1051301Начни с Хаскеля.
>>1051163>только шиллишь на бордахПиздюк, поясни батьке значение слова, а то я стар стал для вашего сленга молодёжного.
>>1051492Зазывала ты
Котаны, в некоторых вакансиях значится удивительный язык C/C++. Что это значит? Их устроит человек, знающий только натив си?Имею 3 месяца опыта. После испытательного срока повысили зарплата АЖ НА 5 ТЫЩ. Охуеть теперь, моя зарплата 30450 рублей.Начал гуглить схожие вакансии (цос), везде написано либо C++, либо C/C++ а еще питон или матлаб, но это для прототипирования. На таком уровне освоить питон и матлаб можно за 3 дня.
>>1051588>На таком уровне освоить питон и матлаб можно за 3 дняОшибаешься. Матлаб как язык - унылое говно. Ценность его в тулбоксах (стандартных и сторонних). И вот их грамотно использовать ты не научишься за три дня. А уж тем более не поймешь матана, на котором эти тулбоксы основаны.
>>1051588Это может значить что угодно. Может описание вакансии писла безграмотная тупая пизда HR, которая одно от другого не отличает, а может им таки правда специалист по крестам необходим. Пока не прособеседуешься или еще как-то не провентилируешь вопрос - не поймешь.
>>1051624В питоне в данном случае аналогично. Он нужен только из-за нумпая, скайпая, матплотлиба и еще пары библиотек.
>>1049618Видимо значение переменной i на стеке...
Чё про MinGW скажете?
>>1051808А что тебе тут должны сказать?
>>1051808Скажем, что работает. Что тебе еще нужно?
>>1051811>>1052109Какие вы душные ребята тут
>>1025376PVOID
Пацаны, хочу получить общие знания о языке. Поэтому вопрос такой, че читать - книгу которая у ОПа или взять Дейтелов лучше? На самом деле прохожу cs50 и там советуют ту, что у ОПа почитать начальные главы, а в гайде на лурке пишут про Дейтелов. В общем, какую взять? Где примеры лучше? Актуальность?А еще такой вопрос, куда пропал фак со ссылками на все языки в начале борды? Или я просто с утра нихуя найти не могу?
>>1051808кривая ссанина от васянов, которая выполняет функции компилятора
>>1053219> хочу получить общие знания о языкеКерниган и Ритчи> АктуальностьЖурнал "Птюч". Если верить Пелевину, об актуальностях пишут именно там.
Как понять из таких объявлений:> char strtok(char str, const char delim);Что char str требует массив char str[], а не указатель на строку char *str?
>>1053326
>>1053326строку правильно указывать как const char *str
ну тоексть строки - constа массивы - не const
>>1053329Понял тебя! Это просто условность, или правило языка?
>>1053330Тут скорее правило, чтобы не было неявных ошибок.Вот например ты передашь строку не как const, а потом захочешь ее изменить. А строки в си неизменяемые, и не каждый компилятор может отследить такую ошибку.
>>1053326Никак. С чего ты взял?
>>1053219K&R однозначно.
>>1053219Я параллельно читаю, шоб пропорционально было. В Дейтейлах по 40 упражнений на главу, что солидно, а K&R легко читается и более информативная и сжатая. Всегда так делаю -- книга, где про всё самое нужное + грузный, аки справочник, учебник с кучей упражнений.
>>1053553Не понял, где ты у Дейтеллов упражнения увидел? Вот в K&R да, есть в конце каждой главы + ещё примеры кода, а вот у Дейтеллов только примеры, да и то не очень.
>>1053553Тоже с нуля начал заниматься? У меня еще вот такая лежит. Не помню где нашел. Просто не хочется 300 страниц читать ради нихуя.http://index-of.es/Programming/C/Vine,_Michael_-_C_Programming_for_the_Absolute_Beginner_-_2nd_Edition.pdf
>>1053579
Пиздец, парни. Пытаюсь писать коротенькие проги в разных IDE и хочу вам сказать, что я за весь день столько говна поел с популярными IDE(VS, Eclipse, NetBeans), что пиздец. Ни в одной нормально не получилось обычный Привет, мир написать. Но тут я установил CodeBlocks и все заработало с первого раза. Почему все так сложно то?
>>1053764Потому что это уже для крутышек. КодБлокс для хеллоувордов самое то, потому что "из коробки". Хотя вкатать какой-нибудь компилятор в какой-нибудь Sublime - дело пяти минут, гугл ит
>>1053764Всегда знал, что IDE-дкловны весь день только тем и занимаются, что едят г-но со своими IDE.А мог бы поставить vim и просто писать код.
>>1053764Если сложно настроить компилятор в IDE, учить Си рановато. И вообще, на время изучения языка IDE желательно выкинуть, писать в любом блокноте с подсветкой синтаксиса (ну или всякие Sublime тоже подойдут), а компилировать исключительно вручную (заодно будет повод Makefileы осилить).
>>1053772>Makefileы осилитьШто там осиливать? Создал Makefile с одной строчкойCFLAGS=-Wall -Wextra (тут по желанию опции оптимизации/дебаг символы)и пишешьmake shitИ тебе из shit.c создастся исполняемый файл shit.
>>1053775Ты хотел сказать:CFLAGS=-Wall -Wextra make shitА вот когда у тебя дерево, да с зависимостями, да с библиотечками, да еще и новые файлы периодически появляются, а ты по-прежнему хочешь олдскульные мейкфайлы, а не cmake, тогда нужно осиливать.
>>1053780>когда у тебя дерево, да с зависимостями, да с библиотечками, да еще и новые файлы периодически появляются, а ты по-прежнему хочешь олдскульные мейкфайлы, а не cmake, тогда нужно осиливать.Если не считать список объектных файлов в дереве, для всего этого достаточно 4-5 строк:1) CPPFLAGS=-I<инклуды> или $(pkg-config --cflags-only-I <либанеймс>) -MMD -MP2) CFLAGS=-Wall -Wextra ... $(pkg-config --cflags-only-other <либанеймс>)3) LDFLAGS=$(pkg-config --libs-only-L --libs-only-other <либанеймс>)4) LDLIBS=$(pkg-config --libs-only-l <либанеймс>)all: shitshit: \ subdir/shit1.o \ subdir/shit2.o \5) -include $(shell find . -type f -name '*.d')
>>1053763Сделал, кстати, задачку 4.26. Уже минут 20 жду, пока он выловит первый 3.14159. До них получилось сравнительно быстро. У меня алгоритм получился такой, что результат для ряда из n требует (n^2 + n)/2 операций т.е. сумма арифметической прогрессии до n с шагом один (пикрелейтед). То есть, порядок роста у алгоритма полиномиальный, потому что он много лишних вычислений при новом j внешнего цикла. Говно, конечно, но мне лень переписать пару строчек, чтобы хранить последнее состояние ряда и я хочу спать.
>>1053815Хотя, мне стало интересно, что там получится, поэтому я тупо убрал верхний цикл, переписал переменные внутреннего под него и таким образом получил линейный порядок роста, посчитав результат за секунду.А вы говорите, SICP не нуженЗаёбно было эти приближения ручками считать в каком-нибудь V A.D., наверное.
>>1053815> А вы говорите, SICP не нуженМы говорим. Потому что никому в голову не придет делать решение, как в твоем предыдущем посте. Это элементарный здравый смысл, для этого даже про О-большое знать не нужно.
>>1053820>А вы говорите, SICP не нуженТам даже про call-with-current-continuation не рассказывают.
>>1053824Там было ещё задание на вывод таблицы с рядом из одного элемента, двух, трёх, etc. Мне это понадобилось, чтобы отслеживать и выводить изменения переменных для наибольшей детальности, верхний цикл был до 10. Так что ну зря ты так.
Анчоусы, минуточку внимания.У меня есть самописный бутлоадер на асме, в котором же находится обработчка прерывний/исключений потому как их векторы упираются именно во флэш память.Бутлоадер, помимо своих основных задач, кушает elf-файл по нужному адресу или принимает его по uart, затем парсит, раскидывая сегменты по нужным адресам в ОЗУ, и в конце прыгает в entry_point.Хочу, чтобы при прерывании, бутлоадер просто сохранял контекст в стэке, а потом передавал управление функции обработки прерываний, которая находится где-нибудь в загружаемом эльфе. ВОПРОС: как сообщить бутлоадеру адреса этих функций обработки прерываний?Пока что вижу два пути решения:1) В бутлоадере закрепить фиксированные адреса для этих функций где-нибудь в cram, и в случае прерывания прыгать по ним. Сами же функции объявлять через __attribute__(__section__), а в скрипте линковщика размещать их по тем самым фиксированным адресам.2) Парсить symtable elf-файла на наличие функций с заданным параметром name. Этот вариант видится мне лучше, ибо загрузчик будет точно знать, есть ли обработчики прерываний или нет. И если нет, можно просто отключит прерывания. И не будет слепого перехода туда, где возможно ничего нет.Но я замучаюсь парсер писать на асме.
>>1053763Так, кажись я начинаю догонять. У тебя же издание книги старое, там где в конце плюсы рассматриваются? Если я опять не угадал, напиши год и издательство.
>>1054194Угадал.
>>1053923> Но я замучаюсь парсер писать на асмеКто тебя заставляет писать на асме?> как сообщить бутлоадеру адреса этих функций обработки прерыванийА цели у загрузчика какие? Загрузить твой собственный образ и только твой? Тогда фиксированные адреса в тему. Чужие бинарники поддерживаются? Можешь сделать по образу и подобию UEFI: передавать в точку входа загружаемого файла аргументом список сервисов загрузчика, в числе которых функция установки кастомной таблицы векторов прерываний.
Котаны, нашел программу с таким прототипом:int func(бла-бла-бла, double date0, double date1, бла-бла).Мне сказали, что date0 и date1 -- это просто разбиение одного времени на 2 числа для большей точности. И якобы это более-менее стандартная операция.А как именно разбивают? На целую и дробную части? И для того, чтобы все работало, отдельно арифметику писать?Если это на самом деле стандартное действие, не подскажете, где про это прочесть?
>>1054461Впервые вижу, чтобы разбивали плавающую точку, да и точности в double овердохуя для дат, да и long double завезли. Вот при передаче double на x86-машинах, он как раз разбивается (компилятором, а не вручную!) и передается в качестве двух 32-битных (целых!) значений, т.е., используются два push. А что конкретно происходит в твоей библиотечке, нахуя так сделано, и какой там формат у каждой части, можно узнать, только посмотрев в код. Это никаким местом не стандартная операция.
>>1054466Благодарю. Буду спрашивать у человека, написавшего эту хуету.
>>1054402>Кто тебя заставляет писать на асме?Хм, в действительности пожалуй никто не заставляет.>А цели у загрузчика какие? Загрузить твой собственный образ и только твой? Тогда фиксированные адреса в тему. Чужие бинарники поддерживаются? Да, хотел сделать так, чтобы чужие файлы тоже поддерживались. А теперь даже хуй знает, как лучше сделать. Оставить обработку прерываний и исключений только в бутлоадере. Ведь по идее юзера вообще не должно ебать, как там они обрабатываются.>Можешь сделать по образу и подобию UEFI: передавать в точку входа загружаемого файла аргументом список сервисов загрузчика, в числе которых функция установки кастомной таблицы векторов прерываний.Слишком сложна. Но в любом случае спасибо, попробую почитать про принцип работы UEFI.Мне вообще интересно, как всю эту ёбань с загрузчиками и программами делают нормальные люди. Так как понимаю, что изобретение велосипеда с квадратными колёсами - хреновый и сложный путь.
>>1054640>>1054402Забыл добавить, что на асме пишу, потому что бутлоадер находится в ридонли области. В итоге для временного хранения данных использую регистры в основном, реже стэк. Но, наверно, в сишечке так тоже можно делать.
Привет, котоны. Интересует такой вопрос: можно ли снять дамп памяти во время выполнения программы и извлечь из него значения переменных?
>>1054756Можно. gdb/windbg умеют дампы открывать. Тебе под какую ос?
>>1054982Под линукс.
>>1055316Вы здесь будете или в докер завернуть с собой?
>>1055334Не понимаю о чем ты.В общем, для теста я сделал следующее:1. Написал простую программу на C2. Скомпилировал с флагом -g3. Запустил4. Снял дамп с помощью gdb -q - <pid>5. Открыл в gdb core fileКак дальше смотреть содержимое стека я не знаю. Если запускать программу сразу через gdb и ставить брейкпоинты, то через info locals все переменные видны, но как их посмотреть в дампе я без понятия - на команду info locals отладчик говорит что таблица символов не загружена.
>>1019934 (OP)О, шикарно мой тред!Учусь по книжке Брайана и Ритчи(англ версию, русские сосут хуй), я решил самостоятельно все задачки до той, где нужно подменять несколько пробелов одним. Первую задачку в теме, где нужно вести счёт табов, пробелов и символ новой строки решил сразу же, вторая пошла по пизде, сидел писал разные типы псевдокода, пытался спагетти-кодом придумать что-то, но в итоге залез в стэк и увидел решение, от которого у меня загорела жепа, однако у меня голова уже не соображала, поэтому думаю тут тупость простительна. Ничего страшного в том, что не можешь решить какую то задачку? Как поступать в таком положений? Просто скипнуть и вернуться потом, или все же можно посмотреть решение когда совсем уже заебался? Алсо, что стоит знать об GCC? В первый день потратил часы читая вики по компиляции на винду, в итоге залез на вики Линукса и ввел в cmd просто gcc и название программы как было написано и все заработало. Вот хотел спросить, что нужно о GCC знать?
>>1055429> Вот хотел спросить, что нужно о GCC знать? Ты имеешь в виду ключи?
>>1055451Я блять, искренне извиняюсь, но я имел ввиду компилятор. В первый раз я его, блядь, пытался запустить, нихуя не понял, а ведь это лучший компилятор даже в сравнений с любой IDE, да и как новичок я обязан знать эту базу. Полез в вики читать, а там много всего.https://sourceforge.net/projects/mingw/?source=navbarСтоит ли полностью наворачивать вики?
>>1055429>Ничего страшного в том, что не можешь решить какую то задачку?Ничего страшного.>Как поступать в таком положений?Сначала подумать, если все равно не получается, то внимательно изучить решение и попытаться понять его.>Просто скипнуть и вернуться потом, или все же можно посмотреть решение когда совсем уже заебался?Можно и так>Просто скипнуть и вернуться потом, или все же можно посмотреть решение когда совсем уже заебался?Ставь mingw-w64 и просто компилируй в gcc как на линуксе. Или можешь украсть/купить CLion
>>1055496>лучший компилятор даже в сравнений с любой IDEТы не понимаешь чем компилятор отличается от IDE?
>>1055513>попытаться понять его.Так и сделал. >>1055513>Ставь mingw-w64Я его и поставил лол! Там дают туеву хучу эмуляторов GNU-like терминалов и обычную версию MinGW64 для винды. Я ее установил, но не мог додуматься как пользоваться, в вики каша, а я и так заебанный. >>1055527IDE представляет сферу разработки, со встроенным библиотеками, компиляторами и графическим интерфейсом, а комплилятор преобразовывает его язык в низкоуровневый. Если, блядь, я правильно понимаю.
>>1055528О, надо бы еще вики почитать по всей этой хуйне, база же. Алсо либо в силу своих припизднутых глаз, либо это действительно так - Не вижу эту самую базу, которую должен знать погромист. Ну, типа этого https://en.wikipedia.org/wiki/Compilerhttps://en.wikipedia.org/wiki/Programming_languagehttps://en.wikipedia.org/wiki/ExecutableРебят, кто нибудь знает, где можно почитать про все это?
Есть ли хорошие гиды по различиям между С++ и С для плюсовиков?
>>1055536Да, в шапке.
>>1055528Так я понять не могу, что ты хочешь знать про компилятор?
>>1055547Я прошу прощения за ебаное мозгоебство, но меня смущает вот это:https://sourceforge.net/p/mingw-w64/wiki2/FAQ/Я должен знать все, что написано здесь? Типа: How do I compile multilib toolchain?
>>1055528>Я ее установил, но не мог додуматься как пользоватьсяДобавить в PATH и юзать как обычный gcc из командной строки
>>1055559Мультилиб может и не нужен, но как подключать сторонние либы, хедеры, линковка, флаги компиляции скорее всего должен знать.
>>1055561Спасибо. >>1055565Ну я так понял, когда в этом нужда появится.
>>1055496>блять>блядь
ПЕРЕКАТ>>1055733 (OP)>>1055733 (OP)>>1055733 (OP)>>1055733 (OP)ПЕРЕКАТ
>>1019934 (OP)>ООП, напримерА что, в С (не С++) завезли ООП?
>>1055748ООП может быть хоть на асме, но для некоторых ООП == классы.
>>1055751То есть в С классов нетТак почему в треде C ссылки на книжки по C++?
>>1055761Где ссылки на C++?
>>1055763>ООП
>>1055772Попробуй открыть книгу и прочитать хотя бы название.
>>1055773В ней нет названия.
>>1055782Заебал. Это ООП на Си с помощью макросов, магии и извращений. Поэтому книга в шапке.
>>1055798А зачем вторую копию скачивал - она же у тебя уже есть на диске?
>>1051016И чего? Сайт этот заставляет всех решать задачу одним и тем же алгоритмом. В реальной жизни такого ограничения нет. И даже в таких условиях почти на всех задачах только чуть-чуть медленнее. Потора-два раза это именно чуть-чуть. Это не в десятки раз. Сейчас чтоб дрочить на порнуху в инете закупают домой пеки эквиваленые по производительности мейнфреймам недавнего прошлого. Купить больше или более дорогое железо для кода на rust дешевле и проще, чем писать, отлаживать и сопровождать "крестовый" код. Мало кому в не-embedded мире действительно критически необходим каждый процент производительности.
Парни, а чего в VS теперь на C писать нельзя? Или чего не так с ней? Кст кто-то может ссылку дать на Кочана на английском 3е издание или 4е, если есть. Чет в гугле найти не могу живых ссылок. Только на русском.
Как вообще пользоваться ебучим терминалом? Я так понимаю его придумали просто, чтобы программы запускать и все? Там же ничего написать нельзя?
>>1056822Можно. Создай новый Win32-проект, добавь C++ файл с расширением .c. Если книжку не найдешь - читай Прату.>>1056832Да, терминал нужен, чтобы запускать программы. Писать код удобнее в текстовом редакторе, но если ты упорствуешь, загугли всякие ed/vi/vim, edlin и edit в винде есть опять же.
>>1056889Допустим я поставил терминал и в книжке, которую я читаю пишут, что надо выполнить программу. Я выполняю и терминал пишет, что не может ее найти. Это значит, что бинарника нет в PATH, который я указал, так? У меня стоит cygwin. В нем же ниче не написать?
>>1057017Перекат: >>1055733 (OP)
>>1057017А зачем тебе cygwin вообще? Это мерзкие костыли, с которыми можно смириться лишь заради компиляции некоторых программ, завязанных на POSIX. Если тебе никсовое окружение нужно - возьми MSYS или лучше MSYS2. Если тебе компилировать - поставь отдельно mingw или clang+mingw.
>>1029086Гугли RTTI и как его отключить.
>>1058503Умный самый? RTTI я отключал. Мало того, я пытался компилировать .c-файлы, в которых RTTI не может быть по определению - результат тот же. Мало того, RTTI не имеет никакого отношения к отладочной директории, RTTI хранится в секции данных, рядом с таблицами виртуальных функций. Мало того, со включенным RTTI в предыдущих версиях VS отладочной директории в бинарнике нет. Такие дела.
Как бороться с лимитом на размер чисел? Простой пример1/243 = 0.0041152263374485596…long double a = 1.0/243.0;printf("%.24Lf\n", a);Результат:0.004115226337448560020582…Складывается впечатление, что 855 округляется до 856, а дальше сплошной рандом идет
>>1059257> long double> 1.0 / 243.0Ты считаешь в даблах, а не в long double. Используй суффикс lf хотя бы у одного из операндов. И да, точность ограничена, ничего ты с этим не поделаешь.Алсо, у нас >>1055733 (OP) НОВЫЙ ТРЕД ДАВНО.