Тред, посвященный прародителю всех С-подобных языков и по совместительству единственному идеальному и всесторонне годному средству программирования как на системном, так и на прикладном уровне.
- Очевидный 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 или до.
Samuel P. Harbison, Guy L. Steele Jr. "C: A Reference Manual, 5th Edition" (2002) Ебаный пересказ стандартов C89 и C99 (включая стандартную библиотеку). Для не осиливающих стандарт в оригинале. Читать в качестве подготовки к собеседованиям (есть задачник с ответами) и для ознакомления с масштабами пиздеца перед написанием своего парсера/компилера.
Peter Van Der Linden "Expert C Programming. Deep C Secrets" (1994) "Си: грязные истории". Смехуечки, немного объяснений, чем обусловлены особенности языка, всем известные подводные камни кто там ругал косяки в JS? у нас в сишечке их гораздо больше, просто они лучше спрятаны, немного байтоебли и непонятно откуда взявшаяся глава про старинные плюсы. Читать в качестве сказки на ночь (на пару вечеров хватит).
Richard M. Reese "Understanding and Using C Pointers. Core Techniques for Memory Management" (2013) - почитать, вкатиться в указатели.
Ben Klemens "21st Century C: C Tips from the New School" (2012)
Paul Deitel, Harvey Deitel "C for Programmers with an Introduction to C11" (2013)
Stephen G. Koch@n "Programming in C (3rd Edition или 4th Edition, если найдется)" (2014)
Онлайн-утилиты: - https://godbolt.org/ - Compiler Explorer позволяет посмотреть выхлоп компиляторов для введенного куска кода (больше полусотни разных версий компиляторов). - http://cdecl.org/ - С Gibberish ↔ English помогает читать сложные сишные декларации.
>>1019702 > Зачем нужны указатели на указатели и даже о, ужас, указатели на указатели на указатели и дальше по глубине? Тройные используются редко, обычно на этом этапе уже появляются дополнительные данные, и возникают мысли о структурках. А двойные очень часто нужны. Допустим, есть у нас текстовый буфер, и мы его парсим. Можно передавать стейт (в структурке), но это часто избыточно, поэтому функции дают указатель на текущую позицию в буфере. Но как узнать, сколько данных обработала функция? Можно вернуть новый указатель. Но если нужно вернуть что-то еще, то разумно передавать указатель на указатель на текущую позицию, и обновлять его содержимое перед возвратом из функции. Или, например, при манипуляциях связанным списком может понадобиться вставить узел в самое начало - можно возвращать новое начало списка, а можно передавать указатель на переменную, которая хранит начало списка и модифицировать его.
>>1020421 куришь дескрипторы и работу с файлами. Своп юзаешь вместо оперативы, но код так или иначе будет храниться в оперативке: загружаться и выгружаться в неё. Хотя при должном скиле, можно вообще свести использование оперативы к минимуму.
>>1020357 С register получается такая же автоматическая переменная, как и другие. Это не "тип памяти", это просто хинт компилятору плюс ограничения на использование. Но на этот хинт большинство компиляторов не обращают никакого внимания.
>>1020421 Никак. Единственное, что стоит сделать, выполняясь из кэша - инициализировать DRAM. И делают это обычно на ассемблере.
>>1019934 (OP) Ананасы, как думаете, что лучше делать с зомби процессами в POSIX? Мне нужно запустить процесс, подождать пока он завершится, получить код выхода. Ждать долго нельзя, есть максимальный таймаут. Если таймаут прошел (очень редкий, но возможный случай), нужно ругнуться. И дальше 2 варианта: 1) забить на процесс, и он будет себе болтаться как зомби когда все-таки завершится 2) принудительно SIGKILL-нуть и тут же вызвать waitpid (надежно, но больно если процесс таки собирался выполнить своё дело). В общем вопрос: приемлемо ли оставлять зомби или нужно обязательно их избегать?
>>1020648 > Очень даже обращают если свободные регистры закончились. Ты, видимо, не понял. Современные оптимизирующие компиляторы срать хотели на register (как и на inline, который тоже хинт), они сами решают, как им будет оптимальнее распределить регистры или инлайнить функции. Если переменной пользуются редко, никто ее в регистр не положит, несмотря на register. Справедливости ради, в embedded все не совсем так, и там есть компиляторы, которые если уж не подчиняются, то хотя бы прислушиваются.
>>1020693 не пользовал register, но инлайнил активно с arm-none-eabi-gcc, ну так там прост ключиков полно для управления процессом, в т.ч. "инлайнить все что с атрибутом inline" (по умолчанию отключено)
>>1020779 давно mingw щупал? там сейчас все охуенно, по крайней мере я из-под линукса весьма большие и разнообразные ехе-шники собираю, никаких проблеи
>>1020797 Пишут, что стараются реализовывать стандарт как можно быстрее. Но стандарты С99 и С11 реализовывать не стали вообще. С++11 они смогли полностью реализовать спустя 5 лет после выхода этого стандарта, С++14 реализован еще не полностью, С++17, видимо, ждет участь С++11.
>>1020811 >Обычно порты убогие. Там хотя бы заявлена реализация стандарта и она действительно есть. Можно, конечно, пользоваться msvc в котором не осилили до сих пор С++98, зато не порт, да.
>>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#5 Type 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#11 Loose 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) Поясните по хардкору, почему символ указателя "*" лепят то к спецификатору типа, то к названию переменной или функции? Это дебильные художества за которые надо в руки насрать, или это классика, это знать надо разные вещи?
>>1020921 >НИКОГДА!!!!!! НИКОГДА, БЛЯДЬ!!!!!! СЛЫШИТЕ? ПОТОМУ ЧТО ЭТО СРАЗУ ОТПРАВИТ НАХУЙ НА ПОМОЙКУ ВСЕ КВАДРИЛЛИОНЫ СТРОК КОДА ПОД СПЕРМУ, В КОТОРОМ ЭТОТ WCHAR_T ИСПОЛЬЗУЕТСЯ ВОВСЮ >Этот самоподрыв пидорахи
Блин, смотрю на книги и не понимаю с чего начать: Параллельное программирование с использованием OpenMP; Advanced Programming in the UNIX Environment Advanced Bash Scripting Guide, но это же тоже надо для UNIX'а Не понимаю, с чего начать. APUE даст знания по целевой ОС, OpenMP даст знания по многопокпоку, на который дрочу. В самой книге по OpenMP про UNIX'ы ничего нет, там какие-то мокрые письки в качестве компиляторов рассматриваются, благо руководства по GCC и OpenMP можно найти в интернете. С чего бы ты начал, анон? С понимания ОС или конкретного стандарта языка?
>>1021446 > >В самой книге по OpenMP про UNIX'ы н Смотри со своими многопотоками не обосрись. Большинство задач быстрее выполнятся в одном потоке. Многопоток это огромный оверхед на создание потоков, имеет смысл только если без этого программа заметно быстрее.
>>1021628 Если что-то вроде физики, рендеринга, нейроночек то разумеется это многопоточные вычисления по своей природе. Но можно говна наделать когда пытаешься сделать простые вещи паралельными, потому что по природе они последовательны.
>>1021086 #include <conio.h> @ НИСОБИРАЕТСЯ ПОД ЛИНУКСОМ @ ВИНОВАТ КОМПИЛЯТОР
>>1021627 > Многопоток это огромный оверхед на создание потоков Именно поэтому при нормальных многопоточных вычислениях потоки чаще всего создаются однажды, кладутся в пул и выполняют задачи, ну ты пони. Или если много IO, то создаются однажды и выполняют каждый свою задачу (или не выполняют, ожидая этого самого IO).
Правильно ли я понимаю, что на Си мне лучше писать что-то низкоуровневое (работа с периферией, памятью, быстрая числодробилка), а основной код лучше реализовывать через вызовы Си библиотек в более высокоуровневых языках?
>>1019934 (OP) Анонасы помогите новичку, есть куча-же книг по программированию и видео курсы. Подскажите, где рассказывается как юзать не стандартные библиотеки API в программах? Например всякие arpa/inet.h winsock.h sys/socket.h sasl.h
>>1022064 В жс есть ссылки, то есть те же указатели, только всегда гарантированно валидные (или не валидные, и тогда это серьезный баг в движке JS, за который можно срубить бабла).
И да, почему в литературе почти нигде не упоминается про стандарт С95? Хоть он и был расширением к основному в то время стандарту - С89/С90, почему он не заслуживает упоминания?
>>1022188 > взглянуть -std=c99 ? А убрали, потому что говно, грозящее переполнением стека и сегфолтами на ровном месте, ну и потому что не приняли в крестах.
>>1022189 Так дополнение же. Никаких киллер-фич по сравнению с C99/11 нет, синтаксис вообще не затронут, только мелкие уточнения и wchar.
>>1022254 03 плюсы это вообще один большой багфикс, а не дополнение даже. Просто этот багфикс в отличие от диграфов и ещё какой-то непонятной хунты оказался кому-то нужен и зашёл.
>>1024175 По частям. Хотя если раньше ты никаких книг в руках не держал, то проблему никак кроме как анальной болью не решить. Если не нюфаг — смотри только то что нужно. Если таки нюфаг — возьми книжку потоньше, благо C небольшой.
>>1024175 > Как прочитать прату (1000 страниц) и не сойти с ума? Разбить на месяц, а лучше два. Вдумчиво читать каждый день понемногу. Стараться понять суть, логику происходящего, а не тратить время на заучивание правил и кейвордов. Обязательно писать хелловорлды на каждую новую для тебя вещь. Собственно, так со всеми книгами, если тебе нужно разобраться, а не ознакомиться.
>>1019934 (OP) Вопрос треду, на сколько живой С в современных реалиях , учу этот ЯП и дико доставляет , но сейчас появляется куча "модных" ЯП не вытеснят ли они С?
>>1024307 >появляется куча "модных" ЯП Каких? Приведи примеры. >не вытеснят ли они С? Си в основном и полностью живет в программировании микроконтроллеров и в системном программировании. Учитывая, что почти весь код написан на Си, то он еще будет жить очень долго, но в специальных местах, как и любой другой язык.
>>1024323 Ну вроде как я читаю, но мне это все знакомо. Просто нудно читать все это пока не дойдешь до последних глав, где будет новый и интересный материал
>>1024375 На го и scala пишут вебсервисы, причем если го еще компилируемый, то скала работает на джава машине. А на си программируют драйвера и микроконтроллеры.
>>1024389 >без работы не останешься Я тебя разочарую. Если живешь в россии, то как раз таки есть высокий риск остаться без работы, потому что вакансий на С/С++ мало и они в основном в оборонной промышленности. Если хочешь работу, то иди в жс/пеашпи тред и вкатывайся. Сайты нужны всем и в большом количестве, а микроконтроллеры/драйверы - нет.
>>1019934 (OP) Чо такое стандартная библиотека си, точнее как она реализована? Можно ли ебашить на си под чистое железо без ничего? Оно в асм чтоле компилируется и всё?
>>1024307 Даже если все перекатятся на "модные" языки, сишечка все равно - этакий английский от айти. Нужно хотя бы уметь ее читать. Вторым таким языком понемногу становится питон.
>>1024392 > embbed почти целиком на Си Если под архитектуру есть гцц, то нередко на "Си с классами".
>>1024525 > Можно ли ебашить на си под чистое железо без ничего? Можно, но обычно некоторое количество асма все равно нужно (грубо говоря, лоадер, чтобы минимальный набор железа инициализировать, загрузить код с какого-нибудь флеша, инициализировать проц, прерывания, стек и т. д.).
>>1025036 Делаешь что-нибудь вроде #define TYPE int, инклудишь какой-нибудь foo.с, в котором вместо нужного типа TYPE, после инклуда делаешь #undef TYPE int. Потом можно использовать _Generic для автоматического выбора нужной функции в зависимости от типа. Но лучше так не делай. Если жизненно необходимы шаблоны - используй кресты.
>>1024398 Активных контрибуторов всяких линупс-кернелов и всего похожего заграницей с руками отрывают, на самом деле. Так что вполне себе даже вариант для съеба.
>>1024389 > если вкатываться в глубь С и математику , то без работы не останешься? В РФ работы мало и она оплачивается хуже, чем какая-нибудь Java. мимо 7 лет системного программирования
>>1020646 >принудительно SIGKILL-нуть и тут же вызвать waitpid SIGTERM + waitpid. SIGTERM должен корректно обработаться в дочернем процессе. Ну либо IPC прикручивай и следи за стейтом.
>>1024389 >Спасибо анон , то есть если вкатываться в глубь С и математику , то без работы не останешься? Если middle/senior, то не останешься. Оплачивается тоже ничего, мне 200к в ДС предлагали, например, за матан и C, только не мой профиль там. Вот нормальное место найти, чтобы до соответствующего левела дорасти - это может быть проблемой.
Расскажите, как программируют на Си под голое железо? Вот допустим я хочу вывести хеловорлд на си, но у меня нет ничего, кроме UEFI/BIOS. Что делают в этом случае?
>>1025938 Ну ты берешь и реализуешь стандартную библиотеку. Например, printf с помощью int 0x10 или прямой записью в видеопамять. Или реализуешь какую-нибудь прослойку, на которой реализуешь printf. И так для каждой использованной функции.
>>1026009 >printf с помощью int 0x10 Это на старых биосах, а на EFI? >прямая запись в видеопамять Это надо драйвера писать? Или что надо сделать, чтобы в видеопамять писать и выводить на экран?
Парни, а почему иногда MSVS пропускает gets_s()? Очень рандомно, и очень бесит. Имеется в виду, что во время выполнения тупо проскакивает эту функцию. В MinGW этой проблемы не наблюдается.
>>1026242 Может у тебя остается символ новой строки в буфере? Типа scanf("%d", &n); fgets(buffer, sizeof(buffer), stdin), и ты такой вводишь число, нажимаешь Enter, и gets у тебя получает только символ новой строки. Проверь, что возвращает, и что кладет в буфер.
Есть один даун (я), и я прошу помощи. Кровь из носу нужно использовать функцию MD6. Нагуглив единственную реализацию, я собрал оригинальную прогу - все пашет. Попытался использовать этот код и заголовки - соснул, пишет undefined reference. Так вот, как бы его заюзать-то? https://groups.csail.mit.edu/cis/md6/downloads.html
>>1026541 Несмотря на всю очевидность, я до этого не догадался. Ну ебана. Хотя я не сказал бы, что это будет удобно использовать, но, видимо, придется.
>>1026564 Заебись. Возникла необходимость собрать это в Студии. А она ругается на повторяюшееся определение, хотя там такого нет и MinGW это съел спокойно. Заебись.
>>1027478 Дай угадаю, ты определил функцию с именем compression_hook, хотя должен был присвоить указателю compression_hook адрес функции, названной как-нибудь по-другому?
>>1027485 Маленькая поправочка - не я, а некий профессор из США. Но что-то такого я там не замечаю. И MinGW это переварил без проблем. Ну и вот собственно все, что по этому в исходниках и заголовках находится
>>1027485 Хотя погоди. У тебя же кресты, а кресты тебе не сишечка, там логика другая. Думал, расширение сменил, и норм будет? Короче, сходи в md6.h, напиши там extern перед compression_hook, и еще само объявление скопируй (без extern) куда-нибудь в начало md6_compress.c, вот тогда соберется. Если не будет extern, у тебя будет по переменной на каждый файл, куда инклудится .h, если не воткнешь определение без extern в одном из .cpp, тебя спросят, а гиде собственно переменная. В Си же для деклараций глобальных неинициализированных переменных extern подразумевается автоматически, а если инициализация так и не найдется, линкер создаст переменную вместо тебя.
>>1027502 Что-то я нихуя не понимаю, особенно про делай после ретурна. Но если подумать, то tmp = 10000000 , а потом 7 раз сдвигается в единицу. Т.е. чтобы было отлично от 1 нужно чтобы if(DO) сработало ещё хотя бы один раз, чтобы оно не значило.
>>1027514 DO просто сыпет восьмибитные числа. На выходе "Data" иногда появляется "1". Значит что-то проходит (0b00000001 или 0b10000000). Какого чёрта оно отрубает остальные 7 бит? Вот это я не понимаю.
>>1027502 > if (DO) temp |= 0x80; Если в DO (видимо, выходной порт shift-регистра) не ноль, ты ставишь старший бит числа (или не ставишь: если на выходе регистра ноль, у тебя старший бит тоже будет 0). Потом сдвигаешь число вправо и сдвигаешь регистр вправо. Таким образом, повторив цикл 8 раз, ты пишешь в temp бит за битом содержимое регистра. Почему у тебя получается что-то неожиданное - искать тебе. Смотри схему, смотри, откуда в регистре содержимое.
> delay после return Не сработает, не нужен. Разве что выравнивание кода какое.
>>1027527 Поставь лог внутри if, и узнай когда он срабатывает. Меня это > DO просто сыпет восьмибитные числа. как-то напрягает. Ведь условие IF(DO) это тоже самое если if(DO !=0 ) Если там не только 0 или 1, то он может слишком часто срабатывать или хз ещё чего.
На чистой сишке в студии 2017 можно уже писать? Хочу обмазаться винапи и чистым си и заебенить какое нить приложение. Как пример беру эту апликуху https://github.com/hfiref0x/WinObjEx64 стоит ли на неё ориентироваться?
>>1027597 > А почему тогда не вижу Потому что Microsoft официально забила на Си в юзермоде (хотя ядро у них по-прежнему по большей части на Си). Создавай крестовый проект, сохраняй файлы как .c, и они будут компилироваться именно как Си. Алсо, раньше были ключики /TC и /Tc<filename> (должны были остаться), которые говорят компилятору работать с Си вне зависимости от расширения.
>>1027741 Ну вообще достаточно IDA. В каких-нибудь PETools/LordPE есть редакторы и вьюверы разного рода, ну или можешь какой-нибудь CFF Explorer взять.
>>1027502 >>1027514 >>1027529 >>1027537 Короче разобрался. Проблемы было две: Сдвиговый регистр не 8 бит, а целых 32! И часть входных данных отсекалась. И ещё с таймингами проблемы, пришлось замедлить MCU и delay`в добавить.
Анон, спасай. Для Visual Studio 2017 нужен плагин подсветки SASS. Web Compiler подсвечивает SCSS, а вот за sass очень обидно. В гугле нашел только протухший SassyStudio.
>>1028412 >>1028410 >SCSS — "диалект" языка SASS. А что такое SASS? SASS это язык похожий на HAML (весьма лаконичный шаблонизатор), но предназначенный для упрощения создания CSS-кода.
вот первый раз про эту хуйню услышал, да еще в ситрхеде. смузихлебы уже реально не могут в ксс в нотпаде и придумывают всякую поеботу?
Не получается заебенить экзешник в 1кб как тут учат http://eax.me/winapi-dev-environment/ На первой проге с изменёнными настройками проекта 1кб, у меня 2кб. На второй проге с меседж боксом у автора 2кб, а у меня 3кб. Откуда берётся этот сраный килобайт? Юзаю visual studio 2017 community edition на семёрке. >>1027588 кун
Аноны, спасайте. Есть два целых числа, их надо разделить и представить результат в double. Но как бы я не исхитрялся, в результате получается огромное число, не имеющее никакого отношения к реальности. Как это сделать?
Код: int a = 5; int b = 2; double res; res = (double) a / (double) b; printf("Result: %d, \n", res);
>>1019934 (OP) Всем привет, у меня появилось желание написать 2d образовательную игру на чистом C, чисто как челледж, с пиксельным графоном и тд. Программирую на питошке, С дается очень сложно, вот прямо со скрипом. Во вторых я не понимаю как писать игры без ООП, ну воот до меня что-то не доходит. Есть те кто пытался? Подкиньте литературы, библиотек, поделитесь опытом.
>>1028712 Благодарствую! Скажи, а что за makefile такой? Только слышал о нём. Получается работать буду всё же в студии, но билдить/дебажить где то в другом месте?
>>1028959 Можешь те же самые ключики выставить в настройках проекта студии. Посмотри, там где-то можно было прямо текстом additional switches прописать. Алсо, зачем тебе вообще этот дроч на размер? Я еще понимаю, когда стремятся уместиться в десятки килобайт вместо сотен. Или ты демки делать собрался?
>>1028978 На длинных строках сосет. Но тут строка влезает в нормальный монитор даже при наличии IDE с боковой панелью (на ретроградов с вимом и лимитом в 72/80 символов на строку традиционно насрать). Так что в принципе норм и тернарным оператором. Я бы, возможно, сделал ctx->reloc = NULL у нас тут не кресты при создании ctx, и выкинул бы ветку else в твоем коде. А вот ставил бы ты скобки в K&R стиле, тебе не жалко было бы тратить строки, и вопроса не возникло бы.
>Можешь те же самые ключики выставить в настройках проекта студии. Посмотри, там где-то можно было прямо текстом additional switches прописать. Уже заметил
>Алсо, зачем тебе вообще этот дроч на размер? Вобще всегда хотел попробовать злокодинг из за любопытства. Думал сначала написать кулхацкерский троянвася1337эдишон, ну ты понел, но чёт стало стрёмно да и вредить не хочу, переметнулся на создание читовлюто ненавижу читеров, но щито поделать, вроде там можно относительным злокодингом занятся и не вредить никому, кробе разрабов ест-но. Думал, если размер будет меньше и бинарник как можно "чище" от всего остального, то он будет легче криптоваться/паковаться. Думал в будущем просто криптовать бинарник что бы менять его сигнатуру. Но я наверное дебил, это мои догадки, не знаю где и как про это узнать и уж тем более кого спросить.
А вобще вся эта поебень с низкоуровневым программированием аля чистый си и винапи почему то доставляет мне удовольствие. Как будто нахожусь на самом низком уровне в системена дне ебаном. Даже лабы по винапи в институте писал с теми же статьями про экзешники в 1кб "без всего лишнего", отрубал нахер crt и использовал только то, что винда давала, оттого простые консольные лабы превращались в лёгкоетяжёлое садо мазо, ведь консоль нужно создать, в неё писать и закрывать её. Раньше получалось захерачить 1кб бинарник, а теперь, в студии2017 почему то нет.
>>1029033 > можешь попробовать у себя сбацать Я уже попробовал, у меня хелловорлд 1.5 КБ в 32-битном бинаре и 2.5 КБ в 64-битном. Не представляю, как отключить генерацию отладочной датадиректории, которую оно пихает в бинарь даже в релизе и убрать .idata внутрь .text. Собственно, если .idata убить, то будет как раз 512 байтами меньше. Но проще свой линкер написать или какой-нибудь ld/ulink прикрутить, чем ебаться.
>Не представляю, как отключить генерацию отладочной датадиректории, которую оно пихает в бинарь даже в релизе А как ты это определил? Через какой то декомпилятор смотрел?
А если поставить например студию 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 отправить ему данные и получить от него данные назад? Желательно в кроссплатформенном виде.
>>1019934 (OP) Написал минималистичный PE-лоадер и успешно загрузил им хелловорлд на masm32, в котором есть секция релоков. Когда я попытался загрузить этим лоадером многопоточную программу, собранную студией, лоадер рухнул. В этой программе были секции .text, .idata, .tls, .gfids, .00cfg, .rsrc, .reloc. Почему загрузка провалилась? Это из-за TLS и какого-то дерьма в секциях типа .gfids?
> лоадер рухнул А ты знаешь такую штуку, называется отладчик? Он дает какую-нибудь информацию вместо кофейной гущи и пустых предположений. Алсо если рухнул твой лоадер, то в нем есть ошибки.
>>1029454 У Кэролайн хуевые ASMR получаются. Она гонит сотни одинаковых видео про потирание и нашептывание бинауральному микрофону без всякого разнообразия. Внешне рыжая сучка, понаехавшая из США в Германию, охуенная, но ее ASMR делает мне cringe и становится несмотрительным.
Попробовал пару идей, и вроде все скомпилировалось и запустилось, но вот незадача: 1. Оптимальность. Если слов больше 10к, то программа не будет работать корректно. Если меньше, расходуется лишняя память, пусть и малое её кол-во(всё равно косячно). Посему встаёт вопрос, сколь реально решить оптимально данную задачу со знаниями, которые по учебнику у меня должны быть в данный момент? 2. После подачи EOF на getchar ничего не происходит. Не рисуются гисты, ничего. Оставил в коде комменты, чтобы понятней было, на листочку расчерчивал примерные итерации, ошибки по идее нет, но она есть. Ломаю голову уже часов 6, ничего не могу понять. ПОМОГИТЕ!
> Оптимальность. Если слов больше 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 в винде ты, наверное, уже знаешь. На более неочевидные вещи ты напорешься сильно потом.
>>1029981 Да, ты прав. Но пятью можно кодировать вплоть до 0x7fffffff. Всегда так делаю, срать хотел на консорциум, использую излишки на технические нужды. Ввод извне декодирую по стандарту, естественно.
>>1029975 Огромное спасибо. Я оказывается дурак, очевидного не увидел. Накостылил, блин.
>Похуй. Плохо же?
>Не сохраняй слова. Тебе не нужны слова для построения гистограммы. Тебе нужны длины, вот их и храни. Длины вроде бы и сохраняю в массив. А про ограничения не подумал.
>>1030025 > плохо же Пока у тебя используется полсотни килобайт, да еще на стеке, тебе вообще не нужно думать о памяти (но подумать о подходе к подсчету длин слов безусловно стоит). В будущем тебе еще предстоит принимать интересные решения типа лукап 128 метров и пиздец кэшу vs. лютые тормоза на бранчах и пиздец конвейеру - тогда и будешь переживать.
> Длины вроде бы и сохраняю в массив Я код не читал нормально, но ты вроде зачем-то сохраняешь длины каждого слова, тогда как стоило хранить в ячейке массива количество слов с длиной, соответствующей ее индексу (ну или с длиной = индекс + 1, если ты у мамы эстет).
> В чём существенные различия стандартов? В C11 выпилили gets() (используй fgets()). В остальном код C89 вполне скомпилится без или с минимальными правками. Разве что не приучайся пользоваться старым способом декларации аргументов функций (когда в скобках пусто и/или аргументы задекларированы между () и телом) и еще неявным int (например, main() { puts("Hello"); } и прочие register foo = 1) - просто считай, что этого говна в языке нет.
> Или стоит учить определённый? Новые стандарты по большей части надмножества старых (обратная совместимость, миллионы строк уже написанного сишного кода, вот это все). Прату после K&R прочитай, там есть про C11, на текущий момент это последний, C2x еще не скоро. Под какой стандарт ты будешь писать - зависит от компилятора и работодателя. Кто-то вон до сих пор сидит на C89 и злобно выпиливает из кода случайные "C99измы" (чаще всего это опенсорс с портируемостью головного мозга, ну или embedded, когда компилятор кастомный и древний одновременно).
>>1019934 (OP) Изучаю С по пику. Там присутствует задачка по написанию програмки по подсчету карт в блекджеке.Изучается if и switch Краткий алгоритм програмки: 1)Проверяем карту. Если король, валет или королева то оцениваем карту в 10 2) Если туз, то оцениваем в 11. 3) Иначе atoi 4) Поверка на недопустимый ввод\выход\обнуление счетчика 5) Если цена < 10, то уменьшаем счетчик 6) Если цена >=10, то увеличиваем. 7) Вывод 8) Пускаем по кругу
Однако, к моему стыду, switch оказывается работать. Вроде по книге все делаю. Не в один в один. Слегка переделал програмку однако все равно - хуй. Хелп, анон. https://pastebin.com/yWfgvyAt
>>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> содержатся лишь прототипы функций). Специальным ключом можно отключить при компиляции эту линковку и писать ядра ОС, загрузчики и другой низкоуровневый софт, не требующий ОС.
>>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 >(в том числе, он, например, может автоматом создать проект для студии). Т.е. через него, я смогу сделать себе шаблон проекта на си и что бы без лишнего для студии?
>>1030383 ARM же. GNU ARM + OpenOCD. Оба гуглятся, в каком-нибудь арчике есть прямо в репозиториях, ничего качать не нужно. Надеюсь, STLink у тебя есть.
>>1030381 > но я не на столько разбираюсь в этом на данный момент > не знаю как использовать эти линкеры-хункеры Я тебе выше командную строку кидал. Готовую. Всего-то делов - спиздить polink.exe из дистра Pelles C.
> что за либы .lib и почему я должен их импортить Ты их не импортируешь, ты с ними линкуешься. А в либах этих лежат куски, из которых с помощью магии и сортировки по алфавиту собирается таблица импортов .exe. Ну это если ты про всякие import libraries типа user32.lib спрашивал.
> выдаёт ошибку Где ошибка? Алсо, если собирать по туториалу тому, будет 3 КБ, а то и больше.
>>1030382 > что бы без лишнего для студии? Нет. Без разницы, как именно ты будешь вызывать студийный линкер, это он портит всю малину, и он будет ее портить как с ручным вызовом командной строкой, так и через CMake. При этом, с CMake еще и поебаться придется, это такая технология, которая сделана нелюдьми для нелюдей (особенно на винде).
Хелп ми, двач. Или лыжи не едут, или какого хуя в гетчар нельзя засунуть символьную константу? Ругается именно на эту строчку и я просто не понимаю почему
Решил вкатиться в погроммирование. В приличные конторки не пошел (я не умею программировать, только в алгоритмистику могу), а вот в нии решил тестовое задание и попал на работу. Получил задание, первый день отработал. Насколько я понял, назвать мою (и всего нии) работу "программированием" сложно. Скорее это решение некоторых сложных физических задач численными методами. Программирование занимает лишь часть времени, значительная часть (и не только у меня, но даже у коллеги-доктора) - курение мануалов или разработка нового скорее "подработка старого" численного метода для задачи. Возник вопрос. А эта хуйня вообще кому-то нужна или удел всяких физических нии? Стоит вкатываться или это болотце, единственным вариантом развития в котором является дрочь на научные знания, аспа и статейки в ваковских журналах (я глуповат, вряд ли смогу в статейки)?
>>1030956 Добавлю, что плюсов нет. Я сказал, что умею лишь в плюсы (и то посредственно), мне ответили: переучивайся, плюсы ненужное говно. Я думал, ненужное говно С.
>>1030956 Рашкинские нии это такой мультиверс полный чудес, каждая инста почти как новый мир: можно найти и глухой тупой совок, и даже иногда мир полдня, как у стругачей.
Это совсем не программирование и не имеет ничего общего с ни с computer science, ни с греблей.
Но некоторый спрос есть, обычно со строны прикладных исследований. В этой стране, например, актуальными задачами являются посчитать динамику вязкой жидкости в какой-нибудь инновационной трубе, или там отражение радиоволн от летящего сверхзвукового обекта, ну или там подобрать конфигурацию антенны и механизм шифрования, штобы сигнал было трудно перехватить. Корпорации, которые этим занимаются, на ярмарках вакансий и на собеседованиях смотрятся не слишком хуже, чем полноценная галера, внутро не ходил, ибо аспа, грант и дроч на научные знания в вакховских журналах.
Пишу с нулевой, к С это отношения не имеет, язык в такой тусовке вторичен и зависит от специфики задачи и нии.
>>1030958 >плюсы ненужное говно. Мужики дело говорят. Видел недавно в новостях, что разработчики буста перекатились с собственного велосипеда на CMake наконец-то. Хотя асинхронщина что в сях, что в крестах это больно.
>>1030993 > отражение радиоволн от летящего сверхзвукового обекта Угадал. Впрочем, пока моя задача скорее напоминает курсовик третьекурсника, чем что-то серьезное.
>>1019934 (OP) Пиздец, какого хера линкер помещает переменную i в .bss, а переменную off в .data? Из-за этого в i оказывается мусор, потому что я не обнуляю .bss в RAM. Почему линкер такой пидор?
Будет ли какое-либо увеличение производительности, если UDP сервер с большой нагрузкой будет разбивать коннекты по портам, или порт - просто абстракция?
>>1032016 Я хочу, чтобы сервер мог держать огромное количество клиентов и общаться с ними по UDP максимально быстро. Будет ли ускорение, если распределить клиентов по портам?
>>1031930 > какого хера линкер помещает Как раз именно того самого хера, что он ожидает нули в .bss. Это оптимизация такая, чтобы не хранить нули в бинарнике. Напиши кастомный скрипт для ld, чтобы он этого не делал, в чем проблема-то?
>>1032022 Вряд ли. Хочешь ускорения - делай больше потоков-обработчиков. Кстати, огромное - это сколько?
>>1032245 40к, как в eve >>1032385 По 10-50 клиентов на 1 порт. Нет привязки клиента к порту, есть просто распределение, вопрос в том, будет ли от этого увеличвние перфоманса
Объявление функции линкер рассматривает как символ, который можно заменить другим символом с таким же названием, если он встретится в дальнейшем при линковке? Объясни подробно, как происходит замена этого дефолтного прерывания пользовательским обработчиком.
>>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 - это тоже ошибка (опять же в реальности возможны некоторые варианты). .......
Пишу библиотеку длинной арифметики над конечными полями. Как эффективнее всего реализовать сравнение двух 256-битныхчисел, представленных пятью chunk'ами, в которых хранятся "цифры" размером 51 бит? Я реализую операции так, чтобы они могли выполняться над всеми цифрами числа одновременно за один такт, и для этого не использую прибавление с переносом adc. Сравние я тоже хочу сделать эффективно, чтобы оно выполнялось за такт над всеми чанками. Как? Одно условие с несколькими &&?
mov TempReg, [rax] shr TempReg, 51 add ebx, TempReg ; в ebx - следующий чанк, к нему прибавляем carry and [rax], маска обнлуляющая carry бит и все старшие биты
Тут используем сокращенную запись чисел: 256 бит делим на 5 частей, в каждой части получается 51 бит. При сложении таких цифр переполнения не возникает,и дорогостоящая операция adc не нужна. Все carry, однако, нормируем самостоятельно.
>>1034235 Ну все это к тому, что над векторами процессор может выполнять операции за такт, но при этом теряются carry, т.к. замедляют процесс. Поэтому нужна вся эта магия со сдвигами и масками.
Если я буду реаллокать char, то по сути все, что лежало в этом массиве будет лежать в новом, так? Будут ли утечки памяти при этом и высвобождает ли realloc ранее выделенную память? Вопрос встал потому, что сначала должны быть высвобождены все char, потом char, потом сам char*, чтобы не было утечек
>>1034826 Как именно он высвобождает? Если я ему подам тройной char, то он снесет сразу его или начнет с более "низких" указателей? Т.е. сначала чар1, потом чар2, потом чар3. Если так, то все хорошо. Если же нет, то сто процентно будет утечка. Я именно это хоте уточнить
>>1034819 > то по сути все, что лежало в этом массиве будет лежать в новом, так? так > realloc ранее выделенную память эмм, ну должен вообще-то. Почитай man realloc. > Вопрос встал потому, что сначала должны быть высвобождены все char, потом char mi ne komprenas vin, ja tvoja ne ponimat?
>>1034819 malloc/realloc/free абсолютно похуй, что конкретно у тебя лежит в куске памяти. Все, о чем они знают - размер и адрес этого куска. Так что, если у тебя массив указателей, то realloc() сами указатели-то тебе, конечно, скопирует в новое место (или наоборот лишние из хвоста выкинет, если новый размер меньше текущего), но о том, что там указатели, он не знает и знать не может, поэтому если ты не озаботился - утечки будут. У тебя язык с ручным управлением памяти, каждым своим указателем ты рулишь сам. Сам насоздавал - вот и высвобождай все сам.
>>1035236 char ∗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 оно само освободит, тебе не нужно об этом думать. Никаких утечек в этом смысле.
>>1035281 Да все просто. Есть char ∗∗lineptr, у постфиксного ++ приоритет выше, чем у звездочки. Соответственно ++ увеличивает lineptr (и lineptr теперь указывает на следюущий char ∗), но до того, как постфиксный ++ что-то сделает, он (так как он постфиксный) "кладет" в выражение текущее значение lineptr значение, а звездочка читает из этого значения char ∗. Путаешься в указателях - обязательно смотри в отладчике (желательно в голом хексдампе памяти), путаешься в приоритетах - расставляй скобки, объявляй временные переменные. Алсо, попробуй думать об указателе, как о массиве (из нескольких, а иногда и из одного элемента) значений того типа, на который он указывает. Ну типа: ∗lineptr++ это char ∗line; line = lineptr[0]; ++lineptr.
>>1035304 Спасибо за разъяснения, переспал с твоими сообщениями, понял, что запутался, так как не сразу понял, что в printf и нужен указатель на строку.
Гайс, как создать массив объектов класса? К примеру : for(int i = 0; i<VariableList.threads; i++) VkApi Api = new VkApi(); Что бы в последующем мог использовать Api[0].Auth(); Api[1].Auth(); ... и т.п ?
Аноны, вот основы синтаксиса прочел, "опыта" на laba1 набрался. Интересует вот какой момент: где почитать про Си и сети? Как делать пост/гет запросы и прочее?
Всем привет! В процессе написания кода иногда приходится printfами выводить какие то значения или состояния, захотел эти конструкции обернуть ifndef DEBUG endif. Т.е хотел определить глобальную переменную DEBUG и если она определена,то выводим вспомогательное сообщения, если нет, то не выводим. Но как вы понимаете не получилось, гугл кидает на использование этой конструкции при подключении .h файлов. Помогите пожалуйста разобрася, спасибо.
Почему после 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х, это тебе не винда.
Задача такая. Есть два канала. Нужно считать из них данные и вывести. Но при этом делать это с помощью селект, чтобы не дожидаться одного из них, а потом второго. Почему-то если со стандартным вводом (если написать fd1 = 0) работает, а с файлами -- нет. https://pastebin.com/AiyETnxA Помогите, люди добрые.
Может вы знаете? Как протраверсисть дерево без рекурсии? Я спрашивал у С++-уёбков, а они послали меня делать конечный автомат со стеком. Может, есть какое-нибудь решение попроще?
>>1037845 когда ты потеряешь работу потому что на твое место взяли молодое мясо - студентика выпускника, и твоя шлюха соскочит с твоего пинуса на другой, надеюсь ты вспомнишь что нехуй помогать собственным прямым конкурентам
>>1038235 Ебать ты мелочный. Ты сильно переоцениваешь свои возможности, считая, что твоя "помощь" или ей отсутствие может как-то сильно повлиять на состояние окружающего мира. Фактически, этот мир практически никак не изменится даже если тебя совсем не будет.
>>1038233 С рекурсией ты просто используешь аппаратный стек неявно. И без рекурсии тебе тоже нужна какая-нибудь вспомогательная структура данных. Стек там или очередь. Да и куда уж проще-то? Стек из массива фиксированного размера хуячится четырьмя строками, считая обработку ошибок. Для начала кладешь корень, потом в цикле достаешь узел/кладешь его потомков, повторяешь, пока в стеке что-то есть.
Нужно запрограммировать две функции. Есть два варианта как это сделать.
1. double func1(всякие переменные); double func2(double(...), всякие переменные); В этом случае вторая функция реализуется элементарно и обладает некоторой вариативностью -- вместо func1 в нее можно засунуть кучу разных функций. Но норм пацаны почему-то (из-за необходимости потратить пару тактов на присвоение результата функции некоторой переменной?) так не делают, они делают вот так:
2. int func1(всякие переменные, double result); int func2(всякие переменные, double* result); В таком случае внутри func2 придется явно вызывать func1 или существует способ этого избежать?, вариативность теряется.
Какой способ выбрать? Первый мне ближе (потому что именно он обычно используется в других языках), но вроде бы хорошим стилем является второй способ. Как пофиксить второй способ таким образом, чтобы в него можно было засовывать разные функции, а не просто запустить func1 внутри?
>>1038251 > Ну и нахуя такая монстроузная конструкция Это мне надо без стека? Я-то откуда знаю? Видимо, чтобы не ограничивать уровень вложенности. Алсо, не вижу ничего монструозного в нормально написанном обходе дерева, если это не лаба1, а что-то применимое на практике.
>>1038245 Не совсем понятно, что именно ты там считаешь. Если тебе reduce нужен - делай reduce с колбеком, это нормально. Если функция считает какую-то конкретную вещь, тогда нахуя ей эта твоя вариативность?
>>1038256 func1 - обычная математическая функция (правая часть диффура второго порядка). func2 - численный метод решения диффура.
Формально мне нужно решить один-единственный диффур, просто начальные данные будут различаться. Но вангую, мне регулярно придется писать что-нибудь подобное, так что хотелось бы написать в общем виде.
Смотрел код начальника. У него кругом указатели, препроцессорные директивы и функции именно второго варианта (то есть функция что-то делает с какой-то переменной, переданной по указателю, а выход unt просто говорит о корректности работы функции или о коде ошибки).
Никак не пойму. Как выделить структуру определенного размера? Например, под 512 байт. До этого создавал структуры и описывал в ней переменные, где по типам было понятно, сколько они займут места. Но сейчас мне надо выделить просто большую область для использовании в функции fread. Как это можно сделать?
Оказывается с графом на связанных списках вершин и рёбер работать намного удобнее, чем с корявым деревом. Как же охуенно стало! который-спрашивал-про-траверсинг
>>1040866 Завтра ищешь в интернете книжку K&R The C Programming Language. Похуй если ничего не поймешь. Затем идешь на cplusplus.com и изучаешь стандартную библиотеку от корки до корки. Потом зубришь, именно, сука, вызубриваешь конвенцию по написанию сишного кода - ANSI C, чтобы от зубов отскакивало. Когда напишешь свое первое ядро, по пути изучив ассемблер, покупаешь и изучаешь любой микроконтроллер, рекомендую TMS570. Как переделаешь ядро, чтобы было по крайней мере не монолитным, можешь идти дальше - тебя ждет увлекательный мир байтоебства. Byte stuffing, сверхбыстрые O(1) алгоритмы, экономия тактов процессора. Отсос хиккующих выблядков / просто неудачников типа рейфага или сисярп/джава-хуесосов, которые сосут хуй по жизни не заставит себя ждать и уже через пол года ты будешь собирать бинарники с такими флагами оптимизации, что любая баба будет течь при одном упоминании твоего тулчейна.
>>1019934 (OP) сап программач, дайте инфы для проекта нуфагу как работать с файлами и директориями в шиндовс, ну типа удалять создавать папки с реестром взаимодействовать
>>1041826 > #include windows.h Для подключения ведра винды. В C/C++ нет стандартных функций для работы с файловыми системами. А что такое реестр они вообще не в курсе.
Анончики, помогите советом. Выбрал C, из-за высокого уровня возможности оптимизации. Планирую в дальнейшем под конкретное железо писать либы под нейросети. Правильный ли выбор языка я сделал? Используют ли вообще C для нейросетей?
>>1041897 >L I S P Можно чуть подробнее? Сколь востребован в нынешних реалиях в Рахе? Сколь востребован за бугром? Жив/Мёртв? Подходит ли для современных нейросетей? Есть на данный момент какие фатальные недостатки синтаксиса?
>>1041900 Востребован как и нейросети, т.е. мёртв. За бугром используется для рекламы топовых железяк и ВЫСОКИХ технологий и выкачивания денег на самоуправляемое дерьмо. У нас денех не хватает на такое. Если быть серьёзным, у меня, как видишь, довольно мрачное представление об этом, но ты и вопрос задаёшь такой, что правильно хрен ответишь.
>>1038245 >>1038256 Я только вчера понял, как сделать это симпатично. Просто писать указатель на функцию вида int(type1 param1, type2 param2, ..., typen paramn, void params). В void пихать всё говно. И для реальных функций, использующих много разных переменных, писать что-то уровня обертки, которая будет запихивать факультативную часть переменных в params.
Вангую, такому дерьму учат на первом курсе шараги. И как меня на работу взяли с такими знаниями?
>>1042483 Это не подошло бы. Функции (значительная часть из которых написаны давно и их нельзя изменять) вовсе не обязаны иметь схожую сигнатуру и отличаться лишь последними факультативными параметрами.
>>1042522 > Просто писать указатель на функцию вида int(type1 param1, type2 param2, ..., typen paramn, void params). В void пихать всё говно. > И для реальных функций, использующих много разных переменных, писать что-то уровня обертки, которая будет запихивать факультативную часть переменных в params. > Функции (значительная часть из которых написаны давно и их нельзя изменять) вовсе не обязаны иметь схожую сигнатуру и отличаться лишь последними факультативными параметрами. Таблетки принял?
>>1042527 Есть обязательные параметры: double x double t int 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) И так далее. Это можно написать с помощью функций с переменным числом параметров?
>>1038245 В первом случае ты никогда не узнаешь, завершилась ли функция с ошибкой, а это первое, что хочется проверить после вызова, а результат уже дело десятое.
>>1042536 Ты, конечно, можешь передать любую из этих функций воид-поинтером, но как ты собрался их потом вызывать?
>>1042570 >новичок >современные стандарты Современные стандарты нигде не используются. Единственная реальное приложение - это Qt. Книга учит писать идиоматический код на С++
>>1042571 >Современные стандарты нигде не используются Охлол. У меня на обоих работах C11, и мои проекты C11, и опенсорс выбираю, который не застрял на C89.
>>1042651 > И тут ты такой нам показываешь, что именно не умеет gcc, и почему без этого невозможно жить. А что умеет 11 из того, чего люто не хватало на 99? Без этого невозможно было жить?
>>1042651 >И тут ты такой нам показываешь, что именно не умеет gcc, и почему без этого невозможно жить. Ну ладно, умеет во все, но threads.h есть только в васянских библиотеках.
>>1042665 Не хватало static_assert без извращений с массивами отрицательной длины - костылем менеьше, атомики - огромной кучей костылей стало меньше, кроссплатформенный _Thread_local.
> Без этого невозможно было жить? Жить можно было и без этого. Но тот факт, что язык и компилятор официально знают о существовании тредов (вне зависимости от наличия threads.h), он очень радует.
>>1019934 (OP) Как с кириллицей работать в C? Вот достал кириллическую строку char *string из argv и дальше ее нужно сделать uppercase и какой функцией это проделать? toupper(ch) - игнорирует кириллицу Ебатся теперь с wchar_t?
>>1049614 Классическая ошибка на 1. Размер массива - 9, чисел ты вводишь 10 (у тебя диапазон включает и 0, и 9). Ты выходишь за пределы массива, и последняя девятка в выхлопе, видимо - значение переменной i или просто какая-то временная переменная.
Аноны, читал K&R, дропнул на средине т.к. мне подогнали бумажного Стивена Прата, которогоя только что дочитал. Есть ли смысл продолжать K&R? Заранее благодарю.
Нужно работать с питуном через C api, сишечка на уровне laba3, можно просто начинать все сначала учить или из-за специфики задачи часть можно опустить?
>>1050615 Ну нам-то откуда знать, что именно ты там делаешь, и насколько глубокие знания тебе понадобится. В части взаимодействия с питоном все просто, и примеров овердохуя, но ведь тебе еще и что-то полезное нужно делать?
>>1050615 > Нужно работать с питуном через C api Что-то удивительное. Я понимаю нужду в работе с си через петухон, петухон обеспечивает пользователеджружелюбность, си - скорость. Получается быстро и удобно. Но если поменять их местами, как хочет антоша, разве не получится медленная и сложная в написании программа?
>>1050849 Я почему-то решил, что анон выше хотел сделать наоборот. То есть ядро на питоне, остальное на си. Так (ну, почти так) и в моем говнонии делают: пишут библиотечки на си, вставляют в питон и потом тестируют, рисуют графенчики и прочее.
Но зачем для этого "Учить все сначала или часть опустить"? Вроде достаточно узнать одно слово на C и один пакет для питона.
>>1019934 (OP) Господа, что вы имеете сказать за rust. Капец сям уже не за горами? Вообще стоит его учить/не забывать (если не под встроенные системы пишешь, конечно)?
>>1050995 Ну сишке конечно ещё очень долго не капец, но вообще Rust медленно но верно приближается к мейнстриму. И вот чего после Rust делать не хочется, так это прикасаться к C или C++.
>>1051164 Так ты приплюсуюй стандартную библиотеку сишную динамически линкованную, которая в системе предустановлена и для любой нехелловолдной программы получится совсем не 800 байт.
Котаны, в некоторых вакансиях значится удивительный язык C/C++. Что это значит? Их устроит человек, знающий только натив си? Имею 3 месяца опыта. После испытательного срока повысили зарплата АЖ НА 5 ТЫЩ. Охуеть теперь, моя зарплата 30450 рублей. Начал гуглить схожие вакансии (цос), везде написано либо C++, либо C/C++ а еще питон или матлаб, но это для прототипирования. На таком уровне освоить питон и матлаб можно за 3 дня.
>>1051588 >На таком уровне освоить питон и матлаб можно за 3 дня Ошибаешься. Матлаб как язык - унылое говно. Ценность его в тулбоксах (стандартных и сторонних). И вот их грамотно использовать ты не научишься за три дня. А уж тем более не поймешь матана, на котором эти тулбоксы основаны.
>>1051588 Это может значить что угодно. Может описание вакансии писла безграмотная тупая пизда HR, которая одно от другого не отличает, а может им таки правда специалист по крестам необходим. Пока не прособеседуешься или еще как-то не провентилируешь вопрос - не поймешь.
Пацаны, хочу получить общие знания о языке. Поэтому вопрос такой, че читать - книгу которая у ОПа или взять Дейтелов лучше? На самом деле прохожу cs50 и там советуют ту, что у ОПа почитать начальные главы, а в гайде на лурке пишут про Дейтелов. В общем, какую взять? Где примеры лучше? Актуальность?
А еще такой вопрос, куда пропал фак со ссылками на все языки в начале борды? Или я просто с утра нихуя найти не могу?
>>1053330 Тут скорее правило, чтобы не было неявных ошибок. Вот например ты передашь строку не как const, а потом захочешь ее изменить. А строки в си неизменяемые, и не каждый компилятор может отследить такую ошибку.
>>1053219 Я параллельно читаю, шоб пропорционально было. В Дейтейлах по 40 упражнений на главу, что солидно, а K&R легко читается и более информативная и сжатая. Всегда так делаю -- книга, где про всё самое нужное + грузный, аки справочник, учебник с кучей упражнений.
>>1053553 Не понял, где ты у Дейтеллов упражнения увидел? Вот в K&R да, есть в конце каждой главы + ещё примеры кода, а вот у Дейтеллов только примеры, да и то не очень.
Пиздец, парни. Пытаюсь писать коротенькие проги в разных IDE и хочу вам сказать, что я за весь день столько говна поел с популярными IDE(VS, Eclipse, NetBeans), что пиздец. Ни в одной нормально не получилось обычный Привет, мир написать. Но тут я установил CodeBlocks и все заработало с первого раза. Почему все так сложно то?
>>1053764 Потому что это уже для крутышек. КодБлокс для хеллоувордов самое то, потому что "из коробки". Хотя вкатать какой-нибудь компилятор в какой-нибудь Sublime - дело пяти минут, гугл ит
>>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 строк:
>>1053763 Сделал, кстати, задачку 4.26. Уже минут 20 жду, пока он выловит первый 3.14159. До них получилось сравнительно быстро. У меня алгоритм получился такой, что результат для ряда из n требует (n^2 + n)/2 операций т.е. сумма арифметической прогрессии до n с шагом один (пикрелейтед). То есть, порядок роста у алгоритма полиномиальный, потому что он много лишних вычислений при новом j внешнего цикла. Говно, конечно, но мне лень переписать пару строчек, чтобы хранить последнее состояние ряда и я хочу спать.
>>1053815 Хотя, мне стало интересно, что там получится, поэтому я тупо убрал верхний цикл, переписал переменные внутреннего под него и таким образом получил линейный порядок роста, посчитав результат за секунду. А вы говорите, SICP не нужен Заёбно было эти приближения ручками считать в каком-нибудь V A.D., наверное.
>>1053815 > А вы говорите, SICP не нужен Мы говорим. Потому что никому в голову не придет делать решение, как в твоем предыдущем посте. Это элементарный здравый смысл, для этого даже про О-большое знать не нужно.
>>1053824 Там было ещё задание на вывод таблицы с рядом из одного элемента, двух, трёх, etc. Мне это понадобилось, чтобы отслеживать и выводить изменения переменных для наибольшей детальности, верхний цикл был до 10. Так что ну зря ты так.
У меня есть самописный бутлоадер на асме, в котором же находится обработчка прерывний/исключений потому как их векторы упираются именно во флэш память. Бутлоадер, помимо своих основных задач, кушает elf-файл по нужному адресу или принимает его по uart, затем парсит, раскидывая сегменты по нужным адресам в ОЗУ, и в конце прыгает в entry_point.
Хочу, чтобы при прерывании, бутлоадер просто сохранял контекст в стэке, а потом передавал управление функции обработки прерываний, которая находится где-нибудь в загружаемом эльфе.
ВОПРОС: как сообщить бутлоадеру адреса этих функций обработки прерываний?
Пока что вижу два пути решения:
1) В бутлоадере закрепить фиксированные адреса для этих функций где-нибудь в cram, и в случае прерывания прыгать по ним. Сами же функции объявлять через __attribute__(__section__), а в скрипте линковщика размещать их по тем самым фиксированным адресам.
2) Парсить symtable elf-файла на наличие функций с заданным параметром name. Этот вариант видится мне лучше, ибо загрузчик будет точно знать, есть ли обработчики прерываний или нет. И если нет, можно просто отключит прерывания. И не будет слепого перехода туда, где возможно ничего нет. Но я замучаюсь парсер писать на асме.
>>1053763 Так, кажись я начинаю догонять. У тебя же издание книги старое, там где в конце плюсы рассматриваются? Если я опять не угадал, напиши год и издательство.
>>1053923 > Но я замучаюсь парсер писать на асме Кто тебя заставляет писать на асме?
> как сообщить бутлоадеру адреса этих функций обработки прерываний А цели у загрузчика какие? Загрузить твой собственный образ и только твой? Тогда фиксированные адреса в тему. Чужие бинарники поддерживаются? Можешь сделать по образу и подобию UEFI: передавать в точку входа загружаемого файла аргументом список сервисов загрузчика, в числе которых функция установки кастомной таблицы векторов прерываний.
Котаны, нашел программу с таким прототипом: int func(бла-бла-бла, double date0, double date1, бла-бла). Мне сказали, что date0 и date1 -- это просто разбиение одного времени на 2 числа для большей точности. И якобы это более-менее стандартная операция. А как именно разбивают? На целую и дробную части? И для того, чтобы все работало, отдельно арифметику писать? Если это на самом деле стандартное действие, не подскажете, где про это прочесть?
>>1054461 Впервые вижу, чтобы разбивали плавающую точку, да и точности в double овердохуя для дат, да и long double завезли. Вот при передаче double на x86-машинах, он как раз разбивается (компилятором, а не вручную!) и передается в качестве двух 32-битных (целых!) значений, т.е., используются два push. А что конкретно происходит в твоей библиотечке, нахуя так сделано, и какой там формат у каждой части, можно узнать, только посмотрев в код. Это никаким местом не стандартная операция.
>>1054402 >Кто тебя заставляет писать на асме? Хм, в действительности пожалуй никто не заставляет. >А цели у загрузчика какие? Загрузить твой собственный образ и только твой? Тогда фиксированные адреса в тему. Чужие бинарники поддерживаются? Да, хотел сделать так, чтобы чужие файлы тоже поддерживались. А теперь даже хуй знает, как лучше сделать. Оставить обработку прерываний и исключений только в бутлоадере. Ведь по идее юзера вообще не должно ебать, как там они обрабатываются. >Можешь сделать по образу и подобию UEFI: передавать в точку входа загружаемого файла аргументом список сервисов загрузчика, в числе которых функция установки кастомной таблицы векторов прерываний. Слишком сложна. Но в любом случае спасибо, попробую почитать про принцип работы UEFI.
Мне вообще интересно, как всю эту ёбань с загрузчиками и программами делают нормальные люди. Так как понимаю, что изобретение велосипеда с квадратными колёсами - хреновый и сложный путь.
>>1054640 >>1054402 Забыл добавить, что на асме пишу, потому что бутлоадер находится в ридонли области. В итоге для временного хранения данных использую регистры в основном, реже стэк. Но, наверно, в сишечке так тоже можно делать.
>>1055334 Не понимаю о чем ты. В общем, для теста я сделал следующее: 1. Написал простую программу на C 2. Скомпилировал с флагом -g 3. Запустил 4. Снял дамп с помощью gdb -q - <pid> 5. Открыл в gdb core file Как дальше смотреть содержимое стека я не знаю. Если запускать программу сразу через gdb и ставить брейкпоинты, то через info locals все переменные видны, но как их посмотреть в дампе я без понятия - на команду info locals отладчик говорит что таблица символов не загружена.
>>1019934 (OP) О, шикарно мой тред! Учусь по книжке Брайана и Ритчи(англ версию, русские сосут хуй), я решил самостоятельно все задачки до той, где нужно подменять несколько пробелов одним. Первую задачку в теме, где нужно вести счёт табов, пробелов и символ новой строки решил сразу же, вторая пошла по пизде, сидел писал разные типы псевдокода, пытался спагетти-кодом придумать что-то, но в итоге залез в стэк и увидел решение, от которого у меня загорела жепа, однако у меня голова уже не соображала, поэтому думаю тут тупость простительна. Ничего страшного в том, что не можешь решить какую то задачку? Как поступать в таком положений? Просто скипнуть и вернуться потом, или все же можно посмотреть решение когда совсем уже заебался? Алсо, что стоит знать об GCC? В первый день потратил часы читая вики по компиляции на винду, в итоге залез на вики Линукса и ввел в cmd просто gcc и название программы как было написано и все заработало. Вот хотел спросить, что нужно о GCC знать?
>>1055451 Я блять, искренне извиняюсь, но я имел ввиду компилятор. В первый раз я его, блядь, пытался запустить, нихуя не понял, а ведь это лучший компилятор даже в сравнений с любой IDE, да и как новичок я обязан знать эту базу. Полез в вики читать, а там много всего. https://sourceforge.net/projects/mingw/?source=navbar Стоит ли полностью наворачивать вики?
>>1055429 >Ничего страшного в том, что не можешь решить какую то задачку? Ничего страшного. >Как поступать в таком положений? Сначала подумать, если все равно не получается, то внимательно изучить решение и попытаться понять его. >Просто скипнуть и вернуться потом, или все же можно посмотреть решение когда совсем уже заебался? Можно и так >Просто скипнуть и вернуться потом, или все же можно посмотреть решение когда совсем уже заебался? Ставь mingw-w64 и просто компилируй в gcc как на линуксе. Или можешь украсть/купить CLion
>>1055513 >попытаться понять его. Так и сделал. >>1055513 >Ставь mingw-w64 Я его и поставил лол! Там дают туеву хучу эмуляторов GNU-like терминалов и обычную версию MinGW64 для винды. Я ее установил, но не мог додуматься как пользоваться, в вики каша, а я и так заебанный. >>1055527 IDE представляет сферу разработки, со встроенным библиотеками, компиляторами и графическим интерфейсом, а комплилятор преобразовывает его язык в низкоуровневый. Если, блядь, я правильно понимаю.
>>1051016 И чего? Сайт этот заставляет всех решать задачу одним и тем же алгоритмом. В реальной жизни такого ограничения нет. И даже в таких условиях почти на всех задачах только чуть-чуть медленнее. Потора-два раза это именно чуть-чуть. Это не в десятки раз. Сейчас чтоб дрочить на порнуху в инете закупают домой пеки эквиваленые по производительности мейнфреймам недавнего прошлого. Купить больше или более дорогое железо для кода на rust дешевле и проще, чем писать, отлаживать и сопровождать "крестовый" код. Мало кому в не-embedded мире действительно критически необходим каждый процент производительности.
>>1051016 И чего? Сайт этот заставляет всех решать задачу одним и тем же алгоритмом. В реальной жизни такого ограничения нет. И даже в таких условиях почти на всех задачах только чуть-чуть медленнее. Потора-два раза это именно чуть-чуть. Это не в десятки раз. Сейчас чтоб дрочить на порнуху в инете закупают домой пеки эквиваленые по производительности мейнфреймам недавнего прошлого. Купить больше или более дорогое железо для кода на rust дешевле и проще, чем писать, отлаживать и сопровождать "крестовый" код. Мало кому в не-embedded мире действительно критически необходим каждый процент производительности.
Парни, а чего в VS теперь на C писать нельзя? Или чего не так с ней? Кст кто-то может ссылку дать на Кочана на английском 3е издание или 4е, если есть. Чет в гугле найти не могу живых ссылок. Только на русском.
>>1056822 Можно. Создай новый Win32-проект, добавь C++ файл с расширением .c. Если книжку не найдешь - читай Прату.
>>1056832 Да, терминал нужен, чтобы запускать программы. Писать код удобнее в текстовом редакторе, но если ты упорствуешь, загугли всякие ed/vi/vim, edlin и edit в винде есть опять же.
>>1056889 Допустим я поставил терминал и в книжке, которую я читаю пишут, что надо выполнить программу. Я выполняю и терминал пишет, что не может ее найти. Это значит, что бинарника нет в PATH, который я указал, так? У меня стоит cygwin. В нем же ниче не написать?
>>1057017 А зачем тебе cygwin вообще? Это мерзкие костыли, с которыми можно смириться лишь заради компиляции некоторых программ, завязанных на POSIX. Если тебе никсовое окружение нужно - возьми MSYS или лучше MSYS2. Если тебе компилировать - поставь отдельно mingw или clang+mingw.
>>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 хотя бы у одного из операндов. И да, точность ограничена, ничего ты с этим не поделаешь.
Пожалуйста, пользуйтесь 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