Тред, посвященный прародителю всех С-подобных языков и по совместительству единственному идеальному и всесторонне годному средству программирования как на системном, так и на прикладном уровне.
- Очевидный GCC. - clang: оче годно, батя рекомендует. - Intel C++ Compiler: оптимизации, тысячи их. - Visual Studio 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 помогает читать сложные сишные декларации.
>>1904813 → >ch = st; Ты пишешь значение байта (т.е. 0x20) в адрес. Если нужно в ch зафиксировать адрес то: ch = st + i * sizeof(char);
И возможно далее fputs(0x20, stdout) приводит к сигсгеву. Асло если ты хочешь "поймать" правый крайний пробел, то очевидно лучше начинать с конца массива.
>>1904970 В таких тонкостях памяти процесса я ещё не разбирался (и не особо знаю где инфу взять). >ch = st + i * sizeof(char) А зачем i + sizeof есть квадратные скобки могут разыменовать? >Асло если ты хочешь "поймать" правый крайний пробел По Прате надо было первый попавшийся.
>>1904973 >или же ch = &st; Так это же вроде взятие адреса самой переменной указателя, а не значения по нему хранящегося.
>>1904979 Макаба зачем-то съедает квадратные скобки. Должно так: ch = &st(i); Только скобки разумеется квадратные. Так ты берешь адрес байта с пробелом. Без амперсанда - просто записываешь значение (0х20) этого байта в возвращаемый адрес.
>По Прате надо было первый попавшийся. Тогда после лайна с получением адреса первого пробела напиши break; И как вариант - https://pastebin.com/wK2rePHk
Я правда так и не понял, чем тебе strchr() не угодил.
Меня вот заинтересовало почему бы просто не использовать типы из Rust в C? Они ведь действительно очень лаконичны и могуть быть определены, если typedef'нуть через громоздкие аналоги в inttypes.h? Ну и за'define'ить спецификаторы для scanf и printf. По типу https://pastebin.com/3hPbqxur
Как людям норм работать с int при написании целых ОС, когда там то 2 байта, то 4? Или вся суть заключается в том, чтобы взять самый быстрый тип int (обычно) и от него плясать беря чуть меньше или чуть больше уже в зависимости от ситуации?
>>1904954 (OP) Есть желающие заработать 500р? Меня заебало мучаться с этим языком, хочу сдать и забыть уже, ибо это 1 предмет, все остальное мы пишем на человеческих языках.
Нужно на СИ написать функцию, аналог линуксовой команды find без использования system() Нужно чтобы эта функция проходила по каталогу, который передан как параметр, выглядеть должна вот так void find(char path, char type, charname){...} Соответственно к примеру, find("Folder/", "-name", ".txt)" должна находить все файлы в Folder с расширением .txt. и выводить их в консоль. обозначает все файлы, find ("Folder/", "-type d", "t*"), должна найти в Folder все каталоги начинающиеся с t и вывести в консоль.
А , да, без всяких конченных либ, без conio.h, windows.h и тд, чисто либы, которые заложены в линуксовой среде так скажем, соответственно, это компилировалось с помощью команды gcc -ansi -Wall -o main main.c к примеру пусть файл называется main
Кому интересно - оставляйте свою телегу. Думаю, для людей, которые любят этот язык тут работы на минут 15-20.
>>1905602 Ну это хорошо, в нашем случае версия упрощенная, остальной функционал я сам уж. >>1905588 спасибо, это решает мою задачу. Так то у меня проект написан, основная ебля была с тем, чтобы искать все файлы, то бишь аналог звездочка.txt реализовать. Еще вопрос. Как добиться вывода в таком виде? Просто не очень понимаю, как динамически такие штуки делать.
Пишу по-фану файловый менеджер. Соответственно для открытия файлов нужно вызывать nano/vim/etc...
Интересуют 2 вопроса:
Как узнать у системы наличие одного из этих редакторов, кроме поиска бинарника?
Как вызвать запуск бинарника не через system("..."). По второму нарыл только всякие exec* функции, но у них не удаётся разобраться с передачей параметров запуска редактора, а именно пути к файлу. Т.е. я смог вызвать только запуск nano без аргументов.
Есть один тупой вопрос, извините: в чистом си можно объявить и инициировать массив с нулями? На стаковерфло пишут, что можно int i[n] = {0}; но у меня компилятор не пропускает.
>>1905237 В чем Раст новатор так это в удобных названиях для точных типов, мне кажется в C людям просто лень вбивать uint64_t и PRId64, SCNd64, и все просто пользуются long long и прочими стандартными типами. Ну Расту было проще, не надо было поддерживать legacy. Я ждал, что кто-то недостатки перечислит такого подхода как я выше описал, но мне кажется даже если код выкладывать с такими забиндеными Растовыми типами вместо uint64_t, то все даже очевиднее будет, чем разбирать все эти (num)_t в конце, просто u64 и ничего лишнего.
>>1906495 >какого хрена они не сделали жесткую размерность типов Мультиплатформенный язык программирования. У разного железа разные размерности. А растоговно, как и любая скриптопараша, работает само в себе, в своем манямирке, безотносительно железа, поэтому там и можно сделать одно фиксированное навсегда и навезде.
>>1906695 Хочешь сказать логично из 8 16 32 64 битных репрезентаций сделать не 4 точных типа, а 5 где два из них будут иметь одну размерность на стыке и не будет очевидно до проверки, где это происходит? В стиле либо int = long, либо long = long long. У C просто плохая историческая практика закрепилась из-за того что все добавляли постепенно как тот же long long в C99 и по-разному определяли типы постепенно поднимая размерности. Вне этого подхода сейчас на любом железе будут и 8 16 32 64 битные варианты хранения чисел, кроме совсем экзотического legacy.
>>1906712 Людям не нужна разрядность. Людям нужен тип целое число. Например количество аргументов в строке, количество строчек в меню. Разрядность нужна единицам байтоебов с хитрыми битовыми алгоритмами.
>>1906728 Людям надо знать, сколько в их целое число поместится. А то можно сделать int, а окажется, что он размером в два байта и хопа - переполнение.
>>1906712 int это размер соответствующий железу. На 32-битном проце будет 32 бита, и т.п. Это значит, что один и тот же код на любом железе будет аналогичный, т.е. код предсказуемый, ты знаешь какой код пишешь.
Если же int привязать к размеру (возьмем к примеру 32 бит), тогда на 16-битном процессоре, который не может оперировать 32 битными числами, сгенерится лишний код, чтобы выполнить это уже в два прохода, а на 64-битном проце, который всё равно оперирует только 64-битными числами, ты тупо просрешь в никуда половину размера. И то и другое получается непредсказуемый говнокод. Такое говно никому не нужно.
Повторяю. Си - язык програмиирования железа, это значит, важен код который ты пишешь, ты должен знать какой код пишешь. Если же ты предпочитаешь результат, а какой код там высрется тебе похуй, это будет не программирование (железа), а алгоритмический скриптомакакинг.
Скриптомакака - как плохой начальник. Не знает и не понимает что делают подчиненные и срать хотел. Его волнует только результат "чтобы было сделано, ведь нужно отчитаться перед высшим начальством/заказчиком/инвесторами". А что там у работников, которые это реалдьно делают, емук позуй, какая у них нагрузка, и вообще. Он делает так, если сделано, хорошо, если не сделано, надо нанять других, кто может, а этих уволить. Вот и у скриптомакак такое же отношение к компьютьеру. Если не работает, нужно выкинуть компьютер и заменить на новый, коиторый сможет.
Размеры типов устанавливает производитель процессора, и естественно руководствуется исключительно прибылью, а не соответствием стандарту. https://news.ycombinator.com/item?id=3112704
>>1907443 Единственное, что в винде нормально сделали. И то названия всратые. DWORD это сколько, блядь? Раньше это было 16 бит, щас в MSDN написано, что это 32.
>>1907466 >DWORD это сколько, блядь? sizeof() в помощь. А вот пихать цифры в названия типов это плохая идея, слова лучше запоминаются и меньше путаются и мельтешат.
Можно ли вкатитьсы в си без корочки? Что "учи язык" - это понятно. Но си ж низкоуровневый, нужно трогать штуки, опасно близкие к фатальной ошибке. Дипломированное знание устройства компа обязательно или шансы есть? Подводные? Истории успехов?
>>1907959 Можно запросто, в 80-е 12-летние песдюки вкатывались даже в ассемблер - такие потом игры писали на продажу. Читай книжки, их для начала достаточно.
Что касается подводных.
Пока не поймёшь указатели и представление данных в памяти - в сишники путь тебе закрыт. Это не очевидно, но преподы считают это самой сложной темой для вкатунов.
Далее, язык Си ненавидит людей и ищет любую возможность нам поднасрать. Мы называем это "неопределенное поведение", "undefined behavior", или просто "UB". На примере. Допустим, ты пишешь a=b+с, и результат не помещается в a. В нормальном языке - Жабе - происходит переполнение и у тебя в a просто неправильный, но ожидаемый результат. Си не таков: компилятор считает, что ты обязан быть богом программирования, и UB в твоём коде означает лишь, что этот код просто никогда не должен исполняться. И он запросто может взять и убрать из итоговой программы огромную простыню кода, потому что в ней содержится это самое UB. А ты потом ищи, где в программе из сотен тысяч строк спряталась неочевидная лажа.
Последнее - в чистом виде на Си новые проекты уже практически не встречаются. Практически весь код на Си - старьё типа nginx или linux, где и без тебя всё збс. Причин писать на нём что-то новое очень мало. Даже микроконтроллеры с 1КБ памяти на борту уже, бывает, поддерживают C++. Поэтому сколько бы ты Си не задрачивал, зарплату это тебе не прибавит.
>>1907978 Я сходу могу назвать новый проект на сишке - janus-gateway. Как раз щас с ним разбираюсь.
На самом деле сишники охуенно востребованы. С оговоркой: сишные боги. Крупные компании используют сишку. Либо патчат ядра, либо пилят какие-то свои нахлобучки для сетей, или что-то еще подобное.
А еще это огромный запас существующего кода и вылизанные быстрые библиотеки. Когда мне нужно было написать очень быстрый видеосервер, я его нахуярил за пару месяцев на сишке с использованием libevent для веб-части. Разумеется, он рвет по скорости все существующие поделия.
>>1907959 Я в свое время вкатился в программирования, изучая сишку, пока был школием. Потом активно изучал питон и сишку подзабросил. Однако опыт разработки на питоне был полезен, когда я вернулся в сишку, потому что в сишке как нигде необходимо хорошо уметь в проектирование, иначе у тебя получится кривое падучее говно. Ну и еще всякие штуки типа параллелизма на питоне несколько проще изучать в силу наличия большого количества высокоуровневых абстракций.
Но вообще, ящитаю, одна сишка с высокой долей вероятности будет бесполезна, если только ты не ядерщик или эмбеддер. Вероятнее всего тебе потребуется знать еще два-три языка. На скриптухе или высокоуровневом писать бизнес-логику, на сишке - критичные к производительности вещи.
>>1907978 >Допустим, ты пишешь a=b+с, и результат не помещается в a. В нормальном языке - Жабе - происходит переполнение и у тебя в a просто неправильный, но ожидаемый результат. Си не таков: компилятор считает, что ты обязан быть богом программирования, и UB в твоём коде означает лишь, что этот код просто никогда не должен исполняться. И он запросто может взять и убрать из итоговой программы огромную простыню кода, потому что в ней содержится это самое UB. По-моему ты гонишь, не может компилятор в таком случае выкинуть код. UB значит, что результат может быть любым, условно ты можешь получить число по модулю, а можешь 0. Но это скорее про случаи m[x++] = m[x++] + n[x++]. Просто вот так не надо писать и всё, одни какие-то подобные случаи прописаны в стандартах, другие нет.
Просто сложение с переполнением будет транслировано в обычную ассемблерную команду, предсказуемую, и компилятор просто предполагает, что ты знаешь, что делаешь, и переполнения не будет, это не случай UB.
>Причин писать на нём что-то новое очень мало. Тут ты тоже не прав, поскольку Си это один из основных языков для расширений, а плюсы тут плохо стыкуются, и реально много пишут на Си, без плюсов.
>>1907994 Это местный форсер, который срет примером со сложением повсюду. В компиляторах есть флаги чтобы отлавливать целочисленные переполнения, в стандарте это UB потому что на разных аппаратных платформах это работает по разному, а сишка, в отличие от джавы, должна работать везде.
>>1908040 Ты описываешь implementation defined, а не UB. Это явления другой категории. При UB компилятор действительно может убирать инструкции. Условный пример, ты делаешь какое то UB, а потом пишешь if(cond) {...} компилятор волен полностью выкинуть этот код, потому что по его мнению cond никогда не выполнится, потому что считается что UB в программе отсутствуют.
указатель 0 = &элемент обычного двумерного массива 0 0 Как пример: Обычный массив: c b a d f Массив указателей: 0 1 2 34 if(b < 0) в данном случае меньше { 0 = &b; 1 = &c; }
>>1907988 > Я сходу могу назвать новый проект на сишке - janus-gateway. Как раз щас с ним разбираюсь. Ну да, писать на Сишке можно и сейчас, но нахуя? Этот проект по описанию просто идеален для Go или Rust, а они, поди, решили, что без языка 50-летней давности им ощущения не те.
> На самом деле сишники охуенно востребованы. С оговоркой: сишные боги. Может где и востребованы, а в наших ебенях (ДС, то есть) сишный мидл получает 70к, а гошный - 140, при гораздо менее мозгоебной и более перспективной работе последнего.
> Тут ты тоже не прав, поскольку Си это один из основных языков для расширений, а плюсы тут плохо стыкуются, и реально много пишут на Си, без плюсов. Нормально они стыкуются, в них встроена совместимость с Си в обе стороны. То, что интерфейсы библиотек принято описывать сишным хидером не значит, что в новых проектах следует использовать ебанутый язык, в котором типовые структуры данных каждый раз приходится изобретать заново.
> По-моему ты гонишь, не может компилятор в таком случае выкинуть код. UB значит, что результат может быть любым, условно ты можешь получить число по модулю, а можешь 0. Нет, не гоню. Сам посмотри вот эту статью: https://dspace.mit.edu/bitstream/handle/1721.1/86949/Kaashoek_Undefined%20behavior.pdf - суть в том, что Си (а с ним и Си++) может удалить вообще весь код, который сам по себе может привести к UB. В том числе проверки, этот UB предотвращающие! Учитывая, что в стандарте Си UB упоминается больше 500 раз, язык этот стоит воспринимать как язык ковбоев, ищущих острых ощущений в области седалища.
>>1908040 Ага, а вот и ковбой Горбатой горы подоспел. Я тебе напомню, что платформы, в которых числа не представлены в виде two's complement, устарели ещё до твоего рождения, и с тех пор весь дрочь на оптимизацию при помощи UB идёт строго в убыток. Но ты-то на Си не пишешь, а только пиздишь, так что убеждать тебя в чем-то бесперспективно. Пару раз проведешь неделю овертаймов в поиске ебанутых UB - поумнеешь.
>>1908091 Дело-то в том, что в Си переполнения действительно UB. Вот пидорок выше правильно пишет, что есть в компиляторах флаги, переводящие некоторые UB в implementation defined. В этом и дело - ты приличный человек и предполагаешь, что и Си проектировали приличные люди. А они уёбки, понатыкавшие в языке сотни ждущих своего часа мин. И всё ради 10% производительности в 10% микробенчмарков. Казалось бы, студенческого уровня косяк - ради пары процентов скорости сломать программу - а оказывается, там целый комитет старых гондонов сидит, стандарты пишет.
>>1908303 > Этот проект по описанию просто идеален для Go Сборка мусора вызовет непредсказуемые задержки в передаче видео. Я хоть и обеими руками за гошечку для микросервисов, но тут она явно не к месту. Для своего сервера я выбрал сишку именно по этой причине.
> Rust Уже лучше, но слишком сырой слишком для продакшна как по мне.
> Может где и востребованы, а в наших ебенях (ДС, то есть) сишный мидл получает 70к Я же написал: сишные боги. В яндексе/мейле/етц топовый сишник стартует с 200k и идет дальше. Это я тебе как экс-яндексоид говорю.
>>1908330 Топовый пхпшник лол сука тоже с 200к стартует, только он вообще не ебет что такое память, потоки, процессы и так далее, тупо пишет дтохи, контроллеры, говносервисы да говновалидацию да в базу лазает.
Говнопрогер на пыхе решил изучить итерналы своего языка и понял, что зенд енджайн написан на сишке. Бля, поцоны, а реально на си работу найти? Меня заебала уже эта пыха, хоть вешайся...
>>1908346 Я ничего не знаю о рынке пхпшников, но мне кажется что топовый должен как раз знать сишку, чтобы фиксить ядро этого говна. Имхо, за пхп можно получать столько только если удачно примазаться на старте и сидеть сеньером в техкомитете, либо работая на западного барина. Кто вообще наймет пхпшника-онли с улицы за что-то большее 100к?
>>1908436 Не, ты не понял мой вопрос. Допустим, в компании есть бек на пыхе. Зачем компании нанимать пыхомакаку за зарплату больше миски риса, если кроме пыха она ничего не умеет?
В яндексе есть racktables, который написан на пыхе. Соответственно, есть несколько человек, которые его поддерживают. Так вот у них у всех кроме пыха еще пяток языков в запасе, и пых далеко не основной. Зарплата соответствующая.
>>1908470 > Зачем компании нанимать пыхомакаку за зарплату больше миски риса Потому что нормальный бэкендер не пойдет работать за миску риса. > если кроме пыха она ничего не умеет? А что он должен уметь еще? Ну само собой он может в БД, брокеры, кеши, куберы и прочее, ведь он бэкенд разработчик. Зачем ему знать 5 языков? каждый одинаково хуево У вас сишников своя реальность где 200к деньжища?
>>1908475 Нормальный бекендер будет знать не только пых.
> У вас сишников своя реальность где 200к деньжища? Я тебе просто пример привел. Сишник, работающий на западного барина, поднимает гораздо больше. Но таких сишников нужно ограниченное количество.
>>1908481 > Нормальный бекендер будет знать не только пых. Ну будет знать пыху + го или пыху + питон/ноду, зачем ему 5 языков? Или SQL, HTML и прочее тоже идет в счет? > Сишник, работающий на западного барина, поднимает гораздо больше. Кто угодно получает больше на западном рынке.
>>1908482 Ща тебе нонейм с двача пояснит, что твой опыт не опыт, а сам ты сисадмин, если не знаешь... делаем ставки чего. Я бы поставил на кложу/элексир. Или раст.
>>1908486 >>1908482 Господа, чтобы сразу не было ко мне претензий. Я сужу с позиции большого тырпрайза, поскольку работал в основном именно там, пока не ушел на вольные хлеба.
Ситуаций может быть много. Первая - когда сидит команда и пилит не конкретный сервис, а инфраструктуру. Поскольку опенсорс в чистом виде обычно слабо подходит для использования, поэтом его допиливают и поддерживают по месту. Один сервис на пхп, другой на питоне, третий - на гошечке, а сбоку крутится какой-нибудь четвертый, на ноде. Потом оказывается, что что-нибудь не справляется с нагрузкой и это кусками переписывается на си или плюсах. Как правило, все члены команды знают все перечисленные языки. Плюс, некоторые являются адептами чего-нибудь экзотического, типа M4. SQL и прочее за языки не считается, это должно быть само собой разумеющееся.
Опция два. Сидят ядерщики и пишут какие-то ядерные модули на сях. Стоят дорого.
Опция три. Программиста берут на конкретный проект. Обычно он знает полтора языка, нужных проекту. Платят ему не очень много.
Что до моего личного определения "нормального бекендера" - это человек, который не только может что-то писать на каком-то языке, но понимает еще и тонкости оптимизации, сеть, ось и умеет в архитектуру. При необходимости может пойти и попатчить ядро или любой опенсорс, чтобы решить свою локальную проблему.
>>1908495 Да ну бросьте оба. Я же не фанбой отбитый. Просто пересказываю то, что видел сам. Просто если чел не может докопаться до глубинной проблемы, связанной с интерпретатором того же пыха, то что он будет делать? Заведет тикет на гитхабе что ли? Будет по форумам ходить?
Проблемы, которые приходится решать в больших проектах, обычно относятся к классу "я погуглил, но нашел только свой собственный вопрос на SO".
Я не говорю, что PHP+SQL+JS-онли ребята не нужны. Нужны, конечно. Просто получают они меньше чем тот класс, который я привел в первой опции.
>>1908510 > Просто если чел не может докопаться до глубинной проблемы, связанной с интерпретатором того же пыха Тут вообще орнул, как часто ты лезешь чинить интерпретатор? Так и вижу как e-commerce или банк пишет патчи для интерпретатора пыхи, там большинство кодеров пишут на жабе или пхп и никогда подобным не занимались, а зп могут быть вполне норм. > Я не говорю, что PHP+SQL+JS-онли ребята не нужны. Нужны, конечно. Просто получают они меньше чем тот класс, который я привел в первой опции. Ну 200к они легко получают, про работу на запад за доллары я вообще молчу.
>>1908520 > как часто ты лезешь чинить интерпретатор? PHP не чинил ни разу, так как не пишу на нем. Раза три чинил питон, и за последний год нашел несколько багов в ядре, которые аффектят юзерспейс. Один из них весьма древний.
>>1908510 Ты наглухо ебанутый и оторванный от реальности как будто, если 200к для тебя деньги, то их получают, 300к тимлиды тоже получают, тупо за крудошлепские сервисы с пыхой да симфони, да там кафка, кубернетес и прочая хуйня, но сам язык там пхп и другой язык там не нужен, никакой интерпретатор там никто не дописывает. На джаваскрипте так же, никто лезть в v8 не будет переписывать, а пишут бэк там вчерашние формошлепы фронтендеры, еще хуже чем на пхп в плане архитектуры.
Джава мир вообще в себя погружен, если в пхп мире еще го стал популярен где пыха говно, так джава в принципе в вебе все может делать кроме ебанутого числодробления наверное. Джава тимлид в крупной компании в ДС получает за свой говноспринг 300-400к.
На запад же можно как бы и вордпресс говно за 3к баксов в мес делать, можно и за 7к в мес говноконсумеры на ноде к кафке приделывать. Без какого либо там си, FFI, JNI и так далее
>>1908526 >Раза три чинил питон, и за последний год нашел несколько багов в ядре, которые аффектят юзерспейс У меня есть знакомый питонист, не знает как в питоне gc работает, получает 200к.
>>1908536 >и позволяет поднять себе ценник. Очень сомнительно, если проект байтоебский то да. А когда ты пишешь условный маркетплейс, банкинг или агрегатор какой нибудь хуйни, то это вообще непонятно зачем нужно.
>>1908539 Ну почему же. Знаю челика, ему 35. Работает в яндексе, в основном хуярит ядро, по мелочи пишет на питоне и гошечке. Стоит дорого.
Толковость появляется от опыта работы. Если годами json`ы перекладывать, то понятно, можно до седых мудей таким не стать. Если вписаться в технически сложный проект и не сидеть в нем до скончания времен, то опыт и наберется.
>>1908541 А тут уже вопрос, чем именно ты хочешь заниматься. Если маркетплейсами - то да, необходимость почти нулевая. А если какой-нибудь сверхвысокий асинхронный хайлоад (r) (c) (tm), то там это нужно. Деньги уже другие, разумеется. Полмиллиона и выше.
>>1908502 >Что до моего личного определения "нормального бекендера" - это человек, который не только может что-то писать на каком-то языке, но понимает еще и тонкости оптимизации, сеть, ось и умеет в архитектуру. При необходимости может пойти и попатчить ядро или любой опенсорс, чтобы решить свою локальную проблему. Ты таких ИРЛ вообще встречал хоть раз?
>>1908890 Да Причем без шуток. Знакомый погромист и либы чужие патчил, когда находил дефекты в них, и архитектурой занимался, оптимизацией производительности, а сам по себе мастер по написанию кода для бэкэнда.
>>1908890 Да. Работал с такими челиками в разных командах. Как правило после рашкинских компаний они перекатываются куда-то в более интересные места. Например, челик со знанием сей, плюсов, питона и тонкостей сетей (плюс цисок, жуниперов и хуевеев) укатился в спейсикс. Другой челик с таким же набором - в фейсбук. Родственник мой пилил распределенные системы. Ну и я тоже, т.к. работал в упомянутых командах. Я в сетях особо не разбираюсь, но у меня прокачан скилл проектирования архитектуры и распределенных систем. Укатился в свой софтово-железячный стартап.
>>1909388 Перемешивает биты в числе особым образом, чтобы вышло число с симметрией относительно центра? Хуй знает, запутанный обмен, лень разбираться больше 5 минут, такое прямо в IOCCC отправлять после должной доработки, лол.
>>1907027 Мне кажется, что такой подход был уместен, когда были архитектуры условно 16-битные и 15-битные, 32-битные и 27-битные, двоичные и экспериментальные троичные. Но когда на ПК int 32-битный, а на ардуине 16-битный и алгоритм перестаёт работать, то это плохо.
>>1910016 Да, такой подход не уместен, он единственно возможен, ибо других не может быть. Посмотри на пики. Есть два робота, большой и маленький, и язык программирования роботов. Ты пишешь команду: >сделать_шаг(); В результате, оба робота должны одинаково сделать шаг, и похуй что первый робот выполнит поставленную задачу - раздавить вон того тупого еблана вроде тебя слева, а второй шагнет на пару сантиметров и ничего не добьется. Это нормально, так и должно быть. А вот игнорировать спецификации роботов и хотеть чтобы любой робот одной командой выполнял одинаковую задачу, т.е. одной командой первый робот просто делает шаг, а второй разбегается, подпрыгивает, достает нож и втыкает его в шею цели, т.к. весом убить еблана не может, зато задача выполнена. Такая поебень - не программирование, и никому не нужна, кроме тупых ебланов, которых надо вычистить как вредные органические отходы, заражающие планету.
>>1910432 Бред. Современный мир омонополен несколькими крупными производителями микроэлектроники и все они двоичные, а их регистры в большинстве своём кратны восьми и являются степенью двойки. И очевидно, что каждое 32-битное число, когда к нему добавляется 1 должно либо увеличено на единицу, либо переполнено и обнулено. А когда один и тот же тип ведёт себя как сумасшедший на разных машинах, это очень плохо. Представь, написал ты машине variable++, а она вместо того, чтобы увеличить значения на единицу, вызывает rm -rf /*. Нарушаются все принципы, которые только можно. Зачем вообще в таком случае программировать на сижке, если можно сразу на ассемблере? Там и изучения спецификации машин, и библиотеки можно оптимизировать под готовые инструкции. В одной машине не будет инструкции для синуса и придётся функцией посчитать. А в другой будет, но значение плюс-минус 0.1, ещё и рандомное каждый раз, потому что считается через аналоговую электронику. Вот будет веселье программисту! Все графические и физические движки будет переписывать на ассемблер. Настоящее программирование, как положено настоящему мужику! Я не мужик, так что я такое не выбираю. Мои алгоритмы должны работать одинаково на всех машинах. Чтобы один и тот же код можно было запустить хоть на ПК, хоть на микроконтроллере и он исполнился правильно. И, даже, на разных типах, для чего в современных языках программирования есть дженерики и темплейты (сишные макросы до них не дорастут). То, что ты описал не нужно нормальным людям, но я не считаю, что вас надо уничтожать. У вас есть право на своё мнение и вы можете заниматься байтоёбством сколько хотите.
Хотя, действительно, есть ряд задач, где можно типы сделать не совсем ясными. Например, флоат для 3D-графики. Не всегда важно, будет single или double считаться в шейдере, потому что в большинстве программ отображение графики будет почти одинаковым. Ну, может цвета пикселей или их расположение будет немного другим. В таком случае уместно вводить отдельный тип, который может себя вести как халф, сингл или дабл.
>>1910808 >Бред Ридинг компрехенсион скрипто-дебила. Катись обратно в свои скриптотреды, там давно типы все одинаковые. Зачем сюда, в программирование лезешь? А понимаешь, что выродок, подсознательно понимаешь, что тут умные люди, не чета таким как ты, вот и пытаешься примазаться. Но это бесполезно, говно не умеет ничего кроме как срать, лучше от этого не станешь.
>Мои алгоритмы Си - язык программирования железа, а не алгоритмическая параша для первоклашек и сходных с ними по интеллекту дегенератов. Езе раз: СИ - НЕ АЛГОРИТМИЧЕСКАЯ ПАРАША. Ферштейн?
>>1910808 > Бред. Современный мир омонополен несколькими крупными производителями микроэлектроники и все они двоичные, а их регистры в большинстве своём кратны восьми и являются степенью двойки. И очевидно, что каждое 32-битное число, когда к нему добавляется 1 должно либо увеличено на единицу, либо переполнено и обнулено. А когда один и тот же тип ведёт себя как сумасшедший на разных машинах, это очень плохо. А прям много таких машин где int ведёт себя как сумасшедший? > Представь, написал ты машине variable++, а она вместо того, чтобы увеличить значения на единицу, вызывает rm -rf /*. Нарушаются все принципы, которые только можно. Поехавший пример однако. > Зачем вообще в таком случае программировать на сижке, если можно сразу на ассемблере? Лучше сразу на сигаре. > Там и изучения спецификации машин, и библиотеки можно оптимизировать под готовые инструкции. В одной машине не будет инструкции для синуса и придётся функцией посчитать. А в другой будет, но значение плюс-минус 0.1, ещё и рандомное каждый раз, потому что считается через аналоговую электронику. Вот будет веселье программисту! Все графические и физические движки будет переписывать на ассемблер. Настоящее программирование, как положено настоящему мужику! Чтоб такой хуйни не было и пилят более комплексные языки программирования. А если какая-то функция на железке неадекватная, и не ведёт себя так как на другом железе - ее выносят в specific функционал, и делают реализацию чтобы вело оно себя так как и везде. > Я не мужик, так что я такое не выбираю. Мои алгоритмы должны работать одинаково на всех машинах. Чтобы один и тот же код можно было запустить хоть на ПК, хоть на микроконтроллере и он исполнился правильно. Замечу ты это про предыдущий абзац, а там сказано тобой же про ассемблер. А где собственно Си тут? > И, даже, на разных типах, для чего в современных языках программирования есть дженерики и темплейты (сишные макросы до них не дорастут). Не понял к чему это тут. > То, что ты описал не нужно нормальным людям, но я не считаю, что вас надо уничтожать. У вас есть право на своё мнение и вы можете заниматься байтоёбством сколько хотите. Да ты поехавший. Привел в пример ассемблер. И рассказывает что мы какие-то не такие. > Хотя, действительно, есть ряд задач, где можно типы сделать не совсем ясными. Например, флоат для 3D-графики. Не всегда важно, будет single или double считаться в шейдере, потому что в большинстве программ отображение графики будет почти одинаковым. Ну, может цвета пикселей или их расположение будет немного другим. В таком случае уместно вводить отдельный тип, который может себя вести как халф, сингл или дабл. Вообще разница есть между float и double в графике. Как минимум в производительности, и в точности. Особенно когда считаешь геометрию. Или сраное сглаживание.
>>1910016 Тебе стандарт и традиция гарантируют для инта +-32767. Если ты знаешь, что в алгоритме нужен больший диапазон, не используй инт. И тогда не будет никакого "перестает работать".
>>1911937 Я знаю. Функция по сигнатуре принимает переменную хранящую указатель на указатель. Но поему-то в качестве аргумента можно просто прописать указатель на строку и он запишется в локальный массив указателей на указатели т.е в двумерный массив функции. По-моему это какая-то очень неочевидная хуйня.
C помощь read как-то можно считать символы не передвигая при этом позицию в файле? То есть записало в строку, но при следующем read начинало бы с того-же места?
>>1910843 ты какой-то обиженка есть железо, есть алгоритмы - в чем проблема? Одно без другого - как ручка без чернил (ну или чернила без ручки) Нам как фронтендеры нужны с их красивыми сайтиками, или питонисты с их джанко и мл так и хардварники с их управлением памятью, оптимизацией и прочим выпей уже таблеток, а?
А в каком случае оверфлоу может что-то там повредить, если конпелятор прежде чем декрементировать memx, кидает это в соотетствующий блок регистра? И даже для машины subb, subd, subl и subq это разные инструкции, работающие с соотвествующим размером.
>>1912386 >Скорее всего он имеет в виду, что при декременте оно не может уйти в отрицательные числа и вызовет где-нибудь переполнение. Ровным счётом та же проблема с signed.
ХЗ, давно не писал на Си, но вроде как хорошим тоном считается использовать int32_t/uint32_t
БЛЯТЬ, поясните нюфаку чем всё-таки опасны эти ваши овер/андерфлоу? Я раньше думал, что соседние байтики и битики страдают, но как оказалось, это не так. >>1912424 >Поясняю: пикрил 1 - опасно; пикрил 2 - безопасно. И первое, и второе - опасно, если воткнуть в анус.
>>1912515 Тем что это UB (undefined behaviour) то есть компилятор может считать что ты написал некорректный код и выкинуть его или поменять на другой. Хуже того, вся программа считается UB.
>>1912710 >Тем что это UB (undefined behaviour) А где здесь ЮБ? Если сегментация не нарушается, а переполнение только-только зажигает OF и сама память меняет значение с TYPE_MAX на TYPE_MIN (и наоборот). Я конечно понимаю, что такое посредственно может вызвать перезапись буффера (например записать 0х7ff байт вместо одного), но эта проблема вроде как отдельно решается.
>то есть компилятор может считать что ты написал некорректный код и выкинуть его или поменять на другой.
Это как? Конпелятор будет предугадывать или даже вычислять, что там случится в рантайме? Меня траллируют, да?
>>1912710 Конпелятор делает оптимизации, которые меняют поведение кода в случае переполнений. Вот это > if (i+1<0) может заменить на > if (i < -1) сэкономив одну инструкцию. Подставь maxint на место i. Первый иф будет истина, второй ложь.
>>1912433 Обыкновенно. Включи голову: int не отлавливает переполнение, значит что нужно сделать? Нуууу!? Конечно же написать свой manyaint который будет отлавливать. Ты программист или кто? Кто еще за тебя будет программировать твои маняхотелки, кроме тебя самого? Язык имеет все средства для реализации чего угодно, так что вперед и с песней.
>>1913856 >дайте мне абстракцию, мам >ну на, держи >бля, охуительные истории, абстракцию предлагают С дефектами мышления в программировании делать нечего.
>>1913924 Stephen Prata, C Primer Plus Chapter 11: Character Strings and String Functions Досконально раздраконена тема, просто досконально. Прочитай и все вопросы про массивы/ссылки/строки отпадут начисто.
Надеюсь здесь сидят шарящие анончики. Вопрос тупой, и мне заранее стыдно, но не у кого спросить. Смотрю на сорс моей любимой игрули детства: https://github.com/videogamepreservation/descent ГДЕ ТОЧКА ВХОДА? Типа main.c или что-то такое?
>>1916151 >MiniLibX Всегда удивляло, откуда берут такое васянское говнище (поддерживает даже BSD! ебать) без нормальной документации, сделанное на коленке даунами, которое даже скомпилироваться не может нормально?
>>1916662 > Вот это говнокод, пиздец Вся суть. Раньше писали крутые игры, а теперь пишут красивый код и дрочат на историю комитов, на тесты, на линтеры... что угодно, только бы не заниматься делом.
>>1918249 Раньше каритнку и архив склеивали просто вместе. Но сейчас хитрый Абу что то там нашатал и теперь его макаба вырезает все архивы у раржипегов. Сейчас надо разобраться в структуре формата джипег или пнг, покурить документацию, и встраивать архивы в подходящие для этого места внутри файла. Я так сделол.
Аноны, пиздец тупой реквест, но тем не менее. Хочу Borland C/С++ IDE настроить на win10. Какие варианты? Вроде нагуглил сборку от Раджеша Шрияпутры, но хуй я позволю этому говну ступить на мой пека.
А тут кроме юмористов, кто-то ещё остался? >>1918968 Ветхий Завет и Кернигана&Ритчи. >>1918966 Всё что декларировано за пределами функций. >>1918973 Где объявишь, там и разместит.
>>1918898 Возвращать нельзя только массивы, являющиеся автоматическими переменными. Т.е., которые лежат в стеке, и которые нельзя возвратить по значению из-за того, что в выражениях (в том числе и в return) массив деградирует до указателя. Например, если обернуть в структуру, то уже можно.
>>1919194 > кто-то ещё остался Мне кажется, что тред себя исчерпал или вся борда?. Но кое-кто остался, и они иногда еще отвечают.
>>1916309 Деды вообще документаций не писали и ничего не оставляли кроме пары комментариев. Хочешь пользоваться? Сам правь исходники и исправляй ошибки. Иначе как все развиваться будет то, если до тебя все было написано, тут значит идеальная ситуация.
Кто нибудь обьясните что делать с глобальными переменными. Есть одна глобальная переменная в .h файле. Писал прогу на маке и все было бы прекрасно, но дома у меня линукс и при попытки линковки одного и того-же кода, который работал на маке, выдает ошибку о множественных включениях этой переменной. Перепробовал различные варианты external, но все еще не линкуется. Кто нибудь поясните по полочкам что да как тут, в .c или .h файле писать и прочее... Нет, избавиться от глобалки не могу, используется везде, я умру бегать по куче файлов\функций передавая одну переменную
>>1922953 Полгода назад зарелизился новый GCC, в котором отпилили поддержку глобальных переменных в хедере. Оно как бы работало, но так нельзя было делать. Теперь вообще нельзя. Вероятно на маке еще не дошли до этого. Делай как говорит этот анон >>1922948
>>1922923 Прагма тут вообще не при чем: что с ней, что с ifdef'ами у него глобалка объявляется в каждом .c-файле, включающем хедер. Тут скорее интереснее, каким образом на маке "всио собиралось".
Почему у меня каждый раз полукаются макароны из функций? Где почитать как более менее нормально программировать? Каждый раз настроение от этой хуйни падает.
>>1922829 Ну сравнить одно число с другим и определить какое больше это две разные операции, мне кажется четкое сравнение быстрее будет, чем побитовое решение где больше, а где меньше, хотя хз
>>1923243 > Почему у меня каждый раз полукаются макароны из функций? Большие функции или много маленьких? > Где почитать как более менее нормально программировать? Ядро bsd, linux.
>>1923490 Когда хочу добавить новый функционал, то не могу просто написать все в новую функцию, приходится редактировать старые функции тоже. Получается все размазанно по всей программе и добавлять новый код все сложней и запутанней.
>>1923522 Это все придет с опытом, без этого никак. А вообще, читай "Чистый код", "совершенный код" и тому подобное. Принцип SOLID. Язык Си конечно низкоуровневый и не очень выразительный, поэтому провоцирует слишком закапываться в детали реализации - в других языках там бы просто гонялись объекты взад вперед, а каждая функция занималась только своей маленькой задачей.
>>1923243 Рассматривай каждую функцию как один маленький модуль. С нулевой зависимостью от макросов, глобальных переменных. Здесь лучше расширять интерфейс, нежели увеличивать зависимость от ебеней. На нижнем уровне пишешь из таких вот функций, на верхнем - из больших процедур.
>>1904954 (OP) Особо не надеюсь, но может кто то подскажет название. Читал в сосничестве около десятка лет назад книжку. Там всякие советы по написанию кода были. Половина книжки была про Си вторая про плюсы.
Аноны, учу С# используя visual studio 2019. Проблема в том, что использую 2 разных компьютера в разных местах. Если возможность запихнуть проекты в подобие облака? Ебался с гитхабом, но толку мало, проект туда с одного компа запихнул, а как его вытащить на другом компе не понял.
git init projectname (инициализировать Гит, если это новый проект, а не скопирован с ГитХаба) git remote add origin https://github.com/username/projectname.git (связать инет адрес с origin) git add . (поместить файлы в папке под слежку git) git commit -m "Добавил фичу №34" (зацементировать изменения) git push origin master (отправить на ГитХаб в определенный ранее origin) (потом вроде как можно просто git push -u)
Поставь себе терминал нормальный на Винде и гит тоже, ты как я понял через сайт все делал, там это сделано для экстренных случаев, так делать не стоит. И так в этой сфере даже минимально развиться не сможешь. Я чутка набросал команды основные, сам давно не пользовался.
>>1926542 Самый тупой способ - бахнуть 2 статические инлайн функции для инкремента и декремента в заголовочнике, внутри функций детектить компилятор через условную компиляцию и сделать вызов нужных builtin функций для атомарных операций из нужного компилятора. Подключаешь заголовочник - есть переносимые атомики для size_t. Как-то так.
>>1904954 (OP) Есть один uint32. Как узнать, сколько всего битов в нем равны единице? Короче говоря, нужна функция, которая бы брала аргументом uint32 и выдавала число битков в нем. Пока что на ум приходит только простым перебором, типо 32 раза сдвигать число, проверять первый бит и если единица инкрементировать счетчик, но может есть более быстрые и рациональные способы?
>>1926552 >статические инлайн функции Помню как то прогал давно на с89 и нужна была инлайн функция для быстродействия, но компилятор её не поддерживал. Единственным способом задать инлайн функции (в том числе и с аргументами) получилось только через макрос.
Братушки поясните особенности в динамическом и статическом массиве на пальцах. Типо одно используют для того второе для другого потому что так и так. Я заебался смотреть 20 минутные видосы и хуй поймёшь. Я так и не понимаю почему иногда массив чаров я могу отправлять в функцию, а иногда выходит ошибка. Или что почитать. Или только в процессе драк с компилятором можно привыкнуть к синтаксису?
>>1927381 Бывает нужно если число используется как битовая маска
Например у тебя есть массив объектов, и массив uint32 который используется как маска какие объекты активны, какие нет. И тебе нужно посчитать сколько объектов активны.
>>1927487 И то, и то кусок памяти. Один определен в секции в исполняемом файле, а какой-то выделяется в рантайме. Разница только в выделении и освобождении(если требуется) этой памятьи. Вполне возможно ты где-то с синтаксисом ошибся.
>>1927737 Будто я знаю зачем тебе это. Поставь себе задачу и думай как ее решить лучше.
Нихера не статик. Ты выделил на стеке. Массив внутри с массивами. Судя по всему передаешь в функцию которая ожидает чисто указатель. Что это за ерунда? Тебе б синтаксис учить и вникать почему все так. Язык Си тупее чем ты думаешь. И думать за тебя он не будет.
>>1927607 Это понятно, но это обычно на ходу считается же - принимаешь каждый бит и сдвигаешь, потом в конце смотришь сошлось или нет - popcount тут не нужен.
>>1927179 Переведи его в двоичную систему исчисления через рекурсию, либо через циклы, сложи результаты в массив, как я помню с помощью рекурсии у тебя все как надо сложится, а в цикле сам смотри как. Ну и посчитвй единицы в числе. Как пример.
>>1927179 >более быстрые Если память - не проблема (не жёсткий эмбеддед), то самое быстрое будет таблица на 64к с заранее расчитываемыми при старте программы (ну или например при компиляции если кресты, или захардкодить) значениями числа битов для всех двухбайтовых чисел. Тупо берешь пару чисел по индексу верхних и нижних двух байт твоего числа и складываешь.
>>1928180 >я хочу двумерный массив забить ноликами Не понял твоего кода вообще, но вот решение.
https://pastebin.com/UQk0xYtR - вот версия, где указатели скрыты синтаксическим сахаром в виде доступа к элементам через индексы массива, по сути там только указатель передается в функцию, и мы просто скрываем указательную арифметику.
https://pastebin.com/AAPzDuXt - вот версия с чистыми указателями, в ассемблерном выхлопе и то и другое идентично будет.
Это VLA (Variable Length Array), если хочешь попроще то просто замени ptr[][side] на ptr[][4], но потеряется гибкость и тебе все равно придется передавать side как формальный аргумент, так что смысла в этом мало.
Наверняка платина, но вдруг у кого есть решение. Коротко говоря хочу такой макрос #define inv(var, method, args...) typename(var)##__##method (args), ну чтоб оно работало. То есть например чтоб такой код: Vec v = (...) Data data = inv (v, get, 1) превращался в Data data = Vec__get(v, 1) Поковырялся с _Generic, но там вообще странное мутное говнище получается. Спасибо.
>>1932681 Имя типа по объекту, насколько я понимаю, можно только в С++ получить. Хотя возможно gcc предоставляет какой-то спрятанный builtin_type_name для C. Но в документации пусто об этом. Остальное вроде не проблема, по типу VA_ARGS с двумя подчеркиваниями в начале и в конце, указатель на объект кидать первым аргументом во все функции, ну и функции накидать с нужными именами.
>>1933212 >VS community Visual Studio Code в смысле? Я просто перекатываюсь с пайтона на С/С++ для числовых вычислений, не особо разбираюсь в обстановке. Научных дистрибутивов типа Анаконды, я так понимаю, для С нету.
>>1933243 Нет, VS community это Visual Studio версии Community (а не платный энтерпрайз и прочее) Visual Studio Code это вообще блокнот с продвинутой подсветкой и плагинами, то есть другое.
>>1933296 Ок, спасибо. Как я понимаю, я устанавливаю VS community, открываю книгу Праты и начинаю знакомство с основами, а после этого можно будет перейти и к другим специфическим вещам типа пикрила, да?
>>1933675 >Code-Block иде О, спасибо, а то я начал устанавливать VS community, выбрал Clang-компилятор, а там сразу до десятка Гб на жестком диске затребовало, которых у меня нет.
>>1933706 У меня на диске С места нету (дома компьютер старый, всего 30 Гб на диске С, свободно 2), а VS community туда почему-то лезет, даже если я все устанавливаю на диск D.
Допустим я хочу подучить ассемблер и попиздиться с gcc. Если я реализую одну и ту же функцию на сишке, а потом на ассемблере, то как проверить какая из них быстрее? С флагом -O3 вызовы функции в main либо просто оптимизируются, либо результат вычисляется предваритально. Да и если в цикл эти функции обернуть, то там наверное какое-нибудь кэширование будет на низком уровне, неестественно ускоряющее работу функций, но я в этом не разбираюсь.
>>1933706 Удалил игры и порнуху кстати, уже 2 недели не играю просто сижу пишу код и бегаю. Не могу отпустить Си сука такой интересный язык, а деньги зарабатывать надо и деньги кончаются что делать сука стать бомжом с макбуком? Я весь год сидел занимался Сишечкой, вон в игры вкатываюсь но как оказалось знание физики и математики нужно чтобы получалось годно, а еще алгоритмы и структуры данных. Но я 9 классник, планирую поступать в какую нибудь шарагу при техническом вузе или заканчивать 10 и 11. Благо к деградаций интерес исчез и всё что я делаю это код и учеба
>>1933972 А да, че высрался то, ребят я хотел заработать деньги на вебе, я долбоеб же да? Или у меня есть перспективы всё таки зарабатывать без корочки на Сишечке и плюсах на учёбу и покушать?
>>1934135 Извини, диск? Или ты имеешь ввиду освоить как следует Си выше уровня вкатывальщика (На данный момент я разбираю ресурсы на awesome c, и параллельно вот уже заканчиваю Прату) и вкатываться в веб?
>>1934138 Я имею в виду что для веба тебе тоже придется купить новый диск, потому что там очень раздутые инструменты по десятку гигов. Голый хтмл в блокноте там не котируется, тебе придется пачками выкачивать либы зависимостей.
>>1934290 А всё понял. Спасибо за совет дружище. Если интересно. Я все таки продолжу глобальное изучение C, пока не изучу всё что связано. И попробую работу найти, а там если получится то в плюсы.
бля, поцонва короче вопрос к вам всем (если увидете это сообщение в Си треде - не обессудьте, похожий вопрос просто) короче я вот школотрон 23 лет, в этом году заканчиваю шарагу в ООО РогаИКопыта я занимался топовыми задачами, связанными с железом (ну всм не один тянул проект, а в команде в роли ждуна) типа датчиков в металургии, контроллеров приводов и прч штуках занимался этим два года но есть трабл - в этой конторе даже у руководителей зп 45-50, у меня ее вообще нет - чалюсь там только из-за кайфа работы с реальным железом и я вот хочу сменить профессию но смотрю на хабр карьеру/ххру - пиздец из ОЙТИ одни жанги\спинг\датасосист А в си одни НИИУУПГУИПМС, где с зп, думаю, также че, все вообще плохо? я зря учился роботов программировать 6 лет бля?
А подскажите где можно почитать про использование компилятора? пока варианты такие man gcc, глава в прате programming mechanics. В КиР вроде нет про это. Мне немного надо, прост ликбез для курса в шараге.
Экспериментирую с функцией fopen с параметром r+b, в неё сохраняю строку с fwrite, буфер с 1024 битами. Как вообще двигаться по записям внутри файла если используешь бинарный режим? С помощью этого самого буфера? Мол, нужна запись, берешь её индекс и двигаешь указатель файла с константой буфера? Или как? А удалять как, интересно? Размер буфера должен быть неизменяем, т.е при любых обстоятельствах быть 1024?
пацаны, расскажите какие зарплаты в эмбедеде? думаю вкатиться туда, пару лет набраться опыта и съебать в омурику, где этим занимается не только концерн залупки проживу пару лет с этой зп? Есть в районе 100? 150?
>>1936090 Ты ёбнулся что ли? Какие 100-150? На питоне / джаваскрипте еще реально такие суммы поднимать. Сишники сосут бибу. 80-90 потолок.За пару лет ты такого опыта не наберешься.
>>1936322 >>1936090 так я в дс как раз, звучит как зп питоняки или крестовика жаба конечно ебет но даже 150 это хорошо (лично для меня) главное, чтобы рост был (и знаний и зп) поэтому я бы еще раз свой вопрос задал именно ДСникам че по зп, столичники?
>>1936637 Сука я понимаю что здесь всё мертво уже давным давно потому что с долбоебами общаться никто не хочет, но сука свои мозги то можно использовать иногда?
>>1936323 Это ты вот этому >>1936322 и этому >>1936318 скажи. На хх он смотрел, лол. Я ДСник говорю, что Сишники потихоньку вытесняются скриптодебилами. Ржавчина и змея, увы отъедают нишу. Эмбеддед навроде ардуины/стм32 только на западе хорошо оплачивается, но туда абы кого с курсами на юдему за плечами не возьмут.
>>1937178 тут другой вопрос, скорее, в том, что не очень то и премиальные компашки реально концер залупки и прочее но иногда платят, причем иногда даже неплохо хз насколько такой опыт будет катироваться за бугром
> Ржавчина и змея, увы отъедают нишу нишу чего они отъедают? ты ведь не будет стмки (лпцшки прочий сброд) программировать на питоне? ну камон
Имхо, наоборот вся эта залупа только развивается ИоТ набирает обороты, робототехника набирает обороты появились направления у Шмяндекса, сбера Всегда ей касперский, нвидиа, хуевей короче хуйню сказал, все норм и сишников мне, кстати, интересно, у байтоебов яндекс тоже спрашивает АЛГОРИТМЫ сортировки и прочее говно?
>>1937627 >ИоТ набирает обороты, робототехника набирает обороты Я про ИоТ слышу уже лет 7, а про робототехнику так вообще всю жизнь. Но на самом деле нет никакой робототехники, нет ИоТ. В РФ уж точно нет, максимум на западе стартапы есть и крупные концерны, где нужны промышленные роботы.
>>1937178 >Ржавчина и змея А как же реалтаймовость? Если на расте еще можно как-то извернуться (и то большой вопрос как его к RTOS прикручивать), то питон сразу мимо. И да, реалтайм это в первую очередь не про скорость, а ее предсказуемость.
Сап байтач. Есть один X220. Хочу наколхозить в него кастомный многоцветный светодиод. Например - чтобы краснел, если пинги растут или пакеты пропадают (WiFi в жопе мира, взять ложку вместо ножа не предлагать, мне интересна сама задача).
Правильно я понимаю, что мне нужно брать какой-то микроконтроллер, совмещённый с USB интерфейсом, что-то типа ATmega88, подключать его ко внутренним USB и писать драйвер? Есть варианты проще или наоборот - совершенней и гибче? Как получить входные команды, кроме USB? Как бы ты это сделал? Надеюсь, не промахнулся разделом/тредом.
>>1937627 Верно. >>1937632 Вот это ваще двачую, общался с Поляком сишником, его с зубами оторвали нахуй с учебы в самсунг работать, потом его выбил кто-то в гугл, Питон не знал на момент когда общались, лол.
Хотел вам вопросов задать, кто нибудь делает взносы (комиты) на гите какому нибудь проекту? Нормально ли нововышедшему Сишнику таким заниматься, или другие варианты есть? Как новичку развиваться лучше? Писать свои проги и выкладывать на всеобщее обозрение? Олимпиады? Или же проектик какой нибудь сделать, типа часов или другой полезной утвари? Идти в контору напрашиваться или завод?
>>1938571 бля, школотрон, ты чего так на работу попасть хочешь? Конечно, обучение на работе имеет место быть, но не это обучение из рарзяда "вот структуры в си делаются ТАК, а перифирия работает ТАК" - это все уник + свои доп занятия. К моменту выхода на работу ты максимум должен быть не очень знаком со стеком (специфичный проц, мб какая-нибудь задроченная архитектура системы) лучше поступить на соотвествующую кафедру и там хреначить курсовые нормально, а не "чтобы сдать" при условии, что ты найдешь годного научника, проекты могут быть и правда серьезными Кстати советую не проебывать микропроцессорную технику если же по каким-либо причинам тебе прям нужно пойти на работу (ну вдруг родители не могут содержать, это норм), то, конечно, пет проекты топ. Но если тебя твои смогут до 3 курса содержать, то лучше наберись знаний на курсачах + петика а с 3 курса уже дерзай
>>1938268 Если под прыщами, то через псевдофс /proc. Можно напрямую общаться. Скрипт на питоне с гуи можно запиздячить. Си + gui либы tk/gtk так же легко пишуться.
>>1938936 А что именно "да"? я просто спрашивал, как ее имплементировать. а то для меня подобные трики, словно поиск нарика по шприцу, оставленному в заброшенном толчке пару недель назад.
>>1938268 взял бы платку arduino (писать под нее можно и на с) с usb. настроил бы на ней uart написал бы консольную прогу которая через com порт будет общаться с этой ардуиной и приговнякал бы к ардуинке этот разноцветный светодиод
>>1939070 >хакнуть встроенный диод? Да, например. Решение красивое и аккуратное, если с исполнением не налажать. По аппаратной/програмной части идей нет? Cтавлю внутрь PIC, cажаю на USB и командую им через псевдофс.
>>1939002 Пожалуйста. Изучай линукс. Для embedded, разных IoT, модулей навроде стм/ардуино — это просто кайф. Сперма/макакоось таких возможностей не имеет. И разработка простая будет, поддержка, сообщество огромное. Весьма рекомендую. Только предварительно почитай про внутреннее устройство линукса.
с чего начать изучение СЕЙ чтобы вкатиться в nasa jpl ? есть ли ихние РЕЦЕПТЫ и СТИЛИ программирования? где почитать какие ЗАДАЧИ в nasa jpl надо кодить на СЯХ?
Я придумал себе такую задачку и внезапно всплыл один вопрос:
А наращивается с 0 до 10 при некотором условии. Б начинает расти при условии, что А >= 5, и рост Б заканчивается при Б = А.
Что быстрее? Внутри цикла А наращивать Б, каждый раз проверяя условие, что А >= 5, или вынести наращивание Б в отдельный цикл за цикл для А и перед наращиванием Б проверить один раз, что А >= Б, но каждый раз проверять, равны ли А и Б? Я предусматриваю возможность, что по достижению цикла с Б, А может быть равно чему угодно от 0 до 10.
>>1938155 >В РФ уж точно нет по сути промышленная роботехника это синоним автоматизированных конвеерных линий на производстве но при этом в россии нет собственного станкостроения сегодня вообще в 89 году делали 120 тысяч станков, сегодня - меньше тысячи соответственно, никакой речи о автоматизированном промышленном производстве не может идти, когда у нас нет производства обычного оборудования, лол
Аноны, помогите. Пытаюсь понять, как работает обмен данными по анонимному каналу, нихуя не понимаю. Дайте мне примеры родительского и дочернего процессов, с обменном значением переменной или строки между ними, я наверняка пойму что-то, прочитав пример с минимумом кода.
>>1944685 > Почитал про error handling и появилось несколько вопросов. > 1. assert() поднимает SIGABT? Если да, то можно использовать > >signal(SIGABT, uninit); > чтобы в самом uninit() засейвить данные и деаллоцировать память? Зачем деаллоцировать память при выходе из программы? По-моему есть смысл только файловые дескрипторы закрыть.
> 2. у errno только три значения? некостыльно пилить свое errno в пределах программы и маскировать его каждой функцией в случае ошибки? Около 140 значений у errno, если верить заголовочнику.
> 3. setjmp() сохраняет регистры в буффер и соответствующий адрес? > как это можно использовать для управления ошибками. longjmp вернёт выполнение в место где была вызвана функция setjmp. Хуевая идея это использовать для управления ошибками.
Привет, аноны, я питонист, возникла необходимость запустить для теста функцию, но в си вообще не понимаю и честно говоря уже заебался за сегодня, 4-й язык который приходится осознавать за сегодня после жс, джавы, с++, вот код https://github.com/fengjixuchui/Tiktok/blob/master/douyin.c В самом конце есть 2 функции XlogDecrypt и XlogEncrypt, скажите что написать в этом коде, чтобы передать в функции строку(либо хекс, я не уверен) и мне выдало ответ, прошу хелп
>>1945399 Понял что могу онлайн компилировать и нужно видимо просто мейн функцию прописать, главный вопрос для меня uchar __stdcall XlogDecrypt(uchar data, int *psize) звездочка как я понимаю это указатель, как мне правильно вызвать функцию? Что в нее передавать, даже не до конца понимаю что такое uchar, указатель на символ определенно размерности? Т.е в эту функцию передаются символы, он с ними работает и возвращает тоже символы? Верно? А передавать в функцию мне нужно указатели на каждый символ, так?
>>1946405 Я вообще мимодурачек, случайно подписался на взлом тиктока блять, уже в горле эта хуйня сидит и разбираться в си нет сил, поэтому тут спрашиваю
>>1947074 Ооо, по Прате что ли модифицированное задание решаешь. А зачем тебе вообще if else, если с конкретным значением сравниваешь, тут switch нужен.
>>1946659 да там делов-то, всего ничего, осталось только понять как сраный код на си запускать, там типы данных, которые видимо даже не инклюдяться никак и никак не обосзначаются типа алиасом, uchar, вот что за хуйня как и LOCAL
Аноны, я сейчас серьёзно, помогите мне разобраться, как записать что-нибудь в безымянный канал в родительском процессе, чтобы отправить это в дочерний по перенаправленному вводу.
В родительском процессе на 78 строке пытаюсь заменить строку на свою, статичную. Делаю это с целью разобраться, как вводить данные в канал внутри родительского процесса. Моё изменение никак не влияет на вывод. fputs что там делает с каналом? Как же записать туда свои данные?
Таким образом, чтобы его можно было бы применять к разным сурсам (и соотвественно получать разные выходные файлы и логфайлы тоже). Т.е. сделать нечто вроде
>>1940258 >вкатиться в nasa jpl Поступаешь в МВТУ им. Дауна на ракетную инженерию (возможно еще робототехника будет норм), ходишь в МКЦ, крутишься кабанчиком, вкатываешься в науку, идешь в магистратуру сколтеха, в аспирантуру за рубеж, там находишь нужных людей, которые тебя в nasa jpl перевезут. И вот тогда можешь начинать программировать космические корабли и марсоходы. Но скорее всего ты проебешься и окажешься инженером-конструктором на ГКНПЦ им. Хруничева или другом менее понтовом заводе Роскосмоса, где будешь 10 лет работать за зп 50-60к.
Анончики. Решаю задачу на преобразование инт в чар. Подскажите, где же я проебываю первую цифру?
#include<unistd.h>
int main() { int nb = 56667; char c[10]; int i; int a;
i = 0; a = 0; if (nb < 0) { nb = -nb; a = 1; } while (nb > 9) { c[i++] = (nb % 10) + '0'; nb = nb / 10; } c[i++] = nb; if (a == 1) { c = '-'; } while (i >= 0) write(1, &c[i--], 1); }
int main() { int nb = 56667; char c[10]; int i; int a;
i = 0; a = 0; if (nb < 0) { nb = -nb; a = 1; } while (nb > 9) { c[i++] = (nb % 10) + '0'; nb = nb / 10; } c[i++] = nb; if (a == 1) { c = '-'; } while (i >= 0) write(1, &c[i--], 1); }
https://pastebin.com/y70eajE3 ЧЯНТД? Почему newList возвращает указатель на список из одного элемента, а значения полей равны нулю? Не судите строго, только сегодня сел за более-менее серьёзное изучение.
>>1952745 malloc() возвращает другой адрес с полученной памятью. head же указывает на рандомную ебань и так же будет передан вызывающей функции. Как фиксить - думой сам.
>>1954104 За первый вариант спасибки. Я хоть и думал про такие извороты, но не мог предположить, что это называется автоматизация, а не костыли. И теперь у меня два сценария сборки: в первом спавнится заполненный хидер, во втором пустой файл с тем же названием. И все работае, так что еще раз спасибо.
>>1954268 Это называется автоматизация только когда скрипт запускает сборку, получает себе stderr, анализирует его регекспами, находит там несуществующие хедеры, создает их и перезапускает сборку. Я это имел в виду, если что.
Почему по достижении return'а, судя по отладчику программа зависает на последней строке функции, даёт приглашение на ввод, но при этом не возвращается в main?
>>1955002 Так у меня еще лучше, потому что нет перезапуска. а до регулярок я пока недорос. >>1955487 дебагпринты, gdb. Алсо здесь четыре точки выхода, так что непонятно о достижении какого return идет речь.
>>1953446 Мож там просто хипы были рядом друг с другом, короче думаю так всё было:
Короче каждый раз шла аллокация 16 байтов, (2 инта + еще одна такая же структура), 8 байтов занимались, остальные оставались, шла еще такая же аллокация, на том самом месте где был указатель занимались оставшиеся 8 байтов, и так до конца, в итоге в конце остается незанятая ячейка памяти из 8 байтов. Либо куча дыр, но я ставлю на вытекание памяти. Там не используется освобождение, можно стенкой посмотреть.
Как по хардкору вкатиться в неблокирующий и асинхронный I/O? Сам пишу не на си, просто есть очень большое желание понять, как оно там внутри все работает. Нужно в сторону poll/epoll смотреть? Есть какие-нибудь годные гайды или книги?
>>1955823 А с чего начать? Я сам студент, курс по осям будет только осенью, да и вряд ли там сильно глубоко в ядро залезем. Для начала курс на степике может пройти, а потом книжки по ядру ОС почитать?
>>1955736 Инициализация должна проходить успешно: посмотри внимательно тайпдефы и декларации, или скинь их. >>1955767 Ну линкед листы это довольно весело для обучалок. >>1955779 Там всегонавсего каждую итерацию инициализировался новый нод который не привязывался к предыдущему. Да, самые обыкновенные меморилики.
Хочу написать калькулятор с ГУИ или приложуху какую нибудь бесплатную, например пробежки отслеживать. В планах использовать ГТК+. Этого хватит? Дефолтного тутора хватит на сайте гнома? Или книжку взять? А то хочется отвлечься от монотонной зубрежки, вообще пишу всякие задачки на сторонних ресурсах, но там тоже монотонность. Хочется написать что нибудь уже.
>>1955811 >Как по хардкору вкатиться в неблокирующий и асинхронный I/O? Если тебе прям на уровне epoll/C надо... Ну тогда напиши для начала какой-нибудь простенький HTTP-сервер на блокируемых сокетах. Все реквест-хедеры пропусти, отдай клиенту статус, Content-Type и Hello, World! У тебя будет маленький исходный код, с которым уже можно экспериментировать. А то как так, сей в глаза не видел, но хочу сразу в ядро и шедулер. Там до шедулера у многих серьезных кодеров типа конструкторов всяких golang и nodejs проблемы возникали, типа как лучше распространить асинхронность на потоки, чтобы ядра проца не простаивали.
>>1955829 >Инициализация должна проходить успешно: посмотри внимательно тайпдефы и декларации, или скинь их Вероятно основная проблема в том, что в main инзерты вызываются внутри цикла с передачей им в качестве аргумента адрес i-того элемента массива типа Data
>>1955903 а елсе у меня етсь ммап() и брик(), но ищо нет маллок() что тт на эт0 скажеw))) >>1955883 ты гдкт на%уивертел в дефейнах N обьевляшках. сматри туда
>>1955908 >а елсе у меня етсь ммап() и брик(), но ищо нет маллок() что тт на эт0 скажеw))) Блок с длиной -1 в дереве, если не хватает, то растим память. Но тут какая-то хуйня в треде вообще творится. С готовым malloc не можем дерево построить.
>>1955910 Здесь не в маллоке дело, а именно в цикле, т.к если просто переменные передавать, то всё нормально, все указатели на выделенные участки памяти на месте. Инсерт просто на корневом ноде останавливаться .
Итак у меня есть программа, которая генерирует MISRAC код из блок-диаграмм. Есть драйвера и прочие пляски с регистрами написанные мной. Я могу взять и поменять блок диаграммы и перегенерировать код, так что допиливать что-то в автоматическом коде тупо - быстро сотрется.
>>1957647 Ну да, остаётся удалить этот файл. Нахуя сгенерировал? Ну раз есть глобальная функция - должен быть код. Их по идее может убирать умный компоновщик, но я дед и ни разу им не пользовался.