Тред, посвященный прародителю всех С-подобных языков и по совместительству единственному идеальному и всесторонне годному средству программирования как на системном, так и на прикладном уровне.
- Очевидный GCC. - clang: оче годно, батя рекомендует. - Intel C++ Compiler: оптимизации, тысячи их. - Visual Studio 2017 Community Edition: внезапно этим стало можно пользоваться, особенно с тулсетом clang/C2. Поддержка C11 на уровне "есть все, что тебе понадобится в реальном проекте плюс кривая библиотека". Анализатор кода в комплекте. - Pelles C (шиндоуз онли): поучиться, вкатиться в C11 (стандарт полностью реализован, имеются в том числе threads.h и прочие stdatomic.h), но количество багов в оптимизаторе и редкие апдейты напрочь отбивают желание собирать этим что-то сколько-нибудь серьезное. - TCC: очень маленький компилятор с багами и поддержкой C99. С ключом -run умеет компилировать код в память и запускать его, что позволяет писать скрипты прямо на сишечке.
Samuel P. Harbison, Guy L. Steele Jr. "C: A Reference Manual, 5th Edition" (2002) Ебаный пересказ стандартов C89 и C99 (включая стандартную библиотеку). Для не осиливающих стандарт в оригинале. Читать в качестве подготовки к собеседованиям (есть задачник с ответами) и для ознакомления с масштабами пиздеца перед написанием своего парсера/компилера.
Peter Van Der Linden "Expert C Programming. Deep C Secrets" (1994) "Си: грязные истории". Смехуечки, немного объяснений, чем обусловлены особенности языка, всем известные подводные камни кто там ругал косяки в JS? у нас в сишечке их гораздо больше, просто они лучше спрятаны, немного байтоебли и непонятно откуда взявшаяся глава про старинные плюсы. Читать в качестве сказки на ночь (на пару вечеров хватит).
Richard M. Reese "Understanding and Using C Pointers. Core Techniques for Memory Management" (2013) - почитать, вкатиться в указатели.
Ben Klemens "21st Century C: C Tips from the New School" (2012)
Paul Deitel, Harvey Deitel "C for Programmers with an Introduction to C11" (2013)
Stephen G. Koch@n "Programming in C (3rd Edition или 4th Edition, если найдется)" (2014)
- https://godbolt.org/ - Compiler Explorer позволяет посмотреть выхлоп компиляторов для введенного куска кода (больше полусотни разных версий компиляторов). - http://cdecl.org/ - С Gibberish ↔ English помогает читать сложные сишные декларации.
Чем конст помечается в этих ваших байтах? Может есть какой-то сегмент в стэке или дампе, куда складываются адреса констант и ось начинает членососить за попытку что-либо из этого изменить? Или как оно всё это делается - расскажите плс.
>>1540444 Ничем. const - для программиста и компилятора в основном. Но да, компилятор может положить static const или некоторые литералы в сегмент, доступный только на чтение, и тогда при попытке что-то поменять программа свалится. Если у тебя микроконтроллер, то этот сегмент обычно физически недоступен для записи вообще или без плясок с бубном, а если десктоп, то требующиеся атрибуты сегмента записываются в исполняемом файле.
Сап двач, есть такая проблема что не могу сделать лабы по проге, а скоро сессия и если не сдам, то не допустят к ней. Прошу помощи двач, т.к сам я учусь не на программиста, но приходиться учить Си. Дана строка состоящая из слов разделённых пробелами. Нужно вывести слово с максимальной длиной, порядковый номер этого слова, и номер позиции с которого оно начинается. Вектора нельзя, стринг нельзя. Чисто строка как чаровский массив. Помогите пожалуйста
>>1540734 за один проход все делается. Тебе нужно на каждом пробеле сравнивать расстояние до прошлого пробела с последним рекордом, если расстояние больше чем рекорд, то ты это расстояние и индекс-расстояние+1 записываешь. В конце просто выводишь
>>1540755 Ну я пытался так сделать, но у меня нихуя не вышло и я психанудл и удалил всё, если ты шаришь, может объяснишь мне всё например в дискорде. Не за бесплатно конечно, можно о цене договориться
Привет, форумчане! я ещё новенький. Есть где-нибудь в свободном доступе массив с cp866 (индекс -- dec номер, значение -- собсна символ)? Можно, конечно, ручками всё вбить, но как-то не очень хочется.
Гуглится оно не очень, ну или просто запросы у меня хреновые.
>>1543950 >думать в какой манере код писать Когда пишешь на цэпепе, не используй функции из библиотеки C, только std, только хардкор. Я решил твою проблему.
>>1543950 Прямолинейность - это да. Но разница лишь в том, что сишечка меньше вопросов задает при фокусах с памятью, всякими километровыми кастами мазать код не надо. А архитектура уровня laba2.cpp на любом языке зашквар при большом масштабе проекта, так же как и проебать большую часть времени на написание абстрагирование каждого чиха, когда у задачи есть фиксированное начало и конец в пределах нескольких сот строк код.
Столкнулся с тем, что использую такое описание функций: код = функция(&данные) Есть ли какое-либо соглашение какой код ошибки должен быть при успехе? Просто логично использовать положительное значение - истинность возвращаемого значения глазами читается как успех выполнения, но тогда нельзя указать несколько вариантов ошибок. Если поставить успешное выполнение на 0, то мозолит глаза постоянная проверка !что-то. На какой стул сесть?
>>1544240 Эта социошлюха, вместо написания кода беспокоится быть как все, а то вдруг погонят. Куда бы ни попала, что бы не делала, на уме только одно - социоблядство.
>>1544240 Зависит от того, сколько вариантов ошибок тебе нужно получать. Если только успешность/неуспешность исполнения, то 0 при ошибке, и любое другое значение при успехе. Если вариантов несколько, то выносишь ошибки в дефайны, а 0 сигнализирует успешное завершение. По типу такого:
Есть ещё третий вариант - возвращать 0 при ошибке исполнения, а код ошибки ложить куда-то в глобальную переменную (либо функцию по типу GetErrCode(), которая это значение откуда-то получает), если тебе код ошибки нужен только изредка, а получать ненулевое значение при успешном выполнении хочется; но это уже извращение.
>>1544240 Но ведь вариант с разными кодами ошибок и 0-success соответственно предполагают, что ты этот код еще будешь смотреть, а значит возвращенное значение использовать несколько раз, а значит сначала присваивать его переменной по-любому. Ну, а ! или 0== это на любителя, не желающего обрабатывать ошибки должным образом.
>>1544604 >Норм выглядит >0 == yoba Хуйня, у меня моцг такую логику не понимает, что то должно равняться константе, а тут 0 равен чему то, пиздец короче
>>1544616 Что тебе не нравится? Значение функции же выползает из ее имени и присасывается к переменной, когда присваиваешь. Вот ты на месте это переменной ставишь константу и сравниваешь. Гораздо более читаемо, чем после скобок с аргументами. Хуй найдешь там справа. А так и вызов никуда особо не уехал, и константа перед глазами. Это норм практика, писать раздуваемые в длине выражения справа.
>>1544664 >Это норм практика, писать раздуваемые в длине выражения справа Такое видел только в маняучебниках >>1544667 > а 0==, как "заебись" Как говно звучит, вот заебись звучит func(data, buf) == ERROR, причем возвращаемый 0 это иногда нихуя не ошибка.
>>1544714 охуительно, особенно когда функция до шести параметров принимает >звучит Я имел ввиду, отрицание ассоциируется с тем, что что-то не так, а 0 - с отсутствием проблем.
>>1544723 >функция до шести параметров принимает Это то при чем? >отрицание ассоциируется с тем, что что-то не так, а 0 - с отсутствием проблем. Только в твоих фантазиях, все ошибки и статусы всегда заменяются дефайнами.
>>1544240 > Если поставить успешное выполнение на 0, то мозолит глаза постоянная проверка !что-то Это единственное, что тебе мозолит глаза в таком языке, на си? Тогда ты очень избирателен
>>1544394 >>1544616 Это главным образом для защиты от случайного присваивания когда один знак = проебется if (yoba = 0) // а хотел сравнить yoba == 0 if (0 = yoba) // компилятор поднимет шухер
Ну и каким блядь образом в этом ебаном языке СКОПИРОВАТЬ БЛЯДЬ ОДНУ СТРОКУ В ДРУГУЮ? А ЕСЛИ ПЕРВАЯ СТРОКА ПУСТАЯ? А БЛЯДЬ? ДЛЯ КОГО ЭТОТ ЕБАНЫЙ ЯЗЫК БЛЯДЬ?
>>1544995 Меня охуенно радует что нигде в мире не написано и не объяснено каким хуем это должно работать и что нужно сделать чтобы это дерьмо работало, и единственный способ узнать как что-то запрогать на этом "языке программирования для людей"... Нажмите на ссылку чтобы узнать!
>>1545580 Через консоль компилить слишком сложно и непонятно и нет возможности построково прогу выполнять, а качать вижал студио 2007 с троянами слишком страшно.
>>1545600 Че охуенно умный да? Родился сразу сеньёром да? Слышь может за гаражи зайдём дон? Сколько жмёшь от пола дон?
>>1545600 >очередной школы 21 двачую лучше бы мышцы качали - это хоть бы пригодилось когда грузчиками в пятерочку пойдут вкалывать, хотя бы не сразу позвонки на спине сотрут, а лет через 7м
>>1540431 (OP) Так сисюны, вот вам реальная задача, есть последовательный сортированный числовой массив размером не больше 1000 и нужно искать в нем элементы быстро аки боженька, кроме бинарного поиска еще что нибудь есть?
>>1545695 С бинарным поиском худший случай слишком долгий. Но альтернатива это ток экспоненциальный наверное или интерполяционный, и там худший случай тоже хуевый
>>1544961 > if (!SUCCESS(vasyanfunc())) { > !SUCCESS А там ведь еще и FAILED есть, чего ж не притащил? И это плохо выглядит, когда тебе этот статус еще потом нужен.
>>1544965 > if (0 = yoba) // компилятор поднимет шухер А потому что нехуй с нулем сравнивать. Традиционные проверки if (func() != 0), if (!func()), ну и всякие там if ((x = malloc()) != NULL). Ошибиться негде, проблема надуманная. Алсо, этот кривой стиль все равно не защищает при сравнении с переменной.
>>1545695 Создаешь тысячу элементов, инкрементируешь те из них, для которых в твоем изначальном массиве есть элемент, получаешь поиск с O(1), идешь нахуй со своей баянной задачей для детей.
>>1545600 Нахуй иди, в школе21 с нуля сишную либу пишут, в том числе и strcpy и принтфы всякие, при желании и на ассемблере Таких дегенератских вопросов там никогда не будет
>>1548039 >в школе21 имхо, если к вам в байтоебскую контору на тех собес через hr пробился челик с этих курсов, то лучшее что вы можете сделать для своей безопасности и безопасности своей конторки - это безапеляционно слить его в унитаз
>>1548039 > принтфы всякие Ну-ка притащи посмотреть %f, правильно реализованный новичком, у которого нет опыта и просто физически не может быть достаточно времени, чтобы разобраться с деталями.
реквестирую картинку со списком программ которые нужны для практики прогроммирования, там еще разделение по цветам, уровень сложности типо, на черном фоне текст
>>1548039 >в школе21 Этож сберкек. Они в этом своем сбербанке до 2010 (а то и дольше) сидели на ДОСе или каком-то досоподобном говне. И даже щас у них юзеринтерфейсы изобилуют идиомами досовских времен, лол.
>>1548578 пишешь в гуголь github ecole 42 ft_printf и сосешь бибу А как правильно реализовать - на длинной арифметике, траблы там нулевые, кроме этого >>1549029 Программа французская, сбер в ней нихуя не может менять
>>1549029 >до 2010 (а то и дольше) сидели на ДОСе Ходил пару лет назад паспорт менять в стол, увидел оригинальный Midnight Commander на одном из компов, подохуел.
>>1548247 Чето я не понимаю, там же курсы для вкатоидов, и вроде они не так давно работают чтобы кто-то из тамошних реально получил квалификацию достаточную для того чтобы на техсобес попасть
>>1549051 блять ты даже не понимаешь насколько смешно выглядит то что ты пишешь. Ни один вкатоид, в какой бы ГеНиАлЬнОй школе он не "учился", не сможет реализовать что-то из стандартной библиотеки ДЕЙСТВИТЕЛЬНО на уровне стандартной библиотеки. Посмотри соусы в том же кланге и подумай как смешно выглядит то что ты говоришь. >github ecole 42 ft_printf вот эта хуйня это подтверждает.
>>1549393 >отечественного производителя >Автор программы — украинский программист Всеволод Волков.
Молодой человек, пройдёмте с нами вон в ту комнату. У нас для Вас есть пара вопросов об исполнении федерального закона 44-ФЗ и в частности постановления правительства "Об утверждении плана по импортозамещению программного обеспечения” от 01.02.2015 № 96.
>>1550647 Да я рофлю, анон. А книги только путь указывают. Если ты предпочел не спрашивать совета в /b/, чтоб услышать, что Си не нужон, а таки решился на вкат, то предполагается достаточная самостоятельность, чтоб пробить man gets/fgets и все это уточнить. Что до пикрильского, это я намекнул, что твоя программа отвечает за удержание вывода, чтоб буфер флашить, а у тебя ВВОД. Он приходит с терминала (читай другой программы), и даже если у твоего процесса щечки покраснеют от ожидания, это не поможет, если терминал решил придержать stdin. Но по '\n' он 100% флашит, иначе ты бы свой код не скомпилировал даже, лол.
>>1550649 Ну просмотрел стандартную либу си и решил на задачах отработать, но чет бомбанул (от того шо сам не разобралса) шо не смог прочесть две строки с переносом строки. Ща разберусь, спасибо
>>1553727 Флуд дебилизмом только привлекает еще больше дебилов, а нормальные люди от этого уходят. В результате смерть треда, остаётся зомби только профитный хостеру, ведь ему главное количество посещений и постов, а на качество похуй.
>>1554941 >thread.h Каждый раз триггерюсь с этой glib. Вот почему всякие strchrnul, tsearch и прочие расширялки завезли, а C11 хуй? Только в 2.28, на которую пинус еще не переехал, и хрен ты кому в Си-треде pastebin с этими thrd_create скинешь, чтоб он cc сделал без установки второй версии?
>>1559134 Оттуда же, откуда >в Си нет многопоточности ну лол же. Таким тупорылым обмудкам в лицо плевать, или игнорить, если физическое лицо вне досягаемости.
>>1559213 >Не исключительно исключительно >нету сахарка есть. Просто его меньше, и бойлерплейта по умолчанию тоже меньше.
Да и сахарок - это в основном про ньюфагов. Однако не только ньюфаги, а иногда и люди, даже писавшие больше 20 строк кода на си, почему-то продвигают этот миф.
>>1559134 Доступ к полю структуры через точку это не ооп парадигма, это сиподобный синтаксис. Ты вообще знаешь что такое указатель? В си нет объектов, они появляются в расширенных си, таких как Objective-C и C++. А вообще объекты перед этим появились далеко не в С а в SmallTalk, на его основе был выпущен Objective-C, а потом уже и C++
>>1559134 Чистое ООП предполагает полную инкапсуляцию состояния объекта и взаимодействие с ним исключительно посредством интерфейса. На Сишечке это элементарно реализуется (void ∗), но писать только такой код означает делать такую же строгую и неповоротливую архитектуру, как можно на любом более высокоуровневом языке в меньше строк, то есть лишено смысла. Си нужен для стрельбы по ногам, и поэтому практически все, что на нем написано и реально использует его преимущества, нарушает принципы ООП.
>>1559496 > Чистое ООП предполагает полную инкапсуляцию состояния объекта Мало ли где там что предполагает. С этой точки зрения кресты, которые требуют все кишки класса обязывают выставлять наружу в .hpp - это вообще не ООП-язык. В то же время сишка позволяет incomplete-структурами это состояние успешно скрывать.
Это ебанутых проектов тред? Хочу написать свой каунтер чисто на битовых операциях. Двач, побудь моей уточкой.
Считать будем в произвольном куске памяти. Как я себе это представляю. Смотрим поледний бит, Текущий бит: если 0, то меняем его на 1 и закончили если 1, то меняем его на 0, двигаемся влево, гото Текущий бит
>>1560103 Если подробнее Стартуем: ставим курор на крайний правый бит (с = 0х1) Начинаем считать: Сравниваем текущий бит с 1 ((b & c) == c) если он 0, то переключаем его (b ^= c) и заканчиваем если он 1, то переключаем его (b ^= c), двигаем курсор (с<<=1) влево и гото Начинаем считать.
char c[128]; long ∗p = (long∗) &c; for(int i = 0; i < 128/8; ++i) { ∗p &= 0x7F7F7F7F7F7F7F7F; p++; }
Код выше, к примеру, применяет битовый AND (И) по отношению к массиву чаров (по 8 байт/чаров за раз). Если конкретнее - очищает старший бит каждого байта.
>>1560118 >по отношению к массиву чаров Ну так я и говорю, что вопрос в произвольных кусках. Например, шифтануть влево на два байта 3000-битное число. Понятно, что его можно разбить на массив и двигать по кускам, но я надеялся, что руками этого делать не придётся.
>>1560120 Так зачем руками-то? Напиши функцию. В Python и Haskell к примеру, есть шифт битов в числах произвольного размера, но работы с памятью нет, да и скорость работы этих возможностей далеко не потрясающая (в питухоне особенно, на небольших числах даже умножение дороже шифта битов). Алсо учитывай, что работать удобно сможешь только с числами, кратными байту, а та же функция на ассемблере будет не намного сложнее (если ты, конечно, знаешь x86-64), но в разы эффективнее.
>>1560125 Даже функции потребуют использования обычных чисел, а я хотел этого избежать. Вон выше, произвольный счётчик пытался сделать исключительно на битовых операциях, но он ограничен самым длинным целочисленным типом, хотя в самой архитектуре счётчика я этого ограничения не вижу, можно просто ползать влево-вправо по битам и всё. Хотел расширить до работы с произвольным отрезком памяти.
>>1560130 Сегфолты предполагались. Просто пытался понять, достаточно ли сишка низкоуровневая, чтобы настолько с битами играться, но, судя по всему, для такого необходимо городить огороды из массивов, чем заниматься не хочется. Финальная идея была в том, чтобы в лоб побитово производить всякие большие математические операции, типа умножить 200 значное число на 300 значное. Посмотреть, как современные процессоры с таким справляются.
>>1560129 Смотри, на чистой архитектуре x86 нет опкодов для работы с числами большей битности, чем машинное слово этой архитектуры, так что под капотом без извращений это по другому реализовать не выйдет. На ассемблере можно, конечно, было бы поизвращатся со всякими там AVX, но это тоже не универсальная оптимизация. Вообще не понимаю твоего бугурта, т.к. функции подобного плана без оптимизаций пишутся достаточно быстро, разве что ты хочешь вообще все битовые операции подобным образом реализовать, и ещё для не byte-aligned по длинне чисел к тому же.
>>1560132 >разве что ты хочешь вообще все битовые операции подобным образом реализовать, и ещё для не byte-aligned по длинне чисел к тому же И да, хочу. Это же можно сделать, правильно? Понятно, что на конкретном железном процессоре просто так взять и крутить биты не выйдет, он воткнётся в ограничение длины своего машинного слова, это ты правильно заметил. Но вообще, это же реализуемо, верно? Вот я попробовал просто напрямик это написать на C, но был ограничен размером базового типа, а значит нужно их компоновать несколько, то есть усложнять программу, а вся идея была как раз в том, чтоб программа была самая тупая.
Я рассчитывал, что просто напишу, как хочу изменять память, а компилятор уже разберётся, как это делать кусками, удобными процессору.
>>1560135 Понял. Тащемта сишечка на таком низком уровне все-таки неплохо ограничивает, особенно в плане всяких микрооптимизаций и расширений архитектур x86 по типу SSE. Да и вообще для не битовых операций нужно будет на C дикие костыли городить, а тот же результат умножения на уровне ассемблера помещается в пару регистров (фактически промоутит число до количества битов в 2 раза большего), что уже позволяет набросать более эффективный алгоритм. Вообще, если в проде будешь подобное использовать, и лень будет изобретать велосипеды (т.е. производительность не важна будет) - во всяких там Java и C# есть BigInteger с переопределенными операторами, не говоря уже о всякой функциональщине.
>>1560137 Для простых битовых операций (and, or, xor) тебе достаточно просто пройтись по всему числу, применяя оператор к каждому из участков памяти, а остаток без alignment замаскировать and после. А дальше - веселее, даже для шифта битов тебе придется что-то интересное придумывать, а на не битовых операциях уж тем более без интересных алгоритмов никак не обойтись.
>>1560139 >Да и вообще для не битовых операций нужно будет на C дикие костыли городить Так в том и задача, сделать как можно больше через битовые операции над памятью. > а тот же результат умножения на уровне ассемблера Я его планировал сделать через битовое сложение. Собственно, для этого счётчик и нужен был, чтобы определять, когда остановиться. Повторюсь, интересно сделать как можно более тупую программу, самый минимум. И для умножения я ничего тупее, чем сложение и счётчик не придумал. Вот начал со счётчика и воткнулся. >во всяких там Java и C# есть BigInteger с переопределенными операторами Так любая криптобиблиотека для сишки это уже BigInteger. Не говоря уже о всяких специальных, вроде gmp. И, полагаю, они там уже давно таких оптимизаций наделали, до которых мне годы раздумий.
> А дальше - веселее, даже для шифта битов тебе придется что-то интересное придумывать Всё так. Но я не хочу придумывать интересное, ради обхода ограничений языка. Не в этом моё желание.
>>1560139 > Да и вообще для не битовых операций нужно будет на C дикие костыли городить Посоны-то не знают, и пишут длинную арифметику именно на сишке.
>>1560148 > битовые операции над памятью. Ты какой-то хуйней страдаешь. Битовые операции не нужны, достаточно обычных операций над массивом uint_fast32_t.
> для умножения я ничего тупее, чем сложение и счётчик не придумал В столбик в школе считать учили?
>>1540431 (OP) Не совсем по C вопрос, но, тащемто, связанный с выполением заданий из K&R.
Как отключить построчную буферизацию в терминале? Ubuntu 18.04, bash.
unbuffer и stdbuf -i0 -o0 -e0 не работают.
А то пошел K&R проходить по порядку перед сессией после семестра гвидопыха, ибо гвидолабы сданы на отл. обгвидку-преподавателю, чтобы повторить основы теор. курса с нормальным языком в руках, а тут такие неприятные мелочи.
>>1560576 >Посоны-то не знают, и пишут длинную арифметику именно на сишке. Так, давай не путать посонов, которые пытаются что-то полезное сделать, и меня. >Ты какой-то хуйней страдаешь. Это очевидно. >В столбик в школе считать учили? Так, а чем принципиально умножение в столбик отличается от, так сказать, обобщённого умножения? 3 на 5 умножить, и 42154352345 на 3467645645745 для меня одно и то же.
>Битовые операции не нужны
Так, я пожалуй объясню, что я пытаюсь сделать с нуля. Представь себе человека, который вообще ничего не знает о математике и, тем более, программировании. Даже таблицу умножения. и ты его учишь, начиная с двоичной системы счисления. Мне попался хороший ученик в виде компьютера, он уже понимает, что такое 0х0, 0х1, =, ==, ^, <<, и &. И я хочу из этого научить его считать. Для начала просто считать вверх, что я относительно успешно реализовал, учитывая ограничения C.
Но именно этого я и не хочу, я не хочу учитывать ограничения С, я хочу просто менять биты в памяти. Не в беззнаковом целом, не в массиве чаров, и даже не в структуре или битовых полях, а просто в куске памяти. Хочу просто бинарную математику, а не ограничения в длину слова процессора или базовые типы.
Понятно, что я могу это реализовать просто в виде операций над строками, написать свои реализации 0х0, 0х1, =, ==, ^, <<, и & для '0' и '1', но это получится пикрелейтед, не уверен, что я этого хочу.
>>1560627 > просто менять биты в памяти Ты не можешь менять биты в памяти, ни просто, ни сложно разве что row hammer какой-нибудь притащишь, и это, наверное, единственный рабочий способ менять именно биты в современных компах. Процессор читает/пишет память даже не байтами, и не двордами, а целыми кэшлайнами. Даже сама DRAM не читает по одному биту.
Но я понял, чего ты хочешь, и думаю, что тебе нужна не сишка, а какой нибудь digital circuit simulator, вот там ты развернешься. Можешь, например, в nandgame.com поиграть, оно как раз для тебя. А когда наиграешься, вернешься в сишку реализовывать арифметику не в base-2, а в base-232.
> Так, а чем принципиально умножение в столбик отличается от, так сказать, обобщённого умножения? Ну я так понял, что ты сейчас просто суммируешь первый множитель n раз. Это медленно. А вот если ты попытаешься двоичные числа умножить в столбик, как в школе, ты получишь log(n) уже (и это не самый быстрый способ). С бумажки на комп этот алгоритм переносится очевидным способом: если очередной (от младшего к старшему) бит второго множителя равен единице, ты прибавляешь первый множитель к результату, если равен нулю - не прибавляешь. А потом сдвигаешь первый множитель влево на один бит и повторяешь.
>>1560781 >Процессор читает/пишет память даже не байтами, и не двордами, а целыми кэшлайнами. Даже сама DRAM не читает по одному биту. Я от этого пытался абстрагироваться при помощи сишки. Но сишка слишком близка к железу, а остальные языки слишком далеки от битов. >digital circuit simulator > nandgame.com Спасибо, посмотрю. >ты сейчас просто суммируешь первый множитель n раз. Это медленно. Да. Я понимаю. Но хотел в начале обойтись как можно меньшим числом концептов. Любому очевидно, что счётные палочки для первоклассников гораздо медленнее, чем множество других способов, но начинают всё равно с них.
Учу C по книге Stephen Prata "C Primer Plus, 6th Edition" (2014) страниц 300 прочитал, упарился уже весь и мой внутренний голос коварно говорит мне: бросай это дело, всё равно ничего не выйдет
Есть ли вообще смысл учить язык C в маленьком областном центре если мне уже почти 33?
>>1561060 >всё равно ничего не выйдет Хуевый у тебя внутренний голос, он так тебе по любому новому делу говорит? Я вот в электротехнику на старости вкатываюсь, вот там жесть-пиздец, заливаю внутренний голос пивасом и потихоньку иду дальше.
>>1561060 хочешь - учи, не хочешь - не учи. какой еще "смысл"? если вкатиться в ойти, съебать из мухосрани и начать зарабатывать 300кк/сек, то сишечка этому способствует больше, чем бухать с друзьями, гулять на природе и вести полноценную жизнь быдла. но если ты ожидаешь вкатиться не выучив ничего, кроме сишечки, то в 2к19 у этого охуенно маленькие шансы. я советую не сдаваться и идти к цели, особенно в плане навыков, которые денег не стоят и другим людям не мешают.
>>1561196 Я так то уже 3 года и 2 месяца вкатываюсь, если считать с момента когда я впервые эту книгу читать начал. Вот летом в 20-х числах июля решил жёстко взяться. Почти полгода прошло, а я только 300 страниц одолел. Вот и начали меня одолевать смутные сомнения, на фоне полного отсутствия соответствующих вакансий в моём городе. Я как то ожидал большей от себя скорости, но то ли я тупой, то ли книга написана так чтобы дочитать её до конца смогли не только лишь все
>>1561218 Да как то дел с вот этим "вкатиться в ойти" всё нарастает и нарастает. Сначала я начал читать книгу, потом решил что и английский знать надо и взялся за курс на дуолинго. Потом решил что в книге маловато упражнений и добавил курс С на степике. Потом заметил что в книге как то совсем не объясняются возможности современных IDE. Да и вообще спецы рекомендуют командную строку линукс и вим. А там ещё прочитал что постоянное переключение взгляда с экрана на клавиатуру быстро утомляет и надо научиться слепой печати и как то это всё прямо снежным комом нарастает
>>1561248 Ну с С вкатиться в айти нельзя, разве что сразу с него на пхп перескочить, вакансий для вкатывальщиков нет. Имеющиеся это наверняка НИИ, где сам С дело десятое, а главное матеша.
>>1561248 >переключение взгляда с экрана Ээээ, ты там двумя пальцами печатаешь? Лол. У нас был ведущий инженер, старый пидор с бородой, он двумя указательными пальцами печатал глядя на клавиатуру, мнил себя гуру ИТ, а раньше был геологом, пока их контору к хуям не разогнали, да.
>>1561251 Да я как ступеньку С расценивал. Типа план себе как мне показалось хороший составил: -язык Си (курс Степик, Прата, К&R) -ассемблер (курс Степик) -язык Си++ (два курса Степик, Страуструп) -алгоритмы и структуры данных (два курса Степик) А потом уже с наработанным знанием и пониманием вышеизложенного за что то более близкое к наличным вакансиям браться
>>1561255 Не двумя, но и не десятью. Не глядя на клавиатуру вообще печатать не могу. Судя по тому что за клавиатурой я уже более 12 лет сам собой навык слепой печати у меня не появится
>>1561248 >надо научиться слепой печати С сегодняшнего дня выдели 15 минут в день на это. Я вот, например сейчас учу её. Трачу 15 минут в день. За месяц поднялся с ~80 символов в минуту до ~160. Ничего сложного не, главное заниматься постоянно. Это ещё учитывая, что я максимум бездарь.
>>1561248 >слепой печати Зачем? Большую часть пишет за тебя иде, бойлерплейт нормальные люди генерируют на питоне/перле/т4 что ближе. >>1561251 >Ну с С вкатиться в айти нельзя У нас железячники только на нем и пишут, навигационное оборудование. мимокрестовик
>>1561263 нужно ПРОСТО не смотреть. если не делаешь себе постоянный челлендж, то нихуя не научишься. равно как смотреть кинцо с оригинальной озвучкой, но с сабами - нихуя не поможет, если ты постоянно сабы читаешь. нельзя 12 лет с тренировочными колёсами ездить и потом жаловаться, что ты не научился на велосипеде держаться.
>>1561309 По-моему, надо просто заставлять себя нажимать каждую клавишу правильным пальцем, необязательно вслепую, но всегда, в любом повседневной печати, большого перерасхода времени не будет. Только поначалу идет медленнее, чем 2-пальцевый набор, как на печатной машинке, но очень скоро привыкаешь и понимаешь, что так НАМНОГО быстрее. А глаза сами перестанут смотреть на клавиатуру.
>>1561747 умею печать вслепую, но не умею в правильные пальцы. обычно недоиспользую указательные и мизинцы. мне кажется, это важно, но не самое главное для умения не смотреть на клавиатуру.
>>1561822 >>1561826 просто так проще "глаза закрыть", потому что не надо плечами работать, а все маленькие группы клавиш развязаны в мозгах по своим пальцам, и нехуй запоминать особо
>>1561309 >>1561747 >>1561826 Советую всем сайт ratatype, максимально удобный. Сам я печатаю ~300 символов с 5% ошибками 3-5 пальцами, но пальцы пиздец как устают. За неделю осилил слепую печать всеми десятью, ~150 символов и 1% ошибок, руки почти не напрягаются. Думаю за пару месяцев на те же 300 выйду.
сап сишники с нг,вопрос к вам есть двухмерный массив(ака матрица),надо узнать какие числа повторяются больше трех раз,и при этом находятся в разных столбцах например в матрице 1 2 3 4 1 3 1 3 5 3 4 5 это число 3 с меня как всегда нихуя :3
>>1562071 А если один раз встречается два раза в ряду, то это значение уже не может считаться, или даже если встречается больше 3 раз по одному, но один раз — два раза, то все равно считается? Я пьяный если что извини если не понятно
>>1562068 Счетчик для каждого числа. Ну, не для всех 18 секстилионов сразу, конечно, а по разрядам идешь. 256-элементный массив, который запоминает, во скольких разных колонках встречаются числа, начинающиеся на байт 0x00, во скольких - 0x01, ..., а во скольких - 0xff. Сразу выкидываешь все, что не дотягивает, и рекурсивно идешь по отобранным, считая уже вторые байты. Ну, можешь сразу по 2 байта брать, тогда массив 65536, сам смотри, сколько у тебя памяти. Глубина рекурсии больше 8 не будет. Хотя, может быть большой флоат, там кстати тоже все вполне дискретно. Пробуй, анон. Ничего лучше за 5 минут не придумал.
>>1562068 для каждого символа алфавита делаешь аррей длиной равной длине строки, проходишь по строкам и отмечаешь в новых арреях появление соответствующего символа. потом просто ищешь арреи, в которых больше трех ячеек отмечено.
>>1562100 [5][6] но желательно на неограниченный >>1562101 знаю,но мой тупой мозг не понимает как это сделать >>1562105 может,считается как одно значение >>1562115 пасиба но сложна,мой ньюфажий мозг расплавился >>1562131 пасибо попробую
типо например тут ответ будет 3 и 6 {6,>3,8,0,0,5} ,{>6,>6,5,7,8,4} ,{4,5,6,>6,1,7} ,{0,4,>3,2,5,0} ,{0,8,7,>3,2,8}
>>1562221 синайлы как обычно хотят байтоебствовать и сдвигать разряды. общий алгоритм пиши для произвольного содержимого, для которого определена операция равенства.
По умолчанию при объявлении целочисленной переменной без указания спецификатора signed/unsigned, переменная будет signed или unsigned типа? Регламентируется ли это стандартом? Зависит ли это от реализации?
>>1562286 беторды на бордах всю жизнь пиздили англицизмы, ньюфаг. а вообще потому что я не знаю русских аналогов и вместе с тем ожидаю, что пипл, посещающий данный сайт, способен меня андерстенд без того, чтобы я снисходил до кальки или адаптирования.
>>1562642 Конст в объявлении параметра функции говорит о том, что функция не будет менять то, что лежит по указателю, например. При чем тут дефайн? Ты говоришь про константы в терминах маш.кода (адресные операнды, регистровые и константы), а тут документационный смысл.
>>1563022 >а то мне кажется что я написал хуйню Всё так. >for(int i = 0; c == ' ' && i != 1; ++i) putchar('\b'); Эта строка вообще ничего не делает, если что.
>>1563079 Ну давай посмотрим, что она делает: i = 0; проверяет c == ' ' && i !=1; //тут виноват, я прочитал там == Если да, то стирает последний символ. Так как пробел мы ещё не напечатали, то это предыдущая буква. Поднимает i на 1; Возвращается к началу цикла for. Проверяет c == ' ' && i !=1. Так как i тут всегда 1, то дальше она ничего не делает. Если нет, то просто заканчивает for и ничего не делает;
Дальше печатает сохранённый пробел. Возвращается к началу цикла while; i = 0; проверяет c == ' ' && i !=1; Здесь она сотрёт предыдущий пробел, это правда. Но буква уже стёрта то есть for не ничего не делает, а портит, а цикл for никогда не повторяется больше одного раза. Зачем тогда цикл?
>>1563126 Это сработает. Но у тебя 3 if'а в которых ты проверяешь на одно и то же условие. Скомбинируй их в одно. Можешь сделать сам, а потом сравнить со спойлером https://pastebin.com/TrXzqzRM
Ещё твоя конструкция развалится, если, например, использовать 10 миллиардов пробелов, а условия это не ограничивают. И постоянная печать, а потом удаление тоже странное решение, не проще изначально не печатать?
>>1563181 Тогда тебе нужно делать ещё одну проверку. Не проще их изначально не считать? Тебе же не важно, сколько их было, 3 или 12000? Тебе важно только был ли предыдущим символом пробел.
Хочу написать автокликер клавиатуры для одной ммо дрочильни, но у этой игры, похоже, есть защита. На текущий момент смог написать только вялый sendinput, используя скан-коды клавиш, который отрабатывает только пару раз, после чего игра перестает их обрабатывать, пока я сам не нажму любые клавиши. После чего картина повторяется. Текущий код: https://pastebin.com/MzzFXeZm
Что можно придумать? Нашел тему с аналогичной проблемой https://stackoverflow.com/questions/18647053/sendinput-not-equal-to-pressing-key-manually-on-keyboard-in-c В самом низу есть обсуждение под ответом от Eric Brown, он пишет: >That implies that the game may well be using DirectInput. Injection might still be possible, but is much harder; you need to open the raw keyboard device and send some IOCTLs to inject raw scan codes. I'm not that familiar with these APIs, so you're on your own... Но я что-то не понял нихера его. Хз, мб от этого как-то оттолкнуться можно? Или есть другие решения?
>>1566603 и почему он не ругается на это: if ((time_heater_delay_gap.watch.hour && time_heater_delay_gap.watch.minute && time_heater_delay_gap.watch.second))
немощный компилятор не может работать с структурами в логических операциях, только с элементами?
>>1566604 > не может работать с структурами в логических операциях включи режим плюсов и допиши оверлод оператора== ты блядь как будто не знаешь в какой язык ты пришел
>>1566328 Чтобы совсем красиво было надо хук использовать, но тогда антивирус срабатывает. Потому что.. а раскладку кто переключать будет? А спец символы итд итп
>>1566603 Поехавший, любой конпелятор сей не позволяет это делать, потому что ты долбоёб. Если там одни целые и ты 100% уверен, что структуры хранятся одинаково - можешь сравнивать через memcmp()
>>1566665 Чем мечтать о работающих 5 строчках лучше бы помог человеку. >>1566328 Слушай сюда, для sendinput нужен дескриптор окна/процесса которому будет посылаться сообщение. То что ты там нашёл дескриптор с помощью Spy++ это всё хуйня, надо дескриптор определять в реалтайм, и именно тот дескриптор, именно этого подокна. Для это нужно использовать хуки(перехват сообщений), ты перехватываешь сообщение, выдёргиваешь оттуда дескриптор и потом уже sendinputом посылаешь сообщение этому дескриптору. Но хук замутить это пиздец проблема, это уже типа взлома, будет срабатывать антивирус ессно, и вообще надо сильно изловчиться чтоб сделать(но вполне можно). Второй способ, кривой но работает. Черех keybd_event, ты в программе делаешь модальное окно(которое поверх всех окон), делаешь в программе хоткей посредством GetAsyncKeyState. Потом ставишь курсор куда тебе надо(наводишь фокус клавиатуры), зажимаешь хоткей, и мышкой наводишь курсор на окно своей программы. У нее срабатывает GetAsyncKeyState, а фокус то остался в твоей иггре, поэтому всё печататься будет туда. Вот такой вот способ. Не знаю глюк ли это или нет, на win7 работает.
>>1566721 В последних шиндах днинпут является оберткой над сообщениями для окон. То есть опять же должен хукаться через винапи. Inb4: держу в курсе.
>чем мечтать Мань, на том скрине тупо switch/case, который нет смысл таким образом маняоптимизировать - конпелятор уже давно развернет как минимум не хуже, чем васян с книжкой по асму 1995 года выпуска.
>>1566730 Асм это мышление, Асм -это движение, Асм -это жизнь. Асм это способ заставить серое вещество работать. Поэтому я не обломаюсь скопипастить одинаковый код, руки не отсохнут.
>>1566730 >Мань, на том скрине тупо switch/case, который нет смысл таким образом маняоптимизировать Ты не заметил invoke sleep? Что если в его игре поставили ограничение на время нажатия? Что тогда?
>>1566721 Ух бля... Ну попробую... Кстати, мне советовали один драйвер https://github.com/oblitum/Interception , используя его апи, скормить ему все что надо. Вот его небольшая документация http://www.oblita.com/interception и там написано: >The Interception API provides a simple interface of communication with kernel-mode components, and those components are powerful. They intercept data in a early stage, before it reaches the core of OS input processing. Как я понял, он на более низком уровне эмулирует сигналы для ос, что по идее может быть сравнимо с ручной обработкой сигнала. Но хз, так ли это. Вчера всю ночь пытался на нем что-то написать, но документация сыроватая, кроме рабочих примеров написать что-то свое не вышло. Не могу разобраться, как на его апи можно имитировать зацикливание нажатие клавиши.
Работал с кодом из примера https://pastebin.com/WjjhERiS Вот, как я его понимаю: в цикле while мы блочим проверку условия строчкой >device = interception_wait(context) , пока по заданным фильтрам не придет нужное состояние >INTERCEPTION_FILTER_KEY_DOWN | INTERCEPTION_FILTER_KEY_UP Допустим, я нажимаю кнопку, срабатывает KEY_DOWN, функция interception_receive что-то там возвращает > 0, после чего оказываемся в теле цикла, где устанавливаем нужную клавишу и посылаем ее драйверу. Перед отправкой у клавиши всегда состояниеDOWN или UP, что по идее должно триггерить функцию interception_receive автоматически, зацикливая, но этого не происходит. А так же не понятно, что делают остальные фильтры INTERCEPTION_FILTER_KEY_NONE, INTERCEPTION_FILTER_KEY_ALL, INTERCEPTION_FILTER_KEY_E0, INTERCEPTION_FILTER_KEY_E1, INTERCEPTION_FILTER_KEY_TERMSRV_SET_LED, INTERCEPTION_FILTER_KEY_TERMSRV_SHADOW, INTERCEPTION_FILTER_KEY_TERMSRV_VKPACKET (это все есть в хидере interception.h https://pastebin.com/NN4Bdefj)
>keybd_event Я встречал его, но было написано, типа: используйте вместо него sendinput, мол он уже не работает. Твой способ для меня тоже не совсем понятный, надо пробовать.
>>1566753 Тоже советовали (stm32 и USB HID), что имелось ввиду под usb hid мне тот анон так и не ответил, программатор? А потом я подумал: есть ли смысл тратить на все это по 500рублей, чтобы попердеть вместе с ней, вероятно, не получить никакого результата и отправить ее на полку? К тому же, там столько всяких kitов, хер поймешь что нужно, а потом, еще эти проводки нужны, а может еще что нужно, о чем я даже не могу представить?
>>1566744 Да мы с тобой в разных плоскостях. Ты сильно всё преувеличиваешь, всё гораздо проще, ты пойми сам принцип.(я не шарю в ваших крестах, но примерно понимаю). 1 Послать сообщение из одной программы в другую - это гемор, это взлом и все вытекающие. Это можно сделать только посредством hook. Это единственная задокументированная возможность винды, других нет. Нет никаких драйверов, всё это спокойно делается самой виндой(но сработает антивирус). И ещё есть второй способ обхода который я написал.
>>1566744 ХУЛЕ НАПИСАНО ТО БЛЯТЬ!! НА ЗАБОРЕ ТОЖЕ НАПИСАНО. >>keybd_event Просто эмулирует событие клавиатуры. Конечно мелкомягким нахуй чтобы была такая возможность. А ты пробуй, у тебя же задача.
>>1566762 >Нет никаких драйверов Ну, допустим, в какой-то момент я хотел собрать цепь таймера на микроконтроллере NE555, который запускал бы реле, а та в свою очередь замыкала/размыкала контакты кнопки, к которой бы я просто подпаялся. Сигнал бы поступал в ос сразу после драйвера клавиатуры и все бы работало, я уверен, только, если в том античите стоит какая-то проверка на интервалы нажатия кнопки, то мб и это обошла бы игра, но можно ведь попытаться как-то сделать эти интервалы случайными, чтобы имитировать ручное нажатие. Вот, поэтому я думал, что тот драйвер он просто перехватывает сигналы от драйвера клавиатуры (до обработки самой ос) и с помощью его api можно все что угодно сымитировать на "аппаратном" уровне, а ОС ничего не остается, как принять эти все сигналы и посчитать их ручным вводом.
>но сработает антивирус Ну, ок, это проблема? Может его выключить/удалить на время? Я просто не понимаю что сложнее: обойти антивирус или написать хук.
>>1566774 Ты вот в этом месте заморочился. Их игра просто принимает сообщения от стндартного драйвера клавиатуры. А не работает у тебя, потому что меняется дескриптор процесса или тераяется фокус клавиатуры, в игре же много чего происходит, и если ты сам не тыкнул, то всё будет происходить само-сабой, всё будет само переключаться, как предусмотренно разрабами. А вот чтобы "ткнуть из своей программы" нужно использовать хук, тогда гемор и антивирус. Или второй вариант: ты сам ткнёшь и программа всё доделает. Тут главный вопрос: пользователь ткнёт или программа.
keybd_event сообщает системе о событии которое произошло с клавиатурой. А приложения сами решают, обрабатывать это событие или нет. И приложение конечно не будет обрабатывать это событие если фокус клавиатуры на нём не установлен. А sendinput отправляет сообщение. Но чтобы отправить должен же быть адрес, логично?
>>1566763 У вас системное программирование, и у нас сис. программирование. Тебе же это надо? Ну я рассказываю что и как. Можешь поссать на своих англоязычных друзей от моего имени. не деаноньте плиз, я с хорошими намерениями то ли ещё будет
>>1566721 Окно модальным должно быть в контексте всей ОС? Что-то я не могу найти инфы о том, как это можно сделать. Везде пишут только о том, как сделать дочернее окно модальным в контексте приложения.
Сап. Есть у мня массив шестнадцатиричных чисел, его нужно записать в бинарный файл ("wb"). Я это делаю так: fwrite(array, sizeof(array), 1, FILE_OUT); Но в самом файле, например, числo 0xaf01 записанно как 0x01af (проверял hexdump'ом). Как сделать так, чтобы числа записывались в bigendian'е? вариант с модификацией массива не катит
>>1566809 Да я ничего против не имею, просто я не готов вот так взять и начать изучать один из сложнейших яп для какой-то своей хуйни. На это явно уйдет дохера времени, которого нет + явно не достаточно просто понять синтаксис языка, нужно понимать еще архитектуру процессора (наворачивать 1к страниц таненбаума не хочу), под который ты пишешь и наверняка еще дохуище подводных. Моя жопа к такому еще не готова. Я ж, блядь, молодой и шутливый еще...
А вообще, интересно. В чем преимущество этого языка? Тот код, который ты кидал, он как-то связан с чат-ботом в POE? И как так получается, что при использовании С/С++ потребовалось бы ебаться с хуками, вылавливать адреса функций и т.д. А ты взял ASM и написал код в длину высоты экрана и у тебя все работает?
>>1566955 Для долбоёбов, которые не осиливают сами - придумали network endianness. htons()/htonl() из netinet/in.h, для тех кто даже куколдугл не осилил.
>>1566966 Так мне тоже надо ебаться с хуками. Ты меня не понял до сих пор, есть два стула: 1 правильный с хуками и ебатьнёй, от которого я отказался 2 кривой с модальным окном и keybd_event, который я выбрал. Там на видосе просто не видно окна программы(fraps не захватывает, надо было сразу указать). Или просто DeskPins заюзай, главное чтобы окно программы было поверх, чтобы можно было тупо курсор навести на это окно во время удержания хоткея. Потому что фокус клавиатуры у тебя останется в игре, а твоя прога примет GetAsyncKeyState и начнёт выполняться, то есть хуячить keybd_event'ы.И всё будет автокликаться.
Да я сам деревянный, просто беру что надо и использую, не замарачиваюсь.
>>1566721 Да я вот, сейчас пытаюсь написать на winapi твой 2 способ, пока не выходит. Ты про модульное окно так и не ответил >>1566950 И еще не совсем понятен этот момент: >чтобы можно было тупо курсор навести на это окно во время удержания хоткея Т.е. нажимать на лкм для захвата окна не надо? Достаточно только навести? Звучит парадоксально.
>>1566955 Никак. Тебе ведь поDWORDовый реверс нужен. Можно сетевой хедер взять, но не знаю, как htonl/ntohl в плане инлайнов. По-хорошему, если на целевой архитектуре endianness совпадает с сетевой, то "вызовы" htonl/ntohl должны опускаться при конпеляции, то есть безопасность бесплатна. Можно макросами условную компиляции сделать, чтоб одним fwrite/fread все делалось в последнем случае. Хотя, если писать/читать неглядя, а дрочить массив, то цикл сам опустится.
>>1567020 >Звучит парадоксально. Похуй, главное работает. Да, зажимаешь хоткей, твоя прога как бы на паузе, потом просто наводишь курсор, она как бы снимается с паузы, принимает GetAsyncKeyState и начинает исполнять keybd_event'ы которые тебе надо. НО фокус клавиатуры то остался в игре, поэтому твоя игра будет принимать эти keybd_event'ы.
>>1567029 Ясно, но у меня так не захватывает фокус, нужно нажимать, а после нажатия фокус сбивается. Пробовал пока в блокноте. Но я не делал еще никакое окно модальным, ибо ты уже 3 раз не можешь про него ответить. Я могу сделать это окно модальным только в контексте приложения.
>>1567036 >ибо ты уже 3 раз не можешь про него ответить. Ну просто указываешь в ресурсах DS_SYSMODAL и всё, никаких сложностей у меня не было. Не должен фокус сбиваться, этот кривой способ должен везде работать. Может надо код писать в оконной процедуре.. из за этого может теряется фокус хз. Щас с deskpins попробую.
>>1567049 >DS_SYSMODAL Вообще, в msdn написано >This style is obsolete and is included for compatibility with 16-bit versions of Windows. If you specify this style, the system creates the dialog box with the WS_EX_TOPMOST style. This style does not prevent the user from accessing other windows on the desktop. У тебя какая ос? 16 битные... Это что? Это по моему даже не ХР. Это 98 нахуй...
>>1567056 Короче.. используй deskpins. Щас проверил, закоментил DS_SYSMODAL, работает. Я не буду тут разбираться в тонкостях, ты просил способ обойти хуйню с sendinput, я тебе сказал как это сделал, прогу сам собирай. Главное пойми основной принцип: 1 Запускаешь свою прогу, закрепляешь её deskpins'ом 2 Кликаешь в то место куда тебе надо(устанавливаешь фокус клавиатуры) 3 Зажимаешь хоткей который указал в GetAsyncKeyState 4 При зажатом хоткее наводишь курсор на окно своей програмы Она как бы снимается с паузы и начинает хуячить keybd_event'ы, а фокус клавы остался там, и там где он остался, то и будет принимать эти keybd_event'ы.
>>1567074 Хз, у меня не получается. Вроде, все правильно делаю. Фокус при наведении не захватывается, нужно нажимать мышкой. После захвата фокуса в консоль выводится инфа о том, что хоткей (стрелка вверх) была нажата, как отрабатывают keybd_eventы не известно (пытаюсь сымитировать нажатие и отпускание клавиши Z).
>>1567105 Кстати, попробовал горячую клавишу тоже на Z заменить, keybd_event с этой кнопкой зацикливает хендлер, значит keybd_eventы работают. Проблема с этим фокусом.
>>1540431 (OP) Анчоусы, добрый вечер. Хочу вкатиться в C++(опыт погромирования есть), но вот задумался. Может сперва с C начать? Или с C++ сразу. Как вы считаете?
>>1567188 > А почему не СИ сперва? Потому что тебя троллят. Кресты на порядок сложнее, запутаннее, а предпочтительный стиль программирования на крестах меняется с каждым стандартом. Но тем не менее их все равно придется выучить. Потом.
>>1567182 Завтра попробую. Вот, если что, все dll с которыми приложение взаимодействует. Если что, думаю, могу тупо все из списка в один архив с exeшником засунуть и залить на хостинг.
>>1567185 Начни с книжки по языку си от их авторов, прочитай ее полностью, пока не поймешь каждое слово. Там база баз. Если типы данных и массивы покажутся примитивными, то веселье может начаться на структурах, указателях. Так же есть полно всяких деректив define, pragma и тд обязательных к ознакомлению. После этого всего уже можно изучать плюсы, начиная с ооп, std библиотека, потом шаблоны, stl библиотека и тд. Там уже сам поймешь куда лезть, а куда нет.
>>1567209 Хотя, я сейчас посмотрел, они C11, вроде как, и не выпускали. А там многопоточность, которую ты в любом случае затронешь, когда плюсы будешь изучать. Так что бери любую редакцию или поновее, какую найдешь.
>>1567213 Тетки на cppcon - это отдельная история. Одно выступление охуительнее другого. Недавно вон тянка рассказывала дядям, что такое таблица виртуальных методов, и где она лежит в энтих ваших классах. >>1503195
>>1566762 >1 Послать сообщение из одной программы в другую - это гемор, это взлом и все вытекающие. Это можно сделать только посредством hook П Р И Д У Р О К
>>1567321 Это кроссплатформенный ассемблер, вась. А трупстрауса++ - это ассемблер, в который зачем-то добавили унитаз, кухонную раковину, несвежий труп страуса и миниган для стрельбы по ногам и прочим конечностям. Ещё можно сконпелировать пушку boostАК-630, если минигана нетостаточно
>>1540431 (OP) Сап, няши, такой вопрос - в шиндовс (win7) x64 процесс может загружать x86 библиотеку с ресурсами (иконки)?
Тут такое дело - мигрирую 32 битной на 64 битную систему, захотел себе и тотал коммандер 64 битный, но вот старый у меня тщательно настроен и мною кастомирзирован, в частности я когда-то нарисовал+надергал иконки и захерачил их в библиотеку в VS6.
Теперь я давно не прогаю, никаких студий у меня не стоит и я подумал пиздец, придется либо просить кого-то пересобирать библиотеку, либо редактировать каким-нибудь редактором ресурсов.
Но с удивлением обнаружил, что эта библиотека WCMICONS.DLL в 64-битном тотале осталась 32-битной. Это законно вообще?
>>1567361 Да там кода нет, там одна секция с ресурсами. Я тоже так же подумал, но закралось сомнение, что шиндовс может зарубить это дело. Спасибо, лучей добра.
Как создать диалоговое окно без VS и MFC? Просто не понимаю: что надо передать вторым параметром? Документация в msdn нихуя не говорит о MAKEINTRESOURCE(). Я только понял, что проект MFC в VS генерирует файл ресурсов каких-то .rc и заголовок с константами .h. А как без этого всего?
GetlastError() говорит о коде 1812, который, как я понял, как раз связан с этим аргументом. Я туда пробовал в цикле передавать числа от 0 до дохуя, пока функция не вернет > 0, но один хер ничего не вышло.
>>1567552 Поверхностно глянул, думаю вот тут проблема: case WM_COMMAND: if (GetAsyncKeyState(VK_SPACE)) {
Тут у тебя прога ждёт сообщение WM_COMMAND. Не надо завязывать GetAsyncKeyState на WM_COMMAND, надо чтобы GetAsyncKeyState просто выполнялась с параметром хоткея. У меня на скрине она просто выполняется без WM_COMMAND, хотя тоже можно завязать на WM_COMMAND(77h-код клавиши).
>>1567618 >вынести GetAsyncKeyState из switch Наверно да, попробуй, я хз как это сделать. Надо чтобы она самостоятельно проверяла клавишу, без сообщений.
>>1567626 Лол, вроде, сработало. Надо в игре попробовать. Алсо, я правильно понимаю, что это работает только с удержанием клавиши? А если нужна определенная периодичность, то надо свои костыли для обработки keybd_event писать?
Меня убивает местный рандом. Вот надо написать программу, решающую задачу о встрече. Я пишу так srand(time(NULL)); double z; for (int i=0;i< 1000000; i++){ int k = rand()%60; int j = rand()%60; if (abs(k-j) < 15) z++; } prinft("%f", z/1000000);
И эта программа выдает неверные результаты. А такой же код на пистоне с использованием randint(0, 60) выдает верные результаты. Почему?
>>1567633 >то надо свои костыли для обработки keybd_event писать? Ага.. я беру текст из текcтового файла и подставляю в keybd_event я там немного перепутал, sendinput тоже должен работать по идее
>>1567638 С игрой не выходит) Приходится вручную отпускать кнопку и нажимать снова, чтобы keybd_event/sendinput отработали 1 раз. Но это я просто посылаю сотни событий за раз. Надо будет еще как-то обработать эти нажатия, ограничив число вызовов.
>>1540431 (OP) Интересно а как распознователи всякие пишут? Я погромист-ньюфаня и крайне с трудом представляю как это. Вводят чтоли определённый диапазон геометрический на соответсвие какой либо области пределам формы? Цвет детектят по попаданию пикселей в тот или иной цветойо диапазон?
Ну допустим программа отличает где кошка где собака. Очевидно что у собаки более длинный нос чем кошки, меньше глаза чем у кошки и есть программа которая сверяет размеры + старается прогнать это всё под какой-то готовый шаблон похожей на кошчий нос формы. Сложно на словах это объяснять, ну я думаю вы понели.
Чтобы в этом разобраться, тебе надо разобраться в алгоритмах, которые для этого используются. Бери какую-то книжку по алгоритмам распознавания и читай.
>>1568131 конечно! если ты новичек, это будет еще и интересной задачкой на программирование делать примерно так: пишешь свою-функцию обертку my_scanf (или как ты ее назовешь), в ней парсишь первый параметр, как встретишь свою спецификацию формата, разбираешь ее по полям структуры, подготавливаешь новую форматную строку и передаешь дальше в стандартный scanf
>>1568148 my_scanf(char *s, ???) А что идет вторым параметром? Я хочу чтобы она не только со struct работала, а как scanf(), с примитивами тоже. Алсо, а без определения своей ф-ции никак? Ну, типо питоновский overriding.
>>1568158 >>Название твоей структуры А мне надо чтобы она и с интами и чарами работала, вотъ! >>Можешь её назвать scanf и она заменит обычный сканф Разве я не получу ошибку?
>>1568162 >она и с Тогда пусть принимает указатель на войд и уже сама как-то решает, что это за указатель. Сканф парсит для этого форматную строчку. >Разве я не получу ошибку? Проверь. Но опять же, зачем так делать?.
>>1568172 >>Тогда пусть принимает указатель на войд и уже сама как-то решает, что это за указатель. Сканф парсит для этого форматную строчку. Можно поподробнее?
Ананасы, кто что знает о SDCC компиляторе для 8-битных мк (в частности мне он нужен для stm8)? Оно вообще пригодно для нормальной работы? Я гоняю сейчас с ним тестовый код. Скомпилировал и слинковал код с отсутствующей реализацией функции - так оно сгенерировало финальный бинарь, а несуществующую функцию установило как будто она размещена на 0x0, лол. Ворнинг (не ошибку, а именно блять ворнинг) оно, конечно, напечатало, но из-за подобного долбоебизма пришлось добавить костыль в makefile. Теперь думаю - продолжать работать с этим говном или уж лучше юзать бесплатный IAR (при этом мне нужно будет его запускать на линуксе под вайном).
Читаю их списки рассылки - чувстсво, будто компилятор пишут какие-то отбитые индусы.
>>1568225 Анон, это все мелочи, говорю же, в самом коде нет таких ошибок. Результат то почти верный, отличается на сотые, тогда как в пистоне на десятитысячные.
>>1567636 Сама задача о встрече к слову Есть 2 человека. Они договариваются встретиться в промежуток времени от часа до двух. После прихода они ждут не более 15 минут. Найдите шанс их встречи. И в цикле должно быть <=15
>>1568298 нет. просто там если всё без разбора груизть 6гб будет загружаться. алсо я вот прочитал описание всех этих пакетов и не увидел там ни одного упоминания C только C++ и шарп.
>>1568310 >Visual Studio 2017 Community Edition: внезапно этим стало можно пользоваться, особенно с тулсетом clang/C2. Поддержка C11 на уровне "есть все, что тебе понадобится в реальном проекте плюс кривая библиотека". Анализатор кода в комплекте. из оп поста.
>>1568341 А на чём погромировать? На досе? Если ты о unix то иди со своей сектой в /s/ и там агитируй. Я хочу учить язык программирования, а не сосноль пердоли.
Итак, господа, СИшники в вашем ряду пополнилось. Только что высрал свой первый хеллоуворлд. Нравится вам это или нет, но теперь такая ньюфажная хуета как я с вами в одном треде будет сидеть.
>>1568455 >вендосектант Вскукарек со стороны столлманопараши. Кроме игрушек, на линупсе нет еще дохуя полезного софта, например, для записи и редактирования аудио и написания музыки. На венде куча вст плагинов на любой вкус и цвет, а на линупсе хуй да нихуя, хотя битвиг и рипер портировали, но какой в них смысл без плагинов? Правда, на маке дела получше, но для этого нужно быть геем. Остальные юниксы начиная со бзди даже рассматривать всерьез смешно.
>>1568474 Да не спорь ты сним, это же пердоля. Ты ему аргументы, он тебя гавном поливает. У них секта такая, самые агрессивные и неадекватные в айти сторонники пердоли. Просто игнорируй.
>>1568479 >программировать на котором в юникс системе не в пример удобнее. Может ему нужно программировать на Си и параллельно писать музыку, откуда ты знаешь? Современные ОС многозадачные, если что.
>>1568474 Ох какие мелочные претензии-то стали. Давно не следил, раньше хоть предъявляли, что игр нет, фотошопа. А сейчас только плагинов для аудиопердоль не хватает? Может и правда пора перекатываться.
>>1568563 >А сейчас только плагинов для аудиопердоль не хватает? А че ты смеешься? Твой любимый репчик и симфо джаз павер металкор в аудиопердолях записывается и сводится целиком, времена оналога давно позади.
>>1568591 Так эти люди и есть аудиопердоли! Желаю им всего наилучшего, кстати, но в отличие от пользователей фотошопа и тем более игорь, их число просто ничтожно. Поэтому я и сказал, что претензии стали мелочными.
>>1568295 > Desktop Development with C++ Вот это. Но тебе правильно сказали, запасись местом на винте, там далеко не гигабайт.
>>1568310 > Визуалка не предназначена для си Сохраняешь файл с расширением .c - будет Си. Или можно еще в настройках проекта насильно компилятору язык задать (/Tc).
>>1568479 > программировать на котором в юникс системе не в пример удобнее Особенно удобно пердолиться в gdb, когда source-level отладка не помогает, при том, что на винде есть качественные графические отладчики машинного кода. Или искать файлы find-ом, при том, что в винде есть Everything. Или придумывать, как же сделать программу с GUI, и чтобы не выглядело как Tk. Или изобретать свой формат для хранения настроек, снова. Или собирать чужие некомпилирующиеся утилиты с дохулиардом зависимостей, потому что скачать уже собранный бинарник нельзя. Вернее, скачать-то можно, но у тебя либц не той версии, и вообще иди нахуй.
>>1568599 Ну я пользователь аудиопердоль, например, что мешает мне полностью перейти на линупс. Если бы не оно, венду можно было бы держать только для йобы и на черный день (хотя на черный день достаточно ВМ).
>>1568612 Всё так. У тебя написано, что строку ввести "upto 100 character", но кто останавливает от введения более длинной? Вот тебе уже и overflow твоего массива. 100 уже будет много, потому что нужно место для '\0'
>>1568617 >>1568619 Что вы за люди-то. Черным по белому написано: "используй scanf_s вместо scanf", а вы тулите устаревшие небезопасные функции и отключаете предупреждения.
>>1568655 о спасибо, анон. тогда я включу назад вонинг тот. да я просто нашёл тут один самоучитель ебашу по нему, но он видимо староватый это я уже понял т.к. там новую строку обозначают 'n', а не '\n'.
>>1568665 >>1568655 только в отличии от scanf в scanf_s есть ещё третий аргумент - длина буфера её тоже нужно прописать иначе возможны выебоны со стороны системы.
>>1568681 Правильно, потому что эта функция безопасна и проверяет, не затронешь ли ты чужую память во время ее выполнения. А обычная версия может переписать чужой фрагмент памяти и порушить тебе все.
>>1568782 Это, вроде, непереносимый код. То есть только msvc такое скомпилит, а gcc будет работать с обычным scanf, насколько я знаю - у самого не получилось скомпилить прогу с VS2015 с помощью gcc.
>>1568800 Почитай про объявление массивов. Если ты уберешь квадратные скобки, то это будет обычная переменная. Если поставишь звёздочку - указатель, но нужно будет вручную выделять память под необходимое количество элементов.
>>1568867 >винда >как добавить пробел >решил проблему плюсовым ай о толстота пиздец. Хотя прямо под уровень треда.лайк если учишся в школе 21 и учишся писать код!!!
>>1567204 алсо загуглил вчера его биографию, что-то грустно стало. мужик придумал C много в современных кудахтерах сделано благодаря ему, а он умер в своём доме в одиночестве от рака простаты и даже точную дату смерти не знают т.к. не сразу его обнаружили.
>>1569096 да не он до последнего был у дел. работал там, его коллека же и обнаружил что он умер когда он долго не выходил на связь. жил там в доме, до последних дней жизни он занимался исследованиями в области кудахтеров. ну жалко, я то думал он ещё живой, обычно авторы предыдущих языков которые я учил все живые.
>>1568539 >интересные вещи Пишешь кароч такой const ya = {sosu: 'hui'}, каким-то хуем меняешь свойство sosu, полагая что это невозможно, на выходе получаешь не то, что ожидал. В итоге не можешь понять где и что могло наебнуться в коде.
>>1568539 Джава срипты, питоны, хуйтоны и прочая хуета для детей и веб-клоунов высерающих сайты под ключ это всё несерьёзно. Это всё языки для тех кто не хотели работать на дно работах и ВАШЛИ В АЙТИ лишь бы бабки были. Настоящие тру зароты дрочат Сишечку и крестики.
>>1568310 >Визуалка не предназначена для си. Ну да. Нахуй Си вообще нужен? На нём пишут только под микроконтроллеры, а там своё IDE есть фирменное. Студия же предназначена для нормальных программ под ПК, а тут Си не всрался совершенно, инвалидный огрызок.
>>1569232 Двумерный массив char размером NxM, где N - диапазон по X, деленный на шаг, а M - та же хуйня по Y. Идешь от x0 до xn, но если модуль производной больше 1, то не инкрементишь, а увеличиваешь ровно настолько, чтоб инкреметнулся y. И, собсно, все y, попадающие в вертикальный диапазон, рисуешь в массив (предварительно заполненный пробелами). А потом этот массив печатаешь.
>>1569232 Искать какую-то графическую (или гуй с зачаточной графикой) библиотеку. SDL или еще что. Если подойдет что программа будет генерировать svg файл с графиком (а не рисовать его на мониторе), то после беглого изучения описания стандарта (svg) с вики и расмотреных нескольких примеров простых свг можно писать график в свг. Там ничего особо сложного нет, должно хватить часа двух. А если еще найжешь свг с графикомто там вообще все просто - только свои числа подставить.
>>1569247 Ну если сделать так что а всегда больше б (тоесть если б больше а то менять их местами) то можно убрать один printf и оставить проверку только на равенство. Или ввести функции min и max от двух аргументов, тогда тоже можно убрать один printf опставить проверку на равенство и если не равны то там в будет что то типа printf("......", min(a,b), max(a,b));
>>1569256 а точно спасибо, как это я с ретурном то проебался. точно так программа гораздо быстрее будет завршаться. спасибо большое, анчоус.
А можешь подсказать ещё одну вещь. Вот нужна программа которая бы принимала x список чисел y список чисел который введёт пользователь. Суть в том что пользователь может ввести просто 3 числа, а может 10 ввести. Как это реализовать?
>>1569262 Рисовать тупо или именно графики строить? Хотелось бы готовый модуль с графиками в идеале. Ну или придётся с лицом лягушки пилить график самостоятельно
>>1569247 Так мона: int a, b, x; printf("Enter zaloopa"); scanf("%d%d", &a, &b); x=(a>b) ? a:b;//вроде можно без х, но не во всех стандартах if(a!=b)printf("zaloopa is %d, mask is %d", x, (a+b)-x); else printf("pizda");
>>1569263 А в чем проблема? Передал координаты ф-ции и получил график. Можешь на гитхабе поискать стороннюю либу если такое не устраивает. Ну или пиздуй в какой-нибуть mathematica(?)/PariGP(?)
Выродки блядь, вы можете иф стейтмент закрывать скобками? Невозможно вашу кашу из элифов однострочной хуеты с переносами читать. Либо закрывайте либо пишите тело в той же строке в которой стейтмент. И купите себе блять книжку со стайлгайдом
>>1569414 Ребенок-илитарий, написавший 0 строчек коммерческого кода, плиз, не нужно защищать свой скудный ум такой риторикой. Лестница элифов без скобок ВСЕГДА получается нечитаемой
>>1569460 шизло, ты? паренек делает учебный проект по приколу заливая видосики на ютуб, че тебе не нравится? Ах да, ты же долбоеб пишешь простынки иф стейтментов без скобок друг под кругом, прости что спросил.
>>1569470 >эти невнятные пуки ребенка-студннтишки не написавшего ни одной строчки коммерческого кода Не рвись так сильно, илитарий. Сомневаюсь что ты по теме треда вообще хоть что-то кроме хеловорлд левела ответить сможешь.
>эти невнятные пуки ребенка-студннтишки не написавшего ни одной строчки коммерческого кода >Не рвись так сильно, илитарий. Сомневаюсь что ты по теме треда вообще хоть что-то кроме хеловорлд левела ответить сможешь.
>>1569486 Я не жсблядь, но про if без скобок в одну строчку он правильно бомбанул. Никто уже не редактирует код в 80x40 терминалах, и твои лесенки в хуй никому не упали, они просто нечитабельны в нормальной IDE.
>>1569488 Еще один жопоглазик, лол. Ты сам-то веришь в хуйню, которую несешь? Вот смотри, тупа логика и нихуя более: когда ты пишешь в строчку, твой ретурн/принтф или что ты там обычно на своем жскале высираешь, просто сливаются с условием. Понимаешь? Т.н. "лесенка" позволяет тебе увидеть разницу в слоях. Так вот, когда эта лесенка одна, тебе на хуй не нужны никакие скобки, они тупо не играют никакой роли. А теперь съебал, шизоид ебаный. Подрочи на свой читабельный тс, лол.
>>1569488 Я те больше скажу братиш, тут жсблядей ваще нет. Просто ребенку НЕПРИЯТНО, и в жизни он стремных вещей видел настолько мало, что считает жс чем-то плохим.
>>1569490 Ты чё несёшь дегенерат? Ещё раз тебе говорю, по тому что ты пишешь уже видно что опыта у тебя просто ноль. Ниче ещё годик повкатываешься в школе 21, может вкатишься на галеру писать на жсе который ты так ненавидишь (причина наверное даже самому тебе не понятна)
>Я не жсблядь, но про if без скобок в одну строчку он правильно бомбанул. >Никто уже не редактирует код в 80x40 терминалах, и твои лесенки в хуй никому не упали, они просто нечитабельны в нормальной IDE. >Я те больше скажу братиш, тут жсблядей ваще нет. Просто ребенку НЕПРИЯТНО, и в жизни он стремных вещей видел настолько мало, что считает жс чем-то плохим. >Ты чё несёшь дегенерат? Ещё раз тебе говорю, по тому что ты пишешь уже видно что опыта у тебя просто ноль. Ниче ещё годик повкатываешься в школе 21, может вкатишься на галеру писать на жсе который ты так ненавидишь (причина наверное даже самому тебе не понятна) >этот разрыв жопы долбоёба со сломанным детектором. >мам симёны сматли мам
>>1569495 Тоже мне, блядь, притащил пруфы, лол. Ору с тебя - дауна. Алсо, скрины делать научись, говно позорное. И про лесенки свои иди затирай своим одноклассникам, за одно код стайлом похвастаетесь друг перед другом и подрочите на брудершафт, попивая смузи. Хррррртьфу!
Кстати как раз в жыесе и практикуется эта хуйня с однострочным ифом без скобок. Работая с си я такое видел только в либо стрёмном впопенсорце/всратом эмбеде из 90-ых (ну где нет никаких норм по кодстайлу), либо в коде который писали вчерашние студенты, так что господа сверху правы - с буйствующим гринтекстером все понятно.
Ты можешь быть истинно свободным только в рамках существующей системы правил. Либо это будут твои внутренние нравственные ограничения, либо навязанные обществом законы. Существующие правила позволяют не думать и не выбирать из множества альтернативных выборов. Так как выбора нет. Это повышает твою продуктивность и эффективность в конечном счете. Об этом, кстати, еще депутат Музулина постоянно толкует. Поэтому если вы примете правило 80 символов в строке, функции в 25 строк, плюс строгий код-гайл, вы только выиграете. Вот.
>>1570228 А можно создать список и сразу в нём инициализацию переменных сделать? а то у меня получается только создать их, а инициализацию нельзя. ну типа создать список с интеджерами уже известными.
>>1570299 Не понял твой вопрос. Ты когда память новому элементу выделяешь, тогда и "инициализируешь" его. Если тебе нужно его каким-то дефолтным значением после создания забить, то берешь и указываешь нужное. Но только нахуя это? Когда элемент добавляешь, тогда и выделяй память + значение нужное вбивай.
>>1570322 Ты тролль? Я тогда вообще не понимаю, как ты до списков дошел. Инфы, повторю, дохуя. Не обязательно книжку, можно статьи по мере надобности читать. Но для тебя, похоже, лучше действительно книжку от корки до корки прочитать, если цель изучения стоит. А если написать список, то читаешь про структуры, указатели, функции.
Пожалуйста, пользуйтесь https://ideone.com/#, https://wandbox.org/ или https://pastebin.com/ для вставки кода, если он длиной больше нескольких строк или содержит [i] или ∗.
Что читать:
- Brian Kernighan, Dennis Ritchie "The C Programming Language": http://www.cypress.com/file/56651/download
- Stephen Prata "C Primer Plus, 6th Edition" (2014): относительно свежая, знает про C89/C99/C11, описывает различия, объемная (около тысячи страниц), годная, с вопросами, упражнениями и ответами. Читать после K&R или до.
- Zed A. Shaw "Learn C the Hard Way" (2015): годное пособие для гуманитариев для гуманитариев!
- Немного примеров хорошего стиля: http://www.oualline.com/books.free/style/index.html
- ООП, например: http://www.cs.rit.edu/~ats/books/ooc.pdf
- Стандарт ISO/IEC 9899:1999 (C99): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf (драфт)
- Стандарт ISO/IEC 9899:2011 (C11): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf (драфт)
- Черновик стандарта ISO/IEC 9899:202x (C2x): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2385.pdf
- man/Dash/zealdocs
Чем компилировать:
- Очевидный GCC.
- clang: оче годно, батя рекомендует.
- Intel C++ Compiler: оптимизации, тысячи их.
- Visual Studio 2017 Community Edition: внезапно этим стало можно пользоваться, особенно с тулсетом clang/C2. Поддержка C11 на уровне "есть все, что тебе понадобится в реальном проекте плюс кривая библиотека". Анализатор кода в комплекте.
- Pelles C (шиндоуз онли): поучиться, вкатиться в C11 (стандарт полностью реализован, имеются в том числе threads.h и прочие stdatomic.h), но количество багов в оптимизаторе и редкие апдейты напрочь отбивают желание собирать этим что-то сколько-нибудь серьезное.
- TCC: очень маленький компилятор с багами и поддержкой C99. С ключом -run умеет компилировать код в память и запускать его, что позволяет писать скрипты прямо на сишечке.
Что еще почитать:
http://c-faq.com/
FAQ из comp.lang.c. Древний, но все еще актуален.
Samuel P. Harbison, Guy L. Steele Jr. "C: A Reference Manual, 5th Edition" (2002)
Ебаный пересказ стандартов C89 и C99 (включая стандартную библиотеку). Для не осиливающих стандарт в оригинале. Читать в качестве подготовки к собеседованиям (есть задачник с ответами) и для ознакомления с масштабами пиздеца перед написанием своего парсера/компилера.
Peter Van Der Linden "Expert C Programming. Deep C Secrets" (1994)
"Си: грязные истории". Смехуечки, немного объяснений, чем обусловлены особенности языка, всем известные подводные камни кто там ругал косяки в JS? у нас в сишечке их гораздо больше, просто они лучше спрятаны, немного байтоебли и непонятно откуда взявшаяся глава про старинные плюсы. Читать в качестве сказки на ночь (на пару вечеров хватит).
Richard M. Reese "Understanding and Using C Pointers. Core Techniques for Memory Management" (2013) - почитать, вкатиться в указатели.
Ben Klemens "21st Century C: C Tips from the New School" (2012)
Paul Deitel, Harvey Deitel "C for Programmers with an Introduction to C11" (2013)
Stephen G. Koch@n "Programming in C (3rd Edition или 4th Edition, если найдется)" (2014)
MISRA Ltd. "Guidelines for the Use of the C Language in Critical Systems" (2013)
Набор рекомендаций по написанию надежного кода на C (промышленный стандарт). Читать - однозначно, следовать - вдумчиво и без фанатизма. Также можно посмотреть https://www.securecoding.cert.org/confluence/display/c/SEI+CERT+C+Coding+Standard и http://web.archive.org/web/20190213011655/homepages.inf.ed.ac.uk/dts/pm/Papers/nasa-c-style.pdf
Еще более длинный список: http://www.iso-9899.info/wiki/Books#Learning_C
https://github.com/kozross/awesome-c
Онлайн-утилиты:
- https://godbolt.org/ - Compiler Explorer позволяет посмотреть выхлоп компиляторов для введенного куска кода (больше полусотни разных версий компиляторов).
- http://cdecl.org/ - С Gibberish ↔ English помогает читать сложные сишные декларации.
Прошлые треды:
- №48: http://arhivach.ng/thread/495505/
- №49: http://arhivach.ng/thread/496205/
- №50: http://arhivach.ng/thread/502813/