Тред, посвященный прародителю всех С-подобных языков и по совместительству единственному идеальному и всесторонне годному средству программирования как на системном, так и на прикладном уровне.
Чем компилировать: - Очевидный GCC. - clang: оче годно, батя рекомендует. - Intel C++ Compiler: оптимизации, тысячи их. - Visual Studio 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)
Что правильно (или лучше) делать, когда нужно получить несколько значений (в общем случае - разных типов) от функции? Запаковать в структуру на хипе и через указатель возвращать её с последующим высвобождением памяти в вызывающем коде? Звучит по-уебански, но ничего лучше я не придумол
Ну хорошо придумал функции sumTwoFuckingaNumbers сложил два числа блять А как мне написать что-то годное? Например типо снифера или кваки Где этот промежуточный материал брать? Из крс книги вообще ничему не научишься лол
>>2407855 >>2407847 Поэтому вам и говорят, что нужно учить не язык, а программирование и конкретную предметную область. Чем тебе поможет знание языка, если ты не сможешь его применить по причине своего незнания? Для начала ты должен формализовать задачу, построить архитектуру приложения, найти/составить модели, которые будут решать твои проблемы, а только потом садиться за код. Т.е. написание кода в работе программиста - это 5-10% от его общей работы. Для начала все строится на бумаге.
>>2400317 Есть норм челик какой-то, который пояснял на конфе про то, почему он пользует няшную + демонстрирует всякие свои трюки, например, про макросов на memalloc/dealloc, чтобы находить проблемные места с управлением памятью на этапе разработки. Курсы наверное нахуй не нужны раздобудь копию стандарта n1256.pdf и ещё читни на досуге книжку Ритчи и Peter Linden Deep C Secrets.
>>2407847 >Че мне функции из головы что ли придумывать каждый раз? Я в школе программировал 5 лет, написал кучу программ, игр, всяких опытов провел, но так и не понял зачем нужны функции, ни разу функции не использовал, какая-то мутная непонятная хуйня. А потом дошли руки до си и там сплошные эти функции, и вопроса не возникло, всё естественно как воздух. Так что функции лишь плод си-подобного синтаксиса, на самом деле нахуй не нужны для программирования, ведь это математическая концепция, а программирование не математика. Си заставляет лепить эту функцию main() (говно если честно, за такое надо бы по ебалу бить), так что от этого не уйти, но дальше функции не нужны, а если понадобятся, сам узнаешь, ведь понять их в си труда не составляет.
>>2408282 >Си заставляет лепить эту функцию main() (говно если честно, за такое надо бы по ебалу бить) на джаве только не пытайся писать, там тя вообще инсульт хлопнет а вообще жырновато - даже в олимпиадном дрочении у меня без функций жепа скрипела поначалу да, тоже не сразу выучил, что меня выдало?
>>2408556 Джава, шарп и подобное это макакины языки, код абстрактный, плевать, да и они лишь скопированы с си.
А вот с си немного обидно, неплохой, реальный язык, но вот эта тяга автора в говноматематике там где она не нужна, раздражает. Напоминает хаскел, рак примерно схожей природы, насильное пихание математики. И не только форсом main(), но и вообще функций, даже подпрограммы (процедуры) выполнены в виде функций. Это особенно опасно для учебы, когда такое дают людям без представления о программировании, у них складывается впечатление, что программирование это сплошные функции, когда на самом деле наоборот, функции имеют весьма узкое применение, лишь в своей околоматематической области. Отсюда возникают дебильные, очень распространенные вопросы вроде "как вернуть несколько значений". Потому что к голову насрали чужеродной программированию парадигмой. Такое надо давать когда человек уже имеет правильное представление, а не с нуля шизу воспитывать.
>>2408621 Да, правильно, нахуй эти функции нужны,то все для ученых в говне моченых. Мы люди простые, просто копипастим код, когда нужно и пишем портянки.
Продублирую здесь. Пишу свой двухколёсный дебаггер. Вот есть процесс, ему соответствует программа и слинкованные с ней в рантайме библиотеки (libc, ld и прочее); сегменты программы загружены в выделенную процессу память, библиотеки отображены и я всю эту красоту могу наблюдать в /proc/{pid}/maps. Всё, что мне нужно сделать, это найти запись в таблице символов файла программы/библиотеки по адресу вызванной функции. Я парсю инфу о сегментах из /proc/{pid}/maps, смотрю, какой сегмент соответствует адресу функции и для соответствующего имени файла с помощью libelf подгружаю нужные мне заголовки. Дальше это работает так: https://pastebin.com/0rLUpUWF (код сырой; на данном этапе нужно было, чтобы это просто работало) data содержит маппинг файла программы/библиотеки, addr = адрес_функции - адрес_сегмента. Для самого executable код вроде работает, но не для слинкованных с ним либ. Что я упускаю?
>>2408621 > А вот с си немного обидно, неплохой, реальный язык, но вот эта тяга автора в говноматематике там где она не нужна, раздражает. Напоминает хаскел, рак примерно схожей природы, насильное пихание математики. И не только форсом main(), но и вообще функций, даже подпрограммы (процедуры) выполнены в виде функций. Не понял, кто в этом виноват: автор учебника или языка? > Это особенно опасно для учебы, когда такое дают людям без представления о программировании, у них складывается впечатление, что программирование это сплошные функции, когда на самом деле наоборот, функции имеют весьма узкое применение, лишь в своей околоматематической области. Любая подпрограмма - бесплатная функция. Это круто. > Отсюда возникают дебильные, очень распространенные вопросы вроде "как вернуть несколько значений". Это не дебильный вопрос. Это родовая травма языка, где нельзя fun x = (x,x)
>>2409349 >Это не дебильный вопрос. Это родовая травма языка, где нельзя fun x = (x,x) Почему сложно вернуть структуру, она будет один хуй у колера на стеке.
>>2409349 >Не понял, кто в этом виноват: автор учебника или языка? Виноват автор языка (частично) и авторы образовательных программ дающих си как учебный язык. А так же виноваты их жертвы: > функция. Это круто. > fun x = (x,x) вот такие промытые математутки головного мозга. Круто - не значит правильно.
Вообще, языку не проблема быть основанным на любой парадигме, ведь компьютер позволяет делать что угодно, но такие "что угодно" языки абстрактны, а си - язык реальный, в этом его предназначение. Конечно и в си есть абстракции, но они несут вспомогательную роль, а не захватывают язык целиком, си не является виртуальной игрой смоделированной на компьютере, это сам реальный компьютер, средство его управления, т.е. это и есть настоящее программирование с которого нужно обучать настоящих программистов, иначе получаются макаки играющие в виртуальные игры, это совершенно другой класс.
Компьютер универсален, выполняет прогграммы любого назначения включая языки с любой парадигмой, однако это не значит что и сам компьютер универсален. Нет. Компьютер это фиксированный механизм имеющий свою собственную парадигму, поэтому реальный язык и реальное программирование только те, которые основаны на парадигме сходной с компьютером. Важно расстояние (уровень различия) между парадигмой компьютера и парадигмой языка.
Поэтому, по своему предназначению, си - подходящий язык для учебы, однако на практике это не так. Си - не является учебным языком, это утилитарный язык для работы, поэтому автор счел правильным достаточно серьезно исказить его парадигму (завязка на функциях) ради практического удобства применения. Но это искажение вредно для учебы, дает искаженное осознание что такое программирование, скрывает за собой парадигму компьютера, которую обучающийся должен знать в первую очередь, т.к. она является основой - реальна, в отличие от прочих виртуальных.
>>2408282 >Я в школе программировал 5 лет, написал кучу программ, игр, всяких опытов провел, но так и не понял зачем нужны функции, ни разу функции не использовал На GW-Basic что ли программировал?
>>2409661 >В книжке Кнута учебным является MIXASM Значит Кнут был не дураком как сейчас преподы задающие си и подобные языки. Ассемблер действительно то что нужно, почти. Недостаток его излишняя громоздкость и зависимость от железа и ОС, что делает его неприменимым на практике. А виртуальный еще хуже, оторванный от реальности теоретический самодроч, демотивирующий нормального человека. Нужен просто нормальный язык похожий по структуре на ассемблер. А вот когда человек допрет что такое нормальное программирование, потом можно давать эти фигурные блоки и прочую поебень, да хоть ФП давай, уже не критично, главное человек поймет, что это всё лишь рюшечки.
Но это лишь рассуждения базирующиеся на доброй воле. В реальности, рапример, правящие структуры могут быть заинтересованы плодить тупых макак, поэтому специально дают виртуальные языки, чтобы быдло оставалось в неведении о настоящем функционировании компьютера. Ограничение доступа, как говорится. Ну и тому подобное, вариантов много, не суть.
>>2409950 Узнаю тон общения, упрямство, тупость и неумение читать поехавшего борца с абстракциями из предыдущего треда. Ты, хуйня? Может примешь наконец таблетки и перестанешь засорять треды своими "оригинальными" идеями?
>>2409960 Паскаль не о том вообще, он учит восе не программированию, паскаль учит высокоуровневому коду в стиле энтерпрайз, жестко форсит рамки "хорошего стиля". Это чисто прикладной аспект на более позднем этапе этапе обучения. А я говорил о первоначальном обучении именно основам программирования, они должны быть низкоуровневыми (в плане парадигмы), отсюда стиль ассемблера. Это не имеет ничего общего с энтерпрайз-кодом.
>>2410411 >реальности вообще не сущесвтует В 99.99% случаев так и есть, потому что большинство людей - идиоты, а значит живут в манямирке. Для идиотов реальности не существует, их реальность построена их шизой. А настоящую, реальную реальность, видят только мудрые люди, но таких очень-очень мало.
>>2409552 Нуээ, если задача стоит обучить спецов программировать железо, то надо им давать какой-нибудь здравый ассемблер (мипс) и потом полировать это си как удобным макроассемблером. А если надо обучить решать задачи на компьютере, то незачем эти ассемблеры (1% сам придет к этому), пусть мыслят в терминах zip, join, регулярочки.
>>2410966 >если задача стоит обучить спецов программировать железо Нуээ, ты говоришь с позиции дрессировки жикотных на определенное занятие, айти-макакинг. В этом смысле ты говоришь верно - что нужно, тому и надрачивают, просто затачивают специализированный инструмент. И уже не важно чему конкретно учат, подход один.
А я говорю с позиции давания правильного понимания программирования думающим людям с головой на плечах, так что это знание становится основой их дальнейшего развития, без особой привязки к направлению. Короче, те, кому не похуй. Основание - предположение что язык си (данный тред) именно для такого существует, как техническая специальность, а не как офисный макакинг.
Понимаешь, эти два подхода совсем разные. Если с нуля пичкать макакингом, коверкается разум и к нормальному программированию сложно будет прийти.
>>2410990 > А я говорю с позиции давания правильного понимания программирования думающим людям с головой на плечах, так что это знание становится основой их дальнейшего развития, без особой привязки к направлению. А что такое правильное понимание и зачем оно. > Основание - предположение что язык си (данный тред) для такого существует, как техническая специальность, а не как офисный макакинг. Язык не специальность. > Понимаешь, эти два подхода совсем разные. Если с нуля пичкать макакингом, коверкается разум и к нормальному программированию сложно будет прийти. Можно с тем же успехом исковеркать разум битоверчением. > к нормальному Ну вот опять. Умение решать задачи на ЯВУ (не си) оказалось макакингом и ненормальным программированием.
Т.е. сделать структуру с нужными значениями и передавать её по указателю? Хорошая идея, учитывая, что объект в моём случае будет на стэке. Точно лучше кучи и глобальных переменных.
Хелпаните по сокетам. Есть несколько адресов и один порт. На все это дело шлется udp инфа с сервера, и есть клиент который читает данные с этих сокетов каждый в отдельном треде Че я делаю: создаю для каждого треда отдельный сокет, ставлю setsockopt опцию реюза для порта, бинжу адрес INADDR_ANY и моим портом, потом ставлю setsockopt опцию с адресом уже конкретным Собсно я че то не так делаю или в логике какая то проблема? Потому что у меня каждый тред читает все адреса вместо одного конкретного
>>2419537 А по раньше написать не мог? Странная хуйня вообще, я же в следующих строчках подписываюсь на разные мулькаст группы, он не должен ничего читать с any По крайней мере поведение такое, что одиночный сокет не читает инфу с забинженнным адресом any или конкретным и не подписанным на группу, а два подписанных на конкретные группы с забинженным any читают все подряд Довольно противоречиво устроено, не?
Это тред про аниме? Не подскажете, хочу записывать события с устройства ввода, затем немного изменяя их отправлять окну программы, ах да, система X11. Смогу я это всё сделать средствами xlib? Или лучше записывать через usbmonitor и делоть драйвер, эмулирующий устройство ввода?
>>2423054 Бля, не пойму что не так. Или ты думаешь, что const к типу относится, лол? В данном примере const - это переменная, скорее всего, целочисленного типа. В Си констранты только через #define определяются. Замени const на любое другое название в своем примере и ничего не изменится.
Господа, проблема следующая: в коде под линух меня заебало под каждым вызовом linux api функции (read, write, send, recv, select и тп) вставлять проверку на errno == EINTR (прила юзает setitimer(), поэтому эти EINTR реально происходят) Мне бы хотелось написать универсальную враппер-функцию, которая в качестве аргумента будет получать адрес адрес linux api функции, вызывать её с переданными параметрами (разное количество), проверять результат на -1 и если errno == EINTR то вызывать заново. Трабла в том, что я не понимаю как неизвестное количество аргументов во враппере прокинуть в вызываемую api функцию Это вообще реально сделать не используя макросы ?
>>2423121 Пиздец, никогда такой ебалой не пользовался. Век живи, век учись. У тебя указатель на массив carray получается константным, а вот carray[] уже изменять можно.
>>2423103 Я бы несколько inline функций сделол вида eintr_wrapper_n, где n - число параметров, или подобные макросы если <C99, и не ебал бы мозг с типо красивым решением. Просто и понятно.
>>2423167 Забыл добавить, что этот враппер в случае выпадения из api по EINTR вызывает функцию, которая чекает флаги, устанавливаемые обработчиками сигналов и выполняет определенные действия, поэтому сигналы с SA_RESTART не катят. Мне нужно ловить эти моменты с EINTR и вызывать ProcessSignals() >Автор виснущего говна Причем тут "виснущего говна", хочешь сказать что вызов API может начать бесконечно нонстопом выкидывать EINTR ? Схуяли? >>2423405 Мм, ну тогда уже проще один макрос с ##__VA_ARGS__ сделать
Анон, скажи, как в Си корректно без Undefined Behaviour прочитать данные по адресу 0? Приведение нуля к указателю: int p = (int )0x0; приводит к тому, что такой указатель становится нулевым. По стандарту разыменование нулевого указателя вызовет Undefined Behaviour. Я правильно понимаю, что средствами языка Си без Undefined Behaviour невозможно прочитать данные адресу 0x0000? Если что, то по адресу 0x0000 находится таблица векторов прерываний.
>>2424238 По стандарту NULL не обязан физически состоять из одних нулевых бит, а что должно находиться по адресу 0 зависит от процессора и его режима работы. А так можешь поиграться с mmap_min_addr
>>2424244 >По стандарту NULL не обязан физически состоять из одних нулевых бит По стандарту присваивание указателю нуля делает его нулевым указателем. А нулевой указатель не может быть разыменован без ЮБ. Следовательно, невозможно написать корректную программу на Си для чтения данных по адресу 0.
>>2425122 Не важно чем там является NULL. Присваивание нуля значению указателя на выходе даёт нулевой указатель. У нас никак не может получиться нулевой адрес, потому что присваивание нуля на выходе всегда превращает указатель в нулевой. >>2425130 Код одинаковый, но проблема есть: разыменовании нулевого указателя — это UB.
Как правильно аллоцировать память для многомерного массива? Я конечно понимаю, что всё в общем случае есть смежный/разреженный одномерный массив, и потому можно взять n1 x n2 x .. x nk памяти. Но ведь нужно ещё куда-то указатели нижних порядков записывать.
>>2429602 >Как правильно аллоцировать память для многомерного массива? Для маленьких кусков памяти malloc(a b ... * z). Для больших кусков памяти malloc(a) for (i < a) malloc(b) for (j < b) ...
Проблема: если в gdb просто вывести (int∗∗)A, то получим некоторый указатель. Если разыменовать как A[0], то получим тот же (!!) указатель. А если ещё раз разыменовать A[0][0], то как и должно быть получим нулевой элемент матрицы. Я нихуя не понял эти чудеса, лол.
Если уже в самой функции разыменовать A как (int∗)(A[0]), то получим невалидный указатель, скастованный из элементов первого ряда матрица
>>2430361 Непонятно то, что A в мэйне указывает сам на себя. Т.е. A указывает и на начало всего массива из девяти элементов, и сам на себя. Приэтом A[1], A[2] это указатели на два других ряда. Я наверное совсем не понял, как работают декларации многомерных массивов.
>>2430387 Да, наверное, всё так и есть. A[][n] это не тоже самое, что и ∗∗A. В первом случае, как я и понял, это начало смежного одномерного массива, который компилятор рассматривает как n равноразмерных массивов; а во втором случае - указатель на массив указателей, которые в свою очередь указывают на одномерные массивы и необязательно смежные. В чём я не прав?
>>2430361 Это одна из особенностей языка Си, что "матрицу", размещенную в стеке, надо в заголовке функции прописывать как A[][M], то есть количество столбцов должно быть константой, а вот на количество строк может быть любым, лишь бы памяти хватило. А вот если бы ты память аллоцировал для указателя int A, то подобное бы сработало, почему так, если честно не знаю, интересно бы было послушать экспертов
>>2430387 >Т.е. A указывает и на начало всего массива из девяти элементов Из трёх. У тебя массив из трёх массивов. Т.е. реально у тебя в памяти 4 массива, три с интами, и один с указателями на эти три.
>>2430509 >надо в заголовке функции прописывать как A[][M], то есть количество столбцов должно быть константой,
Это же проблема или нет? Ведь тогда сигнатуру функции, работающий с матрицами нельзя сделать под параметризируемый размер.
>>2430547 >и на начало всего массива из девяти элементов
Я имею ввиду, что int A[][3] указывает на начало непрерывного массива из девяти целочисленных элеметов, а не указателей.
>Т.е. реально у тебя в памяти 4 массива, три с интами, и один с указателями на эти три.
Ну если верить отладчику, то нет. Только указатель и девять элементов int. А вот для int ∗∗, будет всё именно так, как ты описал. Но декларировать матрицы таким образом не получится. Придётся брать память и хранить где-то размеры матрицы. Вообщем как я понял A[][] это больше для компилятора, в рантайме никакого массива с указателями не ряды не будет. Зато такой способ должен экономить память, поскольку есть только один массив и указатель на него, внезависимости от многомерности.
>>2430562 > Это же проблема или нет? Ведь тогда сигнатуру функции, работающий с матрицами нельзя сделать под параметризируемый размер
Но можно же передавать одномерный массив типа A и две переменные, n и m, а потом умножением соответствующих индексов получать место, которое занял бы элемент в двумерном массиве...
>>2430709 > а потом умножением соответствующих индексов получать место, которое занял бы элемент в двумерном массиве. A[1][2] и A[2][1] будут на одну и ту же ячейку памяти указывать...
>>2432014 > #define NULL 0 Вот именно И этот сишник с чего‐то вдруг решил, что есть разница между: int p = NULL int p = 0 И говорит, что второе — это нулевой адрес. В этих двух случаях на выходе возникает нулевой указатель. На си мы в принципе не можем получить нулевой адрес.
>>2432014 >>2432358 В стандарте есть строки, которые говорят о том, что NULL всегда является 0? Там есть строки, которые говорят о том, что чтение/запись именно по адресу 0 неопределено?
Копаюсь в реализациях протоколов TCP/IP, и тут есть такой код, как на пике. Зачем так написано, я нюфак и у меня глаза ломаются от такой записи? Мб я вообще не так понимаю эту запись?
Посоветуйте библиотеку для реалтаймового отслеживания звуковых паттернов в создаваемом 3д парти программой аудиопотоке. Проще говоря, хочу отслеживать аудиопоток на предмет определенных частотно-амплитудных характеристик (например превышение порога 70дб на частоте 10345Гц и 8212Гц одновременно), чтобы автоматически выявлять звук сирены, и использовать затем в качестве триггера Понятно что это всё делается на фурье, но мб уже есть что-то годное и готовое
Нужно дать префикс подключаемым библиотекам, в путях - #define MY"../path/to/" #define MYINCLUDEMY"file.c" #include MYINCLUDE Компилятор ругается - 1. warning: extra tokens at end of #include directive 2. fatal error: ../path/to/: No such file or directory
>>2445378 >На мейлаче кто-то вообще работает на сишке не за мамкины борщи и не у с дедами в нии за рыбную котлету? У программиста си зарплата как у продавца одежды
>>2409950 >>2409950 >Нужен просто нормальный язык похожий по структуре на ассемблер Уже есть smalltalk, но он наебнулся от виртуальности и контора его запилившая пошла по миру. Хотя спустя 50 лет до сих пор не могут допилить программинг до ТОГО уровня. Жаль что он пиздец медленный. А так да, C++/С это то ещё донное говно, но выбора нет, жрать приходится в три горла.
За ФП вообще убивать надо. Я бы анально запретил ФП программирование вне прототайпинга. Но это лишь рассуждения.
>>2450425 А у меня пустая страница, когда тыкаю на СИ в списке. При этом остальные страницы работают правильно. Скрин пустой страницы не стал делать. Ну просто без таких табличек, и всё.
Прочитал на вики про обратные вызовы (callback) и ничего толком не понял. Понял только, что у функций есть свой адрес. А зачем это нужно и как это работает? Где можно подробнее про это прочитать?
Анон я заебался. Может у меня gcc багованный? Как state может быть не 0 или 1? Что его заставляет становиться 2 и даже 3? https://pastebin.com/tu4Rmh5v
>>2455371 Я думал это формальность, объявлять количество элементов в array. Думал, при вызове элемента он автоматически создается и все. Но походу это баг и вызывало. При обращении к w[1] например происходит обращение к state вместо этого.
Это баг их обучающей программы? И много таких багов впереди? Может поискать какое-нибудь новейшее издание и там не будет такого? У меня голова трясется от этого.
Или таки есть решение? При условии, что можно использовать только те инструменты с которыми K&R нас успел познакомить до этого упражнения.
>>2457896 >что можно использовать только те инструменты с которыми K&R нас успел познакомить до этого упражнения. Ну так скачай совместимый с С компилятор С. В юниксе такой есть из коробки.
Сап программач. Есть годный материал по односвязным / двусвязным спискам, словарям и хэш таблицам, с особенностями их реализаций на си и различных методов сортировки. По статьям, найденным в гугле, как-то отрывочно и тяжко даётся.
>>2458984 >Есть годный материал по односвязным / двусвязным спискам, словарям и хэш таблицам, с особенностями их реализаций на си и различных методов сортировки? знак вопроса забыл
>>2458984 >Есть годный материал по односвязным / двусвязным спискам sys/queue.h >хэш hcreate.c ohash.c (Курить Кнута, чтобы понять, что там не так) >различных методов сортировки wikipedia
>>2482621 >АСМ тред мертв >Си тред мертв >Тред про крестам мертв >Рряяя тупые растаманы Пиздец ты дегенерат, а перекатывать и писать в треды тоже растаманы запрещают?
Анончики, а насколько сложно для ардуино или малинки пописать что-нибудь? Ну там лампочкой помигать, температуру с датчика считать и всё в таком духе? Поучил чисто для общего развития сишечку по книжкам, потрогал её в идешке, хочется проектик написать но идеи только из эмбеддед сферы есть ну не круды же писать в самом деле
>>2485886 Базового уровня сишки хватит. С ардуинками и контроллерами нужно больше знаний о конкретном устройстве или хотя бы ориентироваться в документации и понимать где что найти.
Ку. Нашёл себе интересную задачу. Сразу вопрос: это можно сделать на С?
Мне нужно реализовать обратную рекурсию. Это означает, например: У меня есть функция f, в этой функцие есть функция g, а в функции g визывается f. Все это нужно для перебора дерева. Объясню на примере дерева: У меня есть дерево U. Оно состоит из v1, v1... В части дерева v1, есть 2 елемента a1 и само дерево U.
Это реализуемо на Си?
P. S. В логических языках это возможно. Это типо математически.
>>2486696 >День, когда сдохнет последний кодосёр на Сишке, станет праздником человечества. Т.е. когда везде будут распространены процессоры, жрущие джавовский байт-код?
>>2399452 (OP) Анонимы, я прошу, скиньте пожалуйста гит репозиторий одного чувака, который расписал весь свой многолетний путь в Си, какие технологии учил, что знает, прежде чем он начал успешно проходить собесы. Там было куча примеров (а может и не было), короче дохуя подробно расписано какие технологии выучил в течении нескольких лет. Бля, ну такой охуенный гит был и я его проебал. Я помню точно, это был гитхаб, и там был длинный ридми файл.
Поговорили как профессионал с професионалом и просто узнали мой кругозор, чем занимался и какие проекты делал, на чем писал и "как оно работает". Обожаю такие собесы без ебли мозгов алгоритмами сортировки пузырьком. Счтитаю что таким собесом можно вывести на чистую воду задрота который нихуя не знает, а просто зазубрил ответы.
Хотя конечно волнуюсь, что может быть фидбек отрицательный, но выложился я как смог и старался не волноваться и не заплетаться языком как я обычно люблю. Сейчас конкуренция огромная, а им нужно в только-только начатый проект с большим потенциалом несколько человек.
>>2497609 Ну сейчас рынок просел,но мне ещё по сетям пишут. А ещё знай С++. Не надо выучивать тыщи либ, но я всегда говорю "С++ немного знаю, приходится часто разбираться, но мой основной язык это Си".