Вы видите копию треда, сохраненную 24 декабря 2022 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Пожалуйста, пользуйтесь https://ideone.com/ https://wandbox.org/ или https://pastebin.com/ для вставки кода, если он длиной больше нескольких строк или содержит [i] или ∗.
Что читать:
- Brian Kernighan, Dennis Ritchie "The C Programming Language": http://www.cypress.com/file/56651/download
- Stephen Prata "C Primer Plus, 6th Edition" (2014): относительно свежая, знает про C89/C99/C11, описывает различия, объемная (около тысячи страниц), годная, с вопросами, упражнениями и ответами. Читать после K&R или до.
- Zed A. Shaw "Learn C the Hard Way" (2015): годное пособие для гуманитариев для гуманитариев!
- Немного примеров хорошего стиля: http://www.oualline.com/books.free/style/index.html
- ООП, например: http://www.cs.rit.edu/~ats/books/ooc.pdf
- Стандарт ISO/IEC 9899:1999 (C99): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf (драфт)
- Стандарт ISO/IEC 9899:2011 (C11): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf (драфт)
- Черновик стандарта ISO/IEC 9899:202x (C2x): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2479.pdf (февраль 2020, с диффами)
- Последний черновик ISO/IEC 9899:202x (C2x): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2596.pdf (декабрь 2020)
Чем компилировать:
- Очевидный 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)
MISRA Ltd. "Guidelines for the Use of the C Language in Critical Systems" (2013)
Набор рекомендаций по написанию надежного кода на C (промышленный стандарт). Читать - однозначно, следовать - вдумчиво и без фанатизма. Также можно посмотреть https://www.securecoding.cert.org/confluence/display/c/SEI+CERT+C+Coding+Standard и http://web.archive.org/web/20190213011655/homepages.inf.ed.ac.uk/dts/pm/Papers/nasa-c-style.pdf
Еще более длинный список: http://www.iso-9899.info/wiki/Books#Learning_C
https://github.com/kozross/awesome-c
Онлайн-утилиты:
- №70: http://arhivach.net/thread/713839/
- №71: http://arhivach.net/thread/727405/
- №72: >>2245329 (OP) (OP)
- №73: >>2297526 (OP) (OP)
репост из конкурирующего треда
Я сварщик не настоящий, но почему бы не использовать глобальные переменные?
Возвращай структуру или кортеж, значения распихивай так https://en.cppreference.com/w/cpp/language/structured_binding
А стоп, это же си тред, тогда только структуру.
Почему не модернизировать переменную по указателю? Всю жизнь с си так делал и жив.
Ну прочёл я Кернигана ебаного.
Че мне функции из головы что ли придумывать каждый раз?
сложил два числа блять
А как мне написать что-то годное?
Например типо снифера или кваки
Где этот промежуточный материал брать?
Из крс книги вообще ничему не научишься лол
Из кода. Берешь хороший код и учишься. Неинтересно - встаешь на кассу.
>>07847
Поэтому вам и говорят, что нужно учить не язык, а программирование и конкретную предметную область. Чем тебе поможет знание языка, если ты не сможешь его применить по причине своего незнания? Для начала ты должен формализовать задачу, построить архитектуру приложения, найти/составить модели, которые будут решать твои проблемы, а только потом садиться за код. Т.е. написание кода в работе программиста - это 5-10% от его общей работы. Для начала все строится на бумаге.
Есть норм челик какой-то, который пояснял на конфе про то, почему он пользует няшную + демонстрирует всякие свои трюки, например, про макросов на memalloc/dealloc, чтобы находить проблемные места с управлением памятью на этапе разработки. Курсы наверное нахуй не нужны раздобудь копию стандарта n1256.pdf и ещё читни на досуге книжку Ритчи и Peter Linden Deep C Secrets.
>Че мне функции из головы что ли придумывать каждый раз?
Я в школе программировал 5 лет, написал кучу программ, игр, всяких опытов провел, но так и не понял зачем нужны функции, ни разу функции не использовал, какая-то мутная непонятная хуйня. А потом дошли руки до си и там сплошные эти функции, и вопроса не возникло, всё естественно как воздух. Так что функции лишь плод си-подобного синтаксиса, на самом деле нахуй не нужны для программирования, ведь это математическая концепция, а программирование не математика. Си заставляет лепить эту функцию main() (говно если честно, за такое надо бы по ебалу бить), так что от этого не уйти, но дальше функции не нужны, а если понадобятся, сам узнаешь, ведь понять их в си труда не составляет.
>Си заставляет лепить эту функцию main() (говно если честно, за такое надо бы по ебалу бить)
на джаве только не пытайся писать, там тя вообще инсульт хлопнет
а вообще жырновато - даже в олимпиадном дрочении у меня без функций жепа скрипела поначалу да, тоже не сразу выучил, что меня выдало?
Джава, шарп и подобное это макакины языки, код абстрактный, плевать, да и они лишь скопированы с си.
А вот с си немного обидно, неплохой, реальный язык, но вот эта тяга автора в говноматематике там где она не нужна, раздражает. Напоминает хаскел, рак примерно схожей природы, насильное пихание математики. И не только форсом main(), но и вообще функций, даже подпрограммы (процедуры) выполнены в виде функций. Это особенно опасно для учебы, когда такое дают людям без представления о программировании, у них складывается впечатление, что программирование это сплошные функции, когда на самом деле наоборот, функции имеют весьма узкое применение, лишь в своей околоматематической области. Отсюда возникают дебильные, очень распространенные вопросы вроде "как вернуть несколько значений". Потому что к голову насрали чужеродной программированию парадигмой. Такое надо давать когда человек уже имеет правильное представление, а не с нуля шизу воспитывать.
Да, правильно, нахуй эти функции нужны,то все для ученых в говне моченых. Мы люди простые, просто копипастим код, когда нужно и пишем портянки.
Пишу свой двухколёсный дебаггер. Вот есть процесс, ему соответствует программа и слинкованные с ней в рантайме библиотеки (libc, ld и прочее); сегменты программы загружены в выделенную процессу память, библиотеки отображены и я всю эту красоту могу наблюдать в /proc/{pid}/maps.
Всё, что мне нужно сделать, это найти запись в таблице символов файла программы/библиотеки по адресу вызванной функции. Я парсю инфу о сегментах из /proc/{pid}/maps, смотрю, какой сегмент соответствует адресу функции и для соответствующего имени файла с помощью libelf подгружаю нужные мне заголовки.
Дальше это работает так:
https://pastebin.com/0rLUpUWF
(код сырой; на данном этапе нужно было, чтобы это просто работало)
data содержит маппинг файла программы/библиотеки, addr = адрес_функции - адрес_сегмента.
Для самого executable код вроде работает, но не для слинкованных с ним либ. Что я упускаю?
> А вот с си немного обидно, неплохой, реальный язык, но вот эта тяга автора в говноматематике там где она не нужна, раздражает. Напоминает хаскел, рак примерно схожей природы, насильное пихание математики. И не только форсом main(), но и вообще функций, даже подпрограммы (процедуры) выполнены в виде функций.
Не понял, кто в этом виноват: автор учебника или языка?
> Это особенно опасно для учебы, когда такое дают людям без представления о программировании, у них складывается впечатление, что программирование это сплошные функции, когда на самом деле наоборот, функции имеют весьма узкое применение, лишь в своей околоматематической области.
Любая подпрограмма - бесплатная функция. Это круто.
> Отсюда возникают дебильные, очень распространенные вопросы вроде "как вернуть несколько значений".
Это не дебильный вопрос. Это родовая травма языка, где нельзя fun x = (x,x)
>Это не дебильный вопрос. Это родовая травма языка, где нельзя fun x = (x,x)
Почему сложно вернуть структуру, она будет один хуй у колера на стеке.
В нормальных языках не нужно вводить для этого тип: ты просто возвращаешь N значений через values или (,,,).
>Не понял, кто в этом виноват: автор учебника или языка?
Виноват автор языка (частично) и авторы образовательных программ дающих си как учебный язык.
А так же виноваты их жертвы:
> функция. Это круто.
> fun x = (x,x)
вот такие промытые математутки головного мозга. Круто - не значит правильно.
Вообще, языку не проблема быть основанным на любой парадигме, ведь компьютер позволяет делать что угодно, но такие "что угодно" языки абстрактны, а си - язык реальный, в этом его предназначение. Конечно и в си есть абстракции, но они несут вспомогательную роль, а не захватывают язык целиком, си не является виртуальной игрой смоделированной на компьютере, это сам реальный компьютер, средство его управления, т.е. это и есть настоящее программирование с которого нужно обучать настоящих программистов, иначе получаются макаки играющие в виртуальные игры, это совершенно другой класс.
Компьютер универсален, выполняет прогграммы любого назначения включая языки с любой парадигмой, однако это не значит что и сам компьютер универсален. Нет. Компьютер это фиксированный механизм имеющий свою собственную парадигму, поэтому реальный язык и реальное программирование только те, которые основаны на парадигме сходной с компьютером. Важно расстояние (уровень различия) между парадигмой компьютера и парадигмой языка.
Поэтому, по своему предназначению, си - подходящий язык для учебы, однако на практике это не так. Си - не является учебным языком, это утилитарный язык для работы, поэтому автор счел правильным достаточно серьезно исказить его парадигму (завязка на функциях) ради практического удобства применения. Но это искажение вредно для учебы, дает искаженное осознание что такое программирование, скрывает за собой парадигму компьютера, которую обучающийся должен знать в первую очередь, т.к. она является основой - реальна, в отличие от прочих виртуальных.
Ебать шиза. Хейтер функций. Пиздец сказали бы - не поверил что такие поехавшие существуют.
>Си - не является учебным языком
В книжке Кнута учебным является MIXASM )) Кому ты пиздишь Кнуту, мне или Иисусу?
>Я в школе программировал 5 лет, написал кучу программ, игр, всяких опытов провел, но так и не понял зачем нужны функции, ни разу функции не использовал
На GW-Basic что ли программировал?
Толсто.
>В книжке Кнута учебным является MIXASM
Значит Кнут был не дураком как сейчас преподы задающие си и подобные языки. Ассемблер действительно то что нужно, почти. Недостаток его излишняя громоздкость и зависимость от железа и ОС, что делает его неприменимым на практике. А виртуальный еще хуже, оторванный от реальности теоретический самодроч, демотивирующий нормального человека. Нужен просто нормальный язык похожий по структуре на ассемблер. А вот когда человек допрет что такое нормальное программирование, потом можно давать эти фигурные блоки и прочую поебень, да хоть ФП давай, уже не критично, главное человек поймет, что это всё лишь рюшечки.
Но это лишь рассуждения базирующиеся на доброй воле. В реальности, рапример, правящие структуры могут быть заинтересованы плодить тупых макак, поэтому специально дают виртуальные языки, чтобы быдло оставалось в неведении о настоящем функционировании компьютера. Ограничение доступа, как говорится. Ну и тому подобное, вариантов много, не суть.
До сих пор? Слабо верится. Что-то не видно тредов по паскалю с домашкой, все на си.
Узнаю тон общения, упрямство, тупость и неумение читать поехавшего борца с абстракциями из предыдущего треда. Ты, хуйня? Может примешь наконец таблетки и перестанешь засорять треды своими "оригинальными" идеями?
Паскаль не о том вообще, он учит восе не программированию, паскаль учит высокоуровневому коду в стиле энтерпрайз, жестко форсит рамки "хорошего стиля". Это чисто прикладной аспект на более позднем этапе этапе обучения. А я говорил о первоначальном обучении именно основам программирования, они должны быть низкоуровневыми (в плане парадигмы), отсюда стиль ассемблера. Это не имеет ничего общего с энтерпрайз-кодом.
>реальности вообще не сущесвтует
В 99.99% случаев так и есть, потому что большинство людей - идиоты, а значит живут в манямирке. Для идиотов реальности не существует, их реальность построена их шизой. А настоящую, реальную реальность, видят только мудрые люди, но таких очень-очень мало.
Нуээ, если задача стоит обучить спецов программировать железо, то надо им давать какой-нибудь здравый ассемблер (мипс) и потом полировать это си как удобным макроассемблером. А если надо обучить решать задачи на компьютере, то незачем эти ассемблеры (1% сам придет к этому), пусть мыслят в терминах zip, join, регулярочки.
>если задача стоит обучить спецов программировать железо
Нуээ, ты говоришь с позиции дрессировки жикотных на определенное занятие, айти-макакинг. В этом смысле ты говоришь верно - что нужно, тому и надрачивают, просто затачивают специализированный инструмент. И уже не важно чему конкретно учат, подход один.
А я говорю с позиции давания правильного понимания программирования думающим людям с головой на плечах, так что это знание становится основой их дальнейшего развития, без особой привязки к направлению. Короче, те, кому не похуй. Основание - предположение что язык си (данный тред) именно для такого существует, как техническая специальность, а не как офисный макакинг.
Понимаешь, эти два подхода совсем разные. Если с нуля пичкать макакингом, коверкается разум и к нормальному программированию сложно будет прийти.
> А я говорю с позиции давания правильного понимания программирования думающим людям с головой на плечах, так что это знание становится основой их дальнейшего развития, без особой привязки к направлению.
А что такое правильное понимание и зачем оно.
> Основание - предположение что язык си (данный тред) для такого существует, как техническая специальность, а не как офисный макакинг.
Язык не специальность.
> Понимаешь, эти два подхода совсем разные. Если с нуля пичкать макакингом, коверкается разум и к нормальному программированию сложно будет прийти.
Можно с тем же успехом исковеркать разум битоверчением.
> к нормальному
Ну вот опять. Умение решать задачи на ЯВУ (не си) оказалось макакингом и ненормальным программированием.
Есть несколько адресов и один порт. На все это дело шлется udp инфа с сервера, и есть клиент который читает данные с этих сокетов каждый в отдельном треде
Че я делаю: создаю для каждого треда отдельный сокет, ставлю setsockopt опцию реюза для порта, бинжу адрес INADDR_ANY и моим портом, потом ставлю setsockopt опцию с адресом уже конкретным
Собсно я че то не так делаю или в логике какая то проблема? Потому что у меня каждый тред читает все адреса вместо одного конкретного
А по раньше написать не мог? Странная хуйня вообще, я же в следующих строчках подписываюсь на разные мулькаст группы, он не должен ничего читать с any
По крайней мере поведение такое, что одиночный сокет не читает инфу с забинженнным адресом any или конкретным и не подписанным на группу, а два подписанных на конкретные группы с забинженным any читают все подряд
Довольно противоречиво устроено, не?
Пердиксы дореволюционные, как оно пишется на этом древнем говне в 2022м году?
На этом "древнем говне" до их пор пишутся драйвера и прошивки, чтобы ты своих гномиков мог по экрану гонять.
Справедливо.
Даже при том, что я знаю про прикол a и [a]i, никогда бы не подумал, что именно там написано.
Хабр сегодня читал?
Бля, не пойму что не так. Или ты думаешь, что const к типу относится, лол? В данном примере const - это переменная, скорее всего, целочисленного типа. В Си констранты только через #define определяются. Замени const на любое другое название в своем примере и ничего не изменится.
А поч так шакально
Ты к нам с курсов яндекса пожаловал или че?
Мне бы хотелось написать универсальную враппер-функцию, которая в качестве аргумента будет получать адрес адрес linux api функции, вызывать её с переданными параметрами (разное количество), проверять результат на -1 и если errno == EINTR то вызывать заново.
Трабла в том, что я не понимаю как неизвестное количество аргументов во враппере прокинуть в вызываемую api функцию
Это вообще реально сделать не используя макросы ?
>Или ты думаешь, что const к типу относится, лол?
Представь себе, именно об этом и пост. Серьезно?
Пиздец, никогда такой ебалой не пользовался. Век живи, век учись.
У тебя указатель на массив carray получается константным, а вот carray[] уже изменять можно.
Я бы несколько inline функций сделол вида eintr_wrapper_n, где n - число параметров, или подобные макросы если <C99, и не ебал бы мозг с типо красивым решением. Просто и понятно.
Это ведь кал из С99? Там еще можно char a[static 3]
Забыл добавить, что этот враппер в случае выпадения из api по EINTR вызывает функцию, которая чекает флаги, устанавливаемые обработчиками сигналов и выполняет определенные действия, поэтому сигналы с SA_RESTART не катят. Мне нужно ловить эти моменты с EINTR и вызывать ProcessSignals()
>Автор виснущего говна
Причем тут "виснущего говна", хочешь сказать что вызов API может начать бесконечно нонстопом выкидывать EINTR ? Схуяли?
>>23405
Мм, ну тогда уже проще один макрос с ##__VA_ARGS__ сделать
Приведение нуля к указателю: int p = (int )0x0; приводит к тому, что такой указатель становится нулевым. По стандарту разыменование нулевого указателя вызовет Undefined Behaviour.
Я правильно понимаю, что средствами языка Си без Undefined Behaviour невозможно прочитать данные адресу 0x0000?
Если что, то по адресу 0x0000 находится таблица векторов прерываний.
По стандарту NULL не обязан физически состоять из одних нулевых бит, а что должно находиться по адресу 0 зависит от процессора и его режима работы.
А так можешь поиграться с mmap_min_addr
Это физический адрес. Смотри на /dev/mem
>По стандарту NULL не обязан физически состоять из одних нулевых бит
По стандарту присваивание указателю нуля делает его нулевым указателем. А нулевой указатель не может быть разыменован без ЮБ. Следовательно, невозможно написать корректную программу на Си для чтения данных по адресу 0.
>Следовательно, невозможно написать корректную программу на Си для чтения данных по адресу 0.
Можно.
int ∗v = ∗(int ∗)NULL;
и
int ∗v = ∗(int ∗)0;
Это 2 разных кода, которые делают разные вещи.
>Это 2 разных кода, которые делают разные вещи.
Нет, одинаковые. В обоих случаях на выходе получаются нулевые указатели.
>В обоих случаях на выходе получаются нулевые указатели.
NULL не является указателем на нулевой адрес.
>Это 2 разных кода
Одинаковый код.
И проблемы нет. Если адрес 0 есть, он разыменуется, иначе будет ошибка доступа например.
Ты наверное думаешь что и char везде 8 бит?
Вы приняты, оставайтесь на линии.
Не важно чем там является NULL.
Присваивание нуля значению указателя на выходе даёт нулевой указатель. У нас никак не может получиться нулевой адрес, потому что присваивание нуля на выходе всегда превращает указатель в нулевой.
>>25130
Код одинаковый, но проблема есть: разыменовании нулевого указателя — это UB.
Я хочу написать программу программу на Си без UB, которая читает данные по нулевой адресу.
Однако средствами Си сделать это невозможно.
Я не спрашивал о желаниях, а спросил в чём заключается проблема.
Если что,
>"я захотел <что-то>, и невыполнение сего это проблема"
нет, это не проблема.
>Как правильно аллоцировать память для многомерного массива?
Для маленьких кусков памяти malloc(a b ... * z).
Для больших кусков памяти malloc(a) for (i < a) malloc(b) for (j < b) ...
Test *
Прверь пути в свойствах.
int A[3][3] = {...};
main (){
/∗
передаём массив в функцию func (int∗∗, ...)
∗/
func (A,...);
}
Проблема: если в gdb просто вывести (int∗∗)A, то получим некоторый указатель. Если разыменовать как A[0],
то получим тот же (!!) указатель. А если ещё раз разыменовать A[0][0], то как и должно
быть получим нулевой элемент матрицы. Я нихуя не понял эти чудеса, лол.
Если уже в самой функции разыменовать A как (int∗)(A[0]), то получим невалидный указатель,
скастованный из элементов первого ряда матрица
Все вроде верно.
А[0] это первый указатель на массив из трёх интов.
Почему не валидный, там и должен быть первый ряд.
Непонятно то, что A в мэйне указывает сам на себя. Т.е. A указывает и на начало всего массива из девяти элементов, и сам на себя. Приэтом A[1], A[2] это указатели на два других ряда. Я наверное совсем не понял, как работают декларации многомерных массивов.
Да, наверное, всё так и есть. A[][n] это не тоже самое, что и ∗∗A.
В первом случае, как я и понял, это начало смежного одномерного массива, который компилятор рассматривает как n равноразмерных массивов; а во втором случае - указатель на массив указателей, которые в свою очередь указывают на одномерные массивы и необязательно смежные.
В чём я не прав?
Это одна из особенностей языка Си, что "матрицу", размещенную в стеке, надо в заголовке функции прописывать как A[][M], то есть количество столбцов должно быть константой, а вот на количество строк может быть любым, лишь бы памяти хватило. А вот если бы ты память аллоцировал для указателя int A, то подобное бы сработало, почему так, если честно не знаю, интересно бы было послушать экспертов
>Т.е. A указывает и на начало всего массива из девяти элементов
Из трёх. У тебя массив из трёх массивов. Т.е. реально у тебя в памяти 4 массива, три с интами, и один с указателями на эти три.
>надо в заголовке функции прописывать как A[][M], то есть количество столбцов должно быть константой,
Это же проблема или нет? Ведь тогда сигнатуру функции, работающий с матрицами нельзя сделать под параметризируемый размер.
>>30547
>и на начало всего массива из девяти элементов
Я имею ввиду, что int A[][3] указывает на начало непрерывного массива из девяти целочисленных элеметов, а не указателей.
>Т.е. реально у тебя в памяти 4 массива, три с интами, и один с указателями на эти три.
Ну если верить отладчику, то нет. Только указатель и девять элементов int. А вот для int ∗∗, будет всё именно так, как ты описал.
Но декларировать матрицы таким образом не получится. Придётся брать память и хранить где-то размеры матрицы.
Вообщем как я понял A[][] это больше для компилятора, в рантайме никакого массива с указателями не ряды не будет.
Зато такой способ должен экономить память, поскольку есть только один массив и указатель на него, внезависимости от многомерности.
> Это же проблема или нет? Ведь тогда сигнатуру функции, работающий с матрицами нельзя сделать под параметризируемый размер
Но можно же передавать одномерный массив типа A и две переменные, n и m, а потом умножением соответствующих индексов получать место, которое занял бы элемент в двумерном массиве...
> а потом умножением соответствующих индексов получать место, которое занял бы элемент в двумерном массиве.
A[1][2] и A[2][1] будут на одну и ту же ячейку памяти указывать...
Махровый сишник с бородой не знает что такое макросы и верит в разницу между нулевым указателем и нулевым указателем.
Толсто.
> #define NULL 0
Вот именно
И этот сишник с чего‐то вдруг решил, что есть разница между:
int p = NULL
int p = 0
И говорит, что второе — это нулевой адрес. В этих двух случаях на выходе возникает нулевой указатель.
На си мы в принципе не можем получить нулевой адрес.
Да не важно чем там является NULL.
Важно то, что при присваивании 0 указателю получается нулевой указатель, а не нулевой адрес.
Мб я вообще не так понимаю эту запись?
Проще говоря, хочу отслеживать аудиопоток на предмет определенных частотно-амплитудных характеристик (например превышение порога 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
>На мейлаче кто-то вообще работает на сишке не за мамкины борщи и не у с дедами в нии за рыбную котлету?
У программиста си зарплата как у продавца одежды
Прочитать один драйвер и одно описание устройства.
Неси сразу соурс код, долбоёб. На пике у тебя непонятно нихуя чё ты скопировал.
>>09950
>Нужен просто нормальный язык похожий по структуре на ассемблер
Уже есть smalltalk, но он наебнулся от виртуальности и контора его запилившая пошла по миру. Хотя спустя 50 лет до сих пор не могут допилить программинг до ТОГО уровня. Жаль что он пиздец медленный. А так да, C++/С это то ещё донное говно, но выбора нет, жрать приходится в три горла.
За ФП вообще убивать надо. Я бы анально запретил ФП программирование вне прототайпинга. Но это лишь рассуждения.
А у меня пустая страница, когда тыкаю на СИ в списке. При этом остальные страницы работают правильно. Скрин пустой страницы не стал делать. Ну просто без таких табличек, и всё.
Где можно подробнее про это прочитать?
ручками парсишь сорцы или как?
Откуда ты тут такой агрессивный, что тебя проткнуло?
Так мне непонятно было что передается в функцию, сурс тут нах не нужен был.
>Адепты раста зловредствуют?
Раст и Си - друзья на века, лол. Пока что все ОС и системные библы написаны на Си, то от него не отказаться.
Золотые слова
https://pastebin.com/tu4Rmh5v
Сука.
Я думал это формальность, объявлять количество элементов в array. Думал, при вызове элемента он автоматически создается и все. Но походу это баг и вызывало. При обращении к w[1] например происходит обращение к state вместо этого.
госпаде спаси и сохрани
C ходу на ютубе нашел https://www.youtube.com/watch?v=l3bXLhAEtxI
чел тоже час гуглил и видно, что многие застревают здесь, в гугле куча постов находится.
Это баг их обучающей программы? И много таких багов впереди? Может поискать какое-нибудь новейшее издание и там не будет такого? У меня голова трясется от этого.
Или таки есть решение? При условии, что можно использовать только те инструменты с которыми K&R нас успел познакомить до этого упражнения.
>При условии, что можно использовать только те инструменты с которыми K&R нас успел познакомить до этого упражнения.
>что можно использовать только те инструменты с которыми K&R нас успел познакомить до этого упражнения.
Ну так скачай совместимый с С компилятор С. В юниксе такой есть из коробки.
Направь файл в stdin, тогда прочитает.
visibility: hidden;
};
>Есть годный материал по односвязным / двусвязным спискам, словарям и хэш таблицам, с особенностями их реализаций на си и различных методов сортировки?
знак вопроса забыл
Если совсем база нужна то у Праты в учебнике уделено несколько глав спискам.
Смотри в предыдущем треде, я там кидал сцылку на гитхаб с алгоритмами на сях.
>Есть годный материал по односвязным / двусвязным спискам
sys/queue.h
>хэш
hcreate.c
ohash.c
(Курить Кнута, чтобы понять, что там не так)
>различных методов сортировки
wikipedia
англ знаю
Как раз для такого языка и имеет смысл делать видеокурс.
В ohash.c вот этот пиздец
incr = ((hv % (h->size-2)) & ~1) + 1;
можно заменить на incr = (hv >> 16) | 1
работать будет быстрее.
>писать не на лиспе
>не пытаться задефайнить хоть какой-то адекватный синтаксис
лольский
ебучие трансы с растотреда мечтают убить си
и для начала решили убить тред по си таким подлым способом
хуле еще от пидарасов ожидать
предлагаю пойти в растотред и насрать там
>АСМ тред мертв
>Си тред мертв
>Тред про крестам мертв
>Рряяя тупые растаманы
Пиздец ты дегенерат, а перекатывать и писать в треды тоже растаманы запрещают?
господь забирает лучших
А в чем виновны растоманы, если Макабу с разметкой сломал Абу, а не перекатили Сишники?
Базового уровня сишки хватит. С ардуинками и контроллерами нужно больше знаний о конкретном устройстве или хотя бы ориентироваться в документации и понимать где что найти.
Мне нужно реализовать обратную рекурсию. Это означает, например:
У меня есть функция f, в этой функцие есть функция g, а в функции g визывается f. Все это нужно для перебора дерева.
Объясню на примере дерева:
У меня есть дерево U. Оно состоит из v1, v1... В части дерева v1, есть 2 елемента a1 и само дерево U.
Это реализуемо на Си?
P. S. В логических языках это возможно. Это типо математически.
В чем проблема то? Пока стек не переполнится все будет работать.
>Это реализуемо на Си?
Да
void g(); // Теперь можно вызывать g, хотя она ещё не определена
void f() { g(); }
void g() { f(); }
>День, когда сдохнет последний кодосёр на Сишке, станет праздником человечества.
Т.е. когда везде будут распространены процессоры, жрущие джавовский байт-код?
Жаба это кринж, будет встроенная CLR пердолить шарповый код в процессоре со встроенными анальными зондами от майкрософт.
Аноны, а с++ тред тут ? Не могу найти.
Анонимы, я прошу, скиньте пожалуйста гит репозиторий одного чувака, который расписал весь свой многолетний путь в Си, какие технологии учил, что знает, прежде чем он начал успешно проходить собесы. Там было куча примеров (а может и не было), короче дохуя подробно расписано какие технологии выучил в течении нескольких лет.
Бля, ну такой охуенный гит был и я его проебал.
Я помню точно, это был гитхаб, и там был длинный ридми файл.
Мне просто завтра на собес.
Увожаемые!
На Си вообще работа есть? Кроме какого-нибудь убогого инжиниринга в бесполезном НИИ за 15к?
Дваждую вопрос этого анонима. На hh все плохо.
Кстати, довольно неполохо!
Поговорили как профессионал с професионалом и просто узнали мой кругозор, чем занимался и какие проекты делал, на чем писал и "как оно работает". Обожаю такие собесы без ебли мозгов алгоритмами сортировки пузырьком.
Счтитаю что таким собесом можно вывести на чистую воду задрота который нихуя не знает, а просто зазубрил ответы.
Хотя конечно волнуюсь, что может быть фидбек отрицательный, но выложился я как смог и старался не волноваться и не заплетаться языком как я обычно люблю. Сейчас конкуренция огромная, а им нужно в только-только начатый проект с большим потенциалом несколько человек.
>>93061
Спасибо, но я сам нашел, вся суть описана в ридми на главной:
https://github.com/jwasham/coding-interview-university
И вот кстати тоже неплохое нашел, пока рылся по гитхабу.
https://github.com/arorarahul/C-programming-for-interviews
Есть, гугли IoT (уже почти нет), OS, Linux kernel, сетевые технолологии. Платят от 150 до 250
Ну сейчас рынок просел,но мне ещё по сетям пишут. А ещё знай С++. Не надо выучивать тыщи либ, но я всегда говорю "С++ немного знаю, приходится часто разбираться, но мой основной язык это Си".
Вы видите копию треда, сохраненную 24 декабря 2022 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.