Это копия, сохраненная 31 марта 2021 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Пожалуйста, пользуйтесь 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, с диффами)
Чем компилировать:
- Очевидный 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
Онлайн-утилиты:
- https://godbolt.org/ - Compiler Explorer позволяет посмотреть выхлоп компиляторов для введенного куска кода (больше полусотни разных версий компиляторов).
- http://cdecl.org/ - С Gibberish ↔ English помогает читать сложные сишные декларации.
Прошлые треды:
- №59: http://arhivach.ng/thread/597021/
- №60: http://arhivach.ng/thread/610540/
- №61: http://arhivach.ng/thread/610541/ >>1786992 (OP)
Фтарой
Плюс ещё на уровне стандарта запретить использование скобок в логических выражениях.
Шутки шутками, а nullptr и так скорее всего будет в C2x в рамках восстановления совместимости с крестами.
nullptr будет корректно проверятся с указателем, а с переменной будет падать на компиляции. Макрос подобной гибкости обеспечить не может.
Мне нужно реализовать поиск тригонометрических функций без использования операций с плавающей точкой. Хотел просто синусами, косинусами сделать, но похоже нужен какой-то алгоритм.
Хз что там у тебя за задание, но плавающую точку всегда можно заменить фиксированной, т.е. парой целых, или рациональными числами числитель/знаменатель.
Операции sin, cos, tg, ctg чисел.
>Мне нужно реализовать поиск тригонометрических функций без использования операций с плавающей точкой.
Значение COS и SIN это нецелое число в диапазоне от -1 до 1.
Как его можно целым числом записать?
Ну в теориии то извратиться можно, но если ты не знаешь что такое IEEE 754, то очевидно что ты не тот человек, который может сегодня извратиться.
А чего бы не взять таблицу Брадиса за основу? Забить её в массив и наслаждаться погрешностью.
Ох лол, настоящий инженер
Что вообще значит "не используя числа с плавающей запятой"? Где ты результат хранить собираешься? Сформулируй задание как можно точнее.
Используй CORDIC или таблицы с представлением fixed point.
Постараюсь норм заплатить за это, но уровень знаний нужен неплохой.
Напишите сюда, пожалуйста @twoomer
Ещё могу подкинуть такую книжку:
http://buildyourownlisp.com/
Учишь Си путём написания своего Лиспа.
Читаю книгу, заглядываю в стандарт, много гуглю, пытаюсь ковырять разные исходники простых утилит.
И, конечно, вместе с этим решаю и пытаюсь решать различные упражнения, практические задания.
Не скажу, что всё идёт как по маслу, но настроен серьёзно, не планирую сдаваться.
На фоне всего этого почти всё время, которое провожу сейчас за компьютером, трачу на такое самообучение в одиночестве.
И как-то ощущается: нехватка живого общения по теме программирования на C и недостаток возможности обсуждать то, что с ним (C-программированием) связано.
Не поймите превратно, я не имею вообще ничего против C-тредов (пару раз успел получить дельные советы тут), но часто на самом деле как-то не хватает именно живого общения по теме. (посмотрел конфы в телеге, xmpp, но путного ничего не нашёл)
Ещё есть желание найти собеседников в первую очередь из числа тех, кто тоже серьёзно заинтересован в обучении программированию на C.
Может быть получится как-то иногда помогать друг другу, пробовать вместе разрешить ту или иную особо сложную "задачку", обсуждать что-то по теме.
Всё вышеуказанное побудило создать сегодня дискорд-сервер. Надеюсь, что кто-нибудь откликнется и присоединится.
Создал буквально пару часов назад, поэтому на первых порах сразу после входа будут открыты: голосовой канал и 2 текстовых (general и no-microphone).
Ссылку в форме картинки оставил тут: https://2ch.hk/ch/res/161664.html (М)
Буду особенно рад, если кто-нибудь из опытных олдов-специалистов решит зайти, что иногда делиться своей мудростью и давать советы неофитам вроде меня.
Тебе никакая книга не поможет, если ты не понимаешь как работает компилятор, транслятор, сборщик мусора и так далее.
Трипл хуйни не скажет. Он тебе всё верно написал. Как ты будешь компилировать свой хаскел? Синтаксис уже придумал? Парадигму используемую для программирования? Как это все будет транслироваться в байт код/виртуальную машину/ассемблерное представление? Или это будет транслироваться на кресты?
Не толсти толстый школьник-зумерок.
Это ты ещё книги на с++ не видел
https://www.livelib.ru/book/92238/readpart-krov-elektricheskaya-kendzi-siratori/~3
Ладно, для завтравки - кто пользует операцию "запятая" в Си. Уверен что начинающие программеры и не слышали о такой.
Да тут и про оператор "стремиться к" не слышали.
#define as ;while
do printf("n is %d\n", n) as ( n --> 0);
А вот тут уже у меня глаза на лоб полезли. Ты точно не троллишь?
Если что, пишу на Си с 1993 года.
Как-то ты грубо написал (без необходимости в этом). И сажа совсем неуместна.
Будь добрее что ли.
Нельзя быть таким ебанутым, как ты. Кроссплатформенное приложение писал хоть раз? Наверняка же нет.
Вообще это древняя фишка, видел чуть ли не в исходниках линукса.
Вот когда ядро ОС на Java напишут, тогда приходи. Java без виртуальной машины не работает. Виртуальная машина Java работает поверх ОС.
Sun Microsystems как раз и сдох? когда решил заебощить Java CPU/
При чем тут ядро ОС.? У меня есть обычные программы на Java и я этим калом пользуют только сдерживая рвоту от безысходности отсутствия альтернатив. Если бы весь софт был на Java я бы просто повесился или отказался от использования компьютеров, потому что моя психика дороже.
>У меня есть обычные программы на Java
Зачем так жить? Ну C# ещё как-то можно понять и простить, но Java?
Ненужны, это как var в паскале, который внезапно оказывается указателем, хотя таковым не выглядит.
Ссылка является частным случаем указателя. Когда передаешь объект в параметр функции, то передаешь его по ссылке. Использование ссылок в этом случае отменяет проверку на валидность указателя. Почему? Т.к ссылка указывает на существующий объект. Будешь брать ссылку из голого nullptr - получишь ошибку на этапе компиляции.
char *str = "Hi!";
return 0;
}
сохраняю, например, в файле hi.c
Затем в терминале выполняю команду: gcc -nostdlib -o hi hi.c
В ответ, конечно, получаю предупреждение /usr/bin/ld: warning: cannot find entry symbol _start; ...
Но почему после этого исполняемый файл hi всё равно весит примерно 13 килобайт?
>Но почему после этого исполняемый файл hi всё равно весит примерно 13 килобайт?
strip hi
Но сначала лучше прочти вот это - https://www.thegeekstuff.com/2012/09/objdump-examples
И посмотри сам.
Вангую отладочные символы внутри. Можно strip'ом воспользоваться.
Строки поубирает. Можешь попробовать флагами gcc убрать отладочные символы опцией -g0, но вряд ли оно прям все вырежет
У strip есть ключи. Можно хорошо порезать.
Выше же ссылка на ключи objdump. Это 100% ответ на твой вопрос.
Если так интересно, можешь ознакомиться со статьей: https://habr.com/ru/post/88101/
Мне всё-таки интересно, куда тебе размер уменьшать-то?
Может другой компилятор попробовать стоит или поиграться с оптимизацией (только что в этом коде оптимизировать..., нужно рассматривать примеры побольше)? То смотри и поменьше размера добъёшься.
При наличии ссылок по коду х=1 трудно определить, меняется тут аргумент или параметр за пределами функции.
глянул на статью, вот цитата оттуда:
"...Использоваться будут только явно переданные линкеру файлы».
jesstess@kid-charlemagne:~/c$ gcc -nostdlib -o hello hello.c
/usr/bin/ld: warning: cannot find entry symbol _start; defaulting to 00000000004000e8
Всего лишь предупреждение, все равно попробуем:
jesstess@kid-charlemagne:~/c$ wc -c hello
1329 hello
Выглядит неплохо! Мы уменьшили размер до значительно более вменяемого (аж на целый порядок!)…"
Тут >>10049 абсолютно идентичная команда выполняется "gcc -nostdlib -o hi hi.c" Но размер исполняемого файла не уменьшается, как это происходит в статье.
Поиграйся ключами - получишь массу информации. Он даже дизассемблирует.
Обсуждалась не передача обычных типов, а конкретно объектов. С теми же самыми структурами в Си приходится работать? - Приходится. Производится проверка на передаваемый указатель на структуру: эквивалентен ли полученный указатель NULL-у? Понятное дело, что такого рода проверка нужна для избежания ошибки сегментирования. При ссылке не пришлось бы этого делать, код стал бы занимать меньше места (ещё +1 в пользу ссылки).
Ранее упоминалось, что ссылка - частный случай указателя. Значит при изменении значения внутри функции передаваемой по ссылке переменной, значение вне функции будет также меняться.
Куски ELF выравниваются на страницу, чтобы его удобней мапить в память. Заголовок будет минимум страница. Дальнейшее зависит от кунпелятора и архитектуры.
clang -m32 даст файл чуть больше страницы.
Няши, напомните, каков сейчас максимальный сегмент данных в исполняемом файле? Указатель 64?
Ты лепишь какую то фигню. Ничего никакие ссылки не проверяют.
Консольную программу :)
Ты разыменовываешь nullptr и передаешь его, естественно будет неудачное завершение программы. Я говорил о другом.
Допустим у тебя есть структура, тебе её нужно передать в функцию.
Если ты передаешь по указателю, то тебе придётся делать проверку на nullptr (для устойчивости функции), если ты делаешь проверку по ссылке - проверку такого плана делать не придётся. В твоём случае ссылка верна - компилятор не ругается, но ссылка указывает на неинициализированный объект, поэтому обратиться к полям объекта не получится, в следствие чего ловим ошибку сегментирования. Всё правильно я сказал, подумай сначала, перед тем, как что-то писать.
Не "проверку по ссылке", а "передачу по ссылке". Опечатку допустил.
Ознакомься, будь добр, ещё с этим отрывком. Основные мысли выделил, чтоб не сбить тебя с толку.
>Если ты передаешь по указателю, то тебе придётся делать проверку на nullptr (для устойчивости функции)
Я тебе показал что в случае с ссылкой то же самое - я спокойно передал nullptr, значит тебе надо делать ровно такую же проверку.
> обратиться к полям объекта не получится, в следствие чего ловим ошибку сегментирования.
Опять же я тебе показал что программа обратилась к неинициализированному полю без всяких ошибок сегментации.
Ссылка указывает на указатель, в то время как указатель указывает на неинициализированный объект. Этого объекта в памяти нет. Какое-либо изменение, обращение к объекту приведет к ошибке сегментирования.
Ты сломал логику иным путем, а вот теперь попробуй передать ссылкой невалидный указатель напрямую. Так не получится.
Я тебе уже все показал. Я разыменовал nullptr прямо перед ебалом компилятора и он никак не среагировал. Nullptr никак тебя не защитит. Если ты напишешь свою библиотеку которая в функциях принимает ссылки, ей точно так же смогут передать указатель. Поэтому тебе все равно придется проверять на NULL если ты печешься о "непадучести".
> Ссылка указывает на указатель
Ссылка на разыменование указателя тождественна этому указателю. Указатель может быть 0. Эрго, можно передать 0 в качестве ссылки. Шах и мат.
Да, это так.
Компилятор не может проверить адрес объекта. Вся защита ссылок от того чтобы они не были nullptr - проверки типов чтобы ты не мог вместо ссылки присвоить nullptr или передать его в качестве ссылки.
Во всем остальном все хаки будут работать. Можешь 0 передавать хоть с ассемблера в код крестовый который принимает ссылку и все будет дружно падать, а ссылка будет 0.
Пошли маняманевры. Чел, ты мне-тотне пизди итт. Я всё прекрансо видел на что ты отвечал.
Почему это говно не упало на шестой строке?
Вот тут должен был segfault случиться:
mov eax, QWORD PTR, [rax]
Вакаба, сука скобки наверное пожрёт на rax
>Опять же я тебе показал что программа обратилась к неинициализированному полю без всяких ошибок сегментации.
Потому что там какой-то ёбаный эмулятор. Реальная программа сразу бы свалилась в корку.
Чел, ну зачем ты продолжаешь позориться? Ты вообще не понимаешь зачем ввели nullptr.
Если бы он, как ты говоришь, проверялся в компайлтайме на присваивание какой-то ссылке (а он не проверяется, как мы видели выше), то есть он в константном выражении, то и присвоение NULL (Someref& = 0) так же легко отлавливалось и никакой nullptr для этого не нужен.
nullptr как отдельный в плюсах введен по двум причинам:
1) перегрузка функций (foo(NULL) вызовет foo(int) а не foo(some*))
2) шаблоны (аналогично, some<NULL> развернется в some<int>, а не some<some_ptr_t>)
Но - в Си нет ни того, ни другого! И снова nullptr не нужен.
Ну тогда ты видел что отвечал я на "посоны вон книга где пишут Лисп"
Я только про плюсы писал.
Кстати там ходят слухи про шаблоны и перегрузку функций в Си, и что их могут и добавить, тогда и твои причины будут касаться Си, и можно будет о nullptr говорить.
>Тогда почему тут 139?
Потому что это ёбаный эмулятор.
Кто ж тебе даст запускать реальные бинарники на сервере?
Попробуй локально в консоли выполнить - словишь Segmentation fault. Core dumped. Или ""Программы выполнила недопустимую операцию и будет закрыта.".
Это я без всяких проверок тебе говорю.
Рекомендую перекатиться на операционную систему со своего спермоговна.
Какой эмулятор? Ты про sandbox слышал?
Оно и на godbolt упало. 139 кидает оно в любом случае, с любым кодом там если процесс падает в сегментацию.
Советую перекатиться на операционную систему со своей прошивки для микроволновки, которая падает от любого чиха.
>которая падает от любого чиха.
setjmp/longjmp позволяют творить чудеса
Но Windows ведёт себя неправильно.
>И давно так?
Возможно что-то в нулевой странице висит с отрицательным значением, оно оттуда тянет результат и отдает. На линуксе страница по адресу 0х00000000 не замаплена в процесс и ее убивает ядро. Это сродни тому чтобы полагаться на возврат локальных переменных по указателю. Вроде и работает, а вроде и не должно.
А по-моему это нормально когда ОС имеет адекватное поведение. И если программа полезла не туда куда надо - она не продолжила исполняться дальше, а была остановлена операционной системой.
И с какого хуя разыменовывание nullptr это вообще адекватно?
Это UB, поэтому по стандарту может быть что угодно, а понятия адекватно-не адекватно это уже пространные рассуждения уровня морали и чести.
>На линуксе страница по адресу 0х00000000 не замаплена в процесс и ее убивает ядро.
Это понятно. Нихуя непонятно с каких хуёв MSVC даёт спокойно завершиться программе.
Впрчем, я победил проблему и считаю что в данном случае разработчики MSVC просто ебанулись.
Нет связи между nullptr (или NULL) и адресом 0x00000000. Может быть виртуальная память. Может быть микроконтроллер у которого адрес 0 это вектор прерываний.
>Нет связи между nullptr (или NULL) и адресом 0x00000000
за nullptr ничего не скажу, это зарезервированное слово и копмилятор может пользоваться им по своему усмотрению.
Что касается NULL то испокон веков это нето вроде
#define NULL (void*) 0
и никак иначе
это и коню понятно.
да и полюбому адресу не даст - ОС обязана пресекать все попытки обращения к любому адресу, не отображённому в адресное пространства процесса.
Тебе расписали один из вариантов UB.
Странно отрицать что если NULL или nullptr подставляют зачастуюпро магические указатели по типу 0xDEADBEEF мы все помним при запуске всяких меморичекеров 0 значение, и если попытаться их разыменовать в указателях, то код будет содержать команду обращения к памяти по 0 адресу. Дальше дело железа и ОС
Нахуй такая ОС не нужна, где нельзя писать в другой процесс и в саму ОС. Да и не ОС это будет, а прошивка тостера.
Но в таком случае тред всегда будет полностью пустой
плакать надо было когда медведев поднял два лярда рубасов на постройке ваших хайтек сараев
Долой безопасность! Делай (int )0x7CFF5051 = 666; во славу Ленину, чтоб ебнуть ОС и все запущенные приложухи! MMU зло! Коммунизм памяти! Каждой программе по потребностям!
На каких?
>Забугром эмбедщина
>Quallcom, Mellanox, Marvell, Nvidia, Xilinx, Tesla
Речь идет про рядового анона, либо без во, либо закончившего говновуз, которые забугром нафиг не кому не нужны даже с 10 годами опыта.
Поэтому если выбирать из работы в России: прогать микрики, как даун, или стать веб-разработчиком, очевидно выгоднее выбрать второе. Можно как завести трактор в ДС, так и перейти на удаленку, фриланс, когда прогером мкк будешь всю жизнь сосать за 30-40к максимум при работе оффлайн 5/2.
>Причём настолько, что любой человек с опытом 3+ лет на этом самом эмбедеде может спокойно ехать в какую-нибудь Германию или Францию на 4-5к рейхсмарок ежемесячно,
Но реальность такова, что типичный байтоеб из НИИ, не закончивший топ вуз в дс, будет пахать за 20к-30к и ни в какую германию и францию не уедет, потому что он там нафиг не нужен.
В то время как веб-разработчик даже в рахе может получать эквивалент 2-3 рейхсмарок через пару лет работы и работать на в разваливающемся заводе или нии, а в крутом офисе с печеньками и кондиционером со свободным графиком.
> не одними деньгами, анонче. Есть ещё то, что у тебя в мозгу и душе.
Угу, пока норм прогеры уже и квартиру в новостройке/жилье купят, машину, и семью заведут, ты будешь ездить на работу на жигулях микросхемы паять и жить с мамкой, зато ДЛЯ ДУШИ работаешь, лол.
>ни в какую германию и францию не уедет, потому что он там нафиг не нужен.
Потому что ссыт боится и ленится. А съездить на пару лет не помешало бы. Культурный обмен и всё такое. Копеечку заработать чтобы стать дома на ноги. Почему нет?
А ты хоть жилье купил? Думаю язык Си обеспечит шансами на светлое будущее ещё не одно поколение инженеров-программистов. Все равно любой boot код писать проще на нем. Какой бы вы раст не хотели юзать или С++ для написания ядра, костяк все равно будет на Си. Тонна устройств которые имеют прошивку написанную Си - носишь mi band? Прошивка на Си. Фитнес трекер не на айос/ведре - тоже на Си написано. Юзаешь дома игровую приставку - на геймпаде и консоли прошивка написанная на Си вероятнее всегоили asic в геймпаде, не изучал точно. Юзаешь клаву USB или мышь? Тоже прошивка на Си. Куда не глянь, а он нас все равно окружает. И это охуенно.
Ну и да, зачем оставаться в РФ? Аргумент "ты там не нужен"? Смешно. С таким же подходом можно сказать - а зачем вообще кто-то нужен в России? Правительству нужна труба, нужны месторождения, остальные просто мешают им обогащаться.
>на жигулях
Как что-то плохое.
Vesta SW Cross - доволен и пока мне лучше не надо. Или это не Жигули?
А микросхемы это для души.
Дружище, ты продолжаешь срать писать в этом треде, агитируя всех вступать в ряды WEB-разработки. Напоминаю, ты намеренно приходишь в Си-тред и, затрачивая свое личное скорее всего время, делаешь это.
Я у тебя попрошу совсем немного. Я не буду тебя стебать, троллить и т.д., мне чисто интересно. И так, что тебя мотивирует это делать? Какая у тебя мотивация? Что тобой движет? Какая цель этих действий?
Ну и попрошу тебя рассказать о себе в двух словах, а именно - прости за нескромный вопрос, твой возраст и род занятий (если софтваре инжиниринг, то какой).
Ну... Либо же ты просто тролль, которому просто нечего делать.
> Дружище, ты продолжаешь срать писать в этом треде, агитируя всех вступать в ряды WEB-разработки.
Ну да, а тебя ебет?
>Напоминаю, ты намеренно приходишь в Си-тред и, затрачивая свое личное скорее всего время, делаешь это.
Ну да, а тебя ебет?
> Я у тебя попрошу совсем немного. Я не буду тебя стебать, троллить и т.д., мне чисто интересно. И так, что тебя мотивирует это делать? Какая у тебя мотивация? Что тобой движет? Какая цель этих действий?
А тебя ебет?
> Ну и попрошу тебя рассказать о себе в двух словах, а именно - прости за нескромный вопрос, твой возраст и род занятий (если софтваре инжиниринг, то какой).
А тебя ебет? 26 ЛВЛ, курьер в Delivery Club
> Ну... Либо же ты просто тролль, которому просто нечего делать.
А тебя ебет?
Не, меня никто не ебет (и ничего) а вот тебя, раз ты такие вопросы задаешь, возможно, кто-то и ебет по выходным
Мне всего лишь интересна твоя мотивация, лол.
> 26 ЛВЛ
А общаешься с людьми как шкила))))))
> курьер
Что и требовалось доказать - ты просто приходишь сюда посрать, дружище. Проследуйте в /b/, там для Вас место освободилось!
Понял-принял.
>>11104
Не понимаю вашего копротивления одному человеку, когда весь тред полон таких же.
Псмотри >>10623 , а потом на ответы. Дебики даже не поняли написанное, отсутствует понимание что такое компьютер, и как следствие что такое программирование. Рассуждают с позиции мобилки или веб-браузера, будто си это такой джаваскрипт, только более быстрый и со своими замутами. Просто сейчас одни веб-дебилы везде и есть, не в смысле что они пишут на хтмл, а в том, что отношение к программированию именно такое. А какой конкретно язык они для этого используют, какая разница.
Ссылка в твоём случа же корректна, невалидным явл указатель, как ты хочешь проверять невалидность объекта?
И о чём у нас спор? О том, что понятие ссылки в Си будет ненужным?
Тогда зачем ссылки были добавлены в кресты? Почему рекомендуют передавать по ссылке, когда имеется возможность, а не по указателю?
Давай, давай, нападай, раздави меня полностью своими железеными аргументами.
>Почему рекомендуют передавать по ссылке
Это кто?
>>11314
>Дебики даже не поняли написанное
Уйди остюда в спешке. Ты же глуп и не представляешь как работает MMU. При этом выкручиваешься, заявляя что Shared Memory не нужна. А вот своим последним постом ты вообще расписался в том, что ты биомусор - в ответ на резкие, но справедливые замемечания, ты полез в бочку. То, что ты чего-то не знаешь, это поправимо, но твоя реакция на указанные тебе ошибки с головой выдаёт в тебе тупую биомассу. Сдохни, наверное. Сделай мир чище.
Или обоснуй ненужность MMU, чтобы хоть как-то оправдать себя в глазах шарящх анонимусов.
Воспользуйся ресурсами сети Интернет, посмотри мнения людей. Вот здесь неплохое объяснение, когда и что необходимо использовать:
https://ru.stackoverflow.com/questions/349/Чем-отличаются-ссылки-от-указателей-в-С
Спор начался с твита человека, описывающего что он хотел бы добавить в ЯП Си. Я написал, что хотел бы видеть ссылки. Какой-то анон на меня напал и начал строчить (видимо другие предложения в твите он одобряет с барского плеча). Твит находится в начале треда.
Я так и не понял, мой "противник" топит за ненадобность ссылок или их бесполезность в Си. Задал вопрос - пока ответа нет, может очухается и ... ответит.
Я ему даже приводил ситуацию, в которой, я считаю, уместнее было бы воспользоваться ссылкой (во избежание проверки на NULL).
На текущий момент пребывания в этом треде складывается мнение, что те времена, когда сишники были своей небольшой и уютной компанией, канули в лету (надеюсь, что ещё будет искорка надежды).
Столько агрессии в треде, даже в жизни столько не видел.
Компиляторы С++ имплементят ссылки через указателину и открытие, да?, без особых валидаций. Стандарт не требует рантаймовых проверок ссылки на nullptr. Так что все поведение в принципе возможно, хотя и является UB. Да и в принципе избегать и обрабатывать UB в С/С++ это задача программиста, компилятор зачастую только рад подкинуть дров в огонь
Если ещё добавить к тому что ссылки в С++ не имеют адресной арифметики.
То наверное единственная польза от ссылок аля С++ в языке Си - синтаксический сахар, чтобы везде не писать разыменования указателя, а делать это просто по обращению к идентификатору.
Может вы ещё какие-то пользы подкинете, но с текущей реализацией которую можно слизать - пользы реально мало выходит. Либо надо все в куче переносить, с шаблонами и перегрузкой. Либо совсем нинужно.
>Дебики даже не поняли написанное
О великий анон, расскажи же нам, непосвящённым и тёмным, зачем везде и всюду в многопользовательские ОС вставляются MMU, и делается защита памяти и запрещается запись в память другой программы, а межпроцессное взаимодействие сводится к посылке сообщений через shared очередь и передаче данных между сокетами
Здесь у нас свободное общение. Ты можешь писать агрессивно, а можешь писать как лох ибаный и мямлить. В жизни ты столько агрессии и не увидишь, мы людоеды только на этом сайте
Противники топят за то, что ссылки в С++ кривые и уебищные, и чем такое пытаться переносить - лучше сидеть с указателями, которые дают тебе весь карт-бланш.
Тебе сверху по ссылкам показали что никаких проверок на null избежать не удастся.
И ещё, например, чего стоит олдовая шутка с ссылкой на локальную переменную, смешно, но работает - и является вовсе пиздецом. gcc насколько взбугуртнул от подобного что эту ссылку возвращает всегда 0 константой, мягко говоря запрещает подобное, да. А вот msvc и clang выдают рабочий код
Итог - чем такие ссылки, лучше с указателями ебаться.
Учитель тоже учится во время учебного процесса. Факт.
>Спор начался с твита человека, описывающего что он хотел бы добавить в ЯП Си.
Чел, ты... Он не хочет ничего "добавить" в ЯП Си, это ирония такая была над тем как комитет извращает фичи из с++ когда добавляет их.
> Какой-то анон на меня напал
На тебя никто не "нападал", ребенок, ты начал нести ахинею что ссылка защищена от присваивания nullptr, на что тебя обоссали с пруфами, приведя листинг в котором ссылки не запрещают никакие присваивания nullptr.
Просто съеби куда нибудь в страхе.
Он "сломал" ссылку другим способом (при котором сама ссылка корректная, а объект - нет). Ссылка защищает от явной передачи nullptr.
Если передаешь по указателю, то nullptr можно передать в ЧИСТОМ ВИДЕ. Со ссылкой такое у него не получилось, хотя я попросил его предоставить такой пример. А знаете почему? Потому что ссылка должна указывать не реально существующий объект. Кто ещё обоссан? С чего такие резкие выводы?
>при котором сама ссылка корректная, а объект - нет
Что за хуйню ты несешь?
В общем тебе уже все объяснили.
Ссылка защищает от конструкции MyStruct& ref = nullptr и от конструкции foo(nullptr)
Так просто не будь дауном и не пиши так. Это совсем нетрудно, это личералли два слова рядом, а не какие то сложные конструкции, которые надо искать по всем файлам.
Больше ни ссылка ни nullptr ни от чего не защищают.
Когда твою функцию foo(&) вызовут так ptr=NULL;foo(ptr) никакая защита не поможет и твоя функция упадет
Поэтому тебе ВСЕ РАВНО придется проверять то что тебе передали по ссылке на NULL, если ты не хочешь чтобы твоя функция падала.
А нужно рассмотреть все случаи. Чтобы принимать какую-то вещь правильно.
Принимая закон в государстве, не рассматривают же его только с одной стороны?
Но я изначально указал пример, который мы рассматриваем (передача структуры в функцию, проверка указателя на nullptr).
Спор не про то, что лучше: указатель или ссылка, а про то, что мой оппонент утверждает (пусть и не явно), что ссылки бесполезны. Зачем же тогда были введены ссылки? - рит.вопрос.
Я не могу полагать что такие языки, как C и C++ будут забивать ненужным г*вном. Значит всё-таки применение ссылочкам-то нашлось. Вариаций решения проблемы может быть много, выберите то, какое вам по душе. Вечно эти споры программистов (или ещё личинок) в интернете ни о чём. Может закроем тему?
И про это тебе уже поясняли - для этого никакой тип nullptr заводить не нужен, компилятор ровно так же может обнаруживать передачу обычного 0.
В с++ и шаблоны добавили, это не значит что надо раздувать си и тянуть все подряд.
Про nullptr разговора и не было, я не говорил, что его нужно вводить. В Си пока что хватает обычного NULL-а.
Когда обрабатываешь разные по типу параметры, то приходится функции копировать. Насколько мне известно, дубляж очень схожих или даже эквивалентных кусков кода является плохим тоном.
Языку нужно как-то развиваться и не стоять на месте.
Можно предположить, что Си пойдет по какой-то из нижеперечисленных дорог:
1. Не перенасыщен функционалом, но при этом безопасный язык.
2. Большой функционал, по безопасности остаёмся на этом же уровне.
Сугубо мне сипатичен 1-ый вариант. Большой функционал и определенная совместимость с Си есть у крестов. Пока хватает.
Мы разговаривали о ссылках и о проверка на nullptr.
Я подумал, что ты говоришь о введении nullptr-а в Си, такую тему я лично не поднимал.
проверке*
>разработчики MSVC просто ебанулись
или победил скриптовый мир, в котором консольному приложению не нужно показывать окано "Программа выполнила недопустимую операцию и будет закрыта."
Очевидно он имел в виду что Си не будет добавлять фичи, а пойдет в сторону безопасности.
Та даже в embedded суки какие-то тянут Javascript и Micropython. Реально побеждает.
> embedded
Не огорчайся. Со временем это всё отсохнет и отомрёт. Не совсем, конечно, но выродится в какую-нибудь гильдию писателей прошивок для маяков или чего-нить подобного. Короче, выродятся в секту.
Будет секта Сишников и будем молится святому юниксу, и умному ершику для унитаза.
Нихуя придумают какую нибудь новую хуйдуину и все начнется по новой.
Думаю ты сам понимаешь что язык Си не пойдет в этом направлении.
Ах, насчет nullptr - в proposal стандарта c2x оно уже есть https://hal.inria.fr/hal-02167929/file/n2394+appendix.pdf, но безопасности не добавляет особо
Раз думаешь так, то изволь предположить и написать своё мнение о дальнейшем разивитие обсуждаемого ЯП. Небольшое условие: мы заведомо отменяем ту ветвь разгвора, что язык не будет развиваться или даже умрёт. Только вперёд, ни шагу назад!
Моё скромное мнение: легко может не состояться
- Докинут в стандарт пару функций. Видел про strdup и strndup
- Добавят в стандарт языка bool, true и false, и не будет больше ебли с числамине, она безусловно останется, но будет считаться дурным тоном или старым кодом
- nullptr добавят чтобы не тянуть макрос с приведением типа к универсальному указателюNULL короче сделают deprecated
- Систематизируют все эти __attribute__, __typeof__ может добавят.
- Видел ещё хотят добавить __attribute__(cleanup(func)) в стандарт как оператор defer, хорошая затея, приходится его макросить нынче. Весьма полезная штука, позволяет на Си сделать подобие RAIIне в полной мере, передачу владения сделать никак нельзя, но освобождать ресурс по выходу из функции - на ура
- Может докинут в стандарт __attribute__(constructor(ctor)) и __attribute__(destructor(dtor)). По сути одно ранится перед стартом приложухи, второе atexit по сути.
- Из спойлеров нового стандарта - есть предложение описать работу со знаковыми числами и дополнительным кодом, и описать правила переполнения чисел знаковых, минус 1 UB, и это наверное единственное что касается улучшения безопасности кода.
Какую-то часть из этого может докинули в c11
А если на минуту представить что в своей нише язык Си достик совершенства?
Вот тут забавно было когда шло обсуждения, а кто-то не понимал что генерирует компилятор. Вот каким боком мнение такого человека может быть весомым?
Язык Си пытается быть как можно ближе к железу. Текущие строки как можно ближе. Вряд ли они будут что-то менять а их представлении. Максимум добавят ещё каких-то функций для работы с ними, если захотят кончено же.
Шо то зиг, шо то зиг.
Устройство строк можно было бы и не менять, хотя тоже неплохая идейка. Вот новые ф-и добавить действительно уже хорошо, а также усилить безопасность уж имеющихся.
уже*
> Паскалевские строки настолько же близки к железу, насколько и сишные.
По-моему единственное чем там от Си отличается - перегрузка "+" в конкатенацию строк. Но я с Паскалем вообще не работал.
>>11584
Устройство строк делает их легко переносимыми на любой тостер. Если функций добавить и можно, то каких? В голову приходят только для работы над unicode. Впрочем, у меня в проекте свои строки используются с динамической аллокацией, и я не капли не парюсь по этому поводу.
Слишком высокая абстракция. С++ этот тот же Си на стероидах. Точнее - его можно так использовать.
В паскалевских строках первым байтом идет ее длина, емнип. Что дает безопасность, которой в си строках нет, но делает всякую конкатенацию посложнее.
Ненужен.
А по сути-то нет вообще ни одной причины, запрещающий на Си реализовать паскалевские строки и наоборот.
На помню какой из компиляторjd, кажется майкрософтовский, а может и любой, схвавает вот такое описнаие
struct pascal_string {
int len;
char str[0];
}
И для Паскаля
Var
char_ptr :^byte;
То же самое что указатель на строку.
Не будем делать поспешных выводов, дорогуша.
В си ты бы просто циклом копировал вторую строку на место первого NULL-терминатора, до первого встреченного NULL. В паскале тебе придется выделить новое место.
В паскале ещё и ограничения на 255 символов, т.к длина указывается однобайтовым числом. Что насчёт лисп-лайк строк?
Что тебе мешает скопировать вторую строку по смещению N+1, а потом прибавить L к байту длины.
Главный недостаток паскастрок - в ограничении 255.
>В паскале ещё и ограничения на 255 символов
Это в классическом. Сейчас накидали новыйх типов. А пока Delphi гуляла по рукам, сделали по умолчанию string с бОльшим количеством байт. И добавили ключи компиляции, управляющие этим поведением.
Ну strlen сейчас наверное на интринсинках чтобы в 64 битный регистр по 8 байт строки читать, довольно быстрый.
Vala и D скорее с++ - там есть ооп, функциональщина и т.д.
Zig - простой язык в духе си, минус сишный препроцессор, вместо которого есть comptime, т.е. constexpr, на них же получаются дженерики, также есть defer некое подобие деструктора для raii, обработка ошибок нечто среднее между исключениями и optional типом (err, result), async await, и легкая интеграция с Си либами из коробки.
Ты же троллишь. Там же по факту вот что написано:
int n = 10;
do{
printf("n is %d\n", n);
}while(n-- > 0);
Я ХЗ почему никто не понял. Вот.
>А что в этом смешного?
В сишке одно из главных требований - обратная совместимость. Не ломая обратной совместимости, не убрать основныых граблей. Потому "расти в сторону безопасности" она может очень ограниченно. На самом деле, тебе уже сейчас никто не мешает делать рантаймовые проверки выходя за границы массивов. Более того, во многих арзитектурах это уже делается(каждый вызов маллока выдаёт кусок памяти на новой виртуальной странице, выход за её границе будет пойман механизмом виртуальной памяти).
>Zig - простой язык в духе си, минус сишный препроцессор, вместо которого есть comptime, т.е. constexpr, на них же получаются дженерики, также есть defer некое подобие деструктора для raii, обработка ошибок нечто среднее между исключениями и optional типом (err, result), async await, и легкая интеграция с Си либами из коробки.
Ну и что это даёт?
Это типа разница?
Как известно в с++ три разных языка - сам с++, макросы си, и шаблоны.
Сишные макросы на подмене текста вообще зло, и при этом довольно слабые по возможностям. В зиге это все работает на одном языке.
Defer означает что ты пишешь код инициализации чего-либо и тут же под ним код деинициализации - не надо скролить по десяткам файлах в поисках этого и путаться в лапше вызовов.
Обработка ошибок в сишке это всегда лотерея, угадывать куда там в errno записали или вернули 0 это успех или 1 это успех. Единый механизм это хорошо. Плюс он заставляет тут же switch обработать все ошибки - не забудешь проверить что файл не открылся.
Еще и переменную под счетчик пришлось завести.
И, зачем ещё нужен очередной велосипед?
Если не велосипед, то как мне написать прошивку на Zig и собрать ее под stm32f4?
Поясните нубасику.
Есть библиотека и в ней надо объявить глобальную переменную(да, их надо применять в крайних случаях, но иногда они необходимы).
Я правильно понял:
1)в файле library.c пишем:
uint8_t var = 0;
2)в файле library.h пишем:
uint8_t var;
3)в main.c подключаем хеадер либы;
#include "library.h"
4)а если переменная var должна быть доступна в other_librari.c без подключения хедера, тогда в ней пишем:
extern var:
Не уверен. Может быть уже есть. Даже если нет кто-то писал библиотечную.
> 1)в файле library.c пишем:
> uint8_t var = 0;
Да.
> 2)в файле library.h пишем:
> uint8_t var;
Нет, extern uint8_t var;
> 3)в main.c подключаем хеадер либы;
> #include "library.h"
Да.
> 4)а если переменная var должна быть доступна в other_librari.c без подключения хедера, тогда в ней пишем:
> extern var:
Вроде так. Но лучше включать заголовочник
АААА, ХУЙ ТЕБЕ!))))))))))))
>Я у тебя попрошу совсем немного. Я не буду тебя стебать, троллить и т.д., мне чисто интересно. И так, что тебя мотивирует это делать? Какая у тебя мотивация? Что тобой движет? Какая цель этих действий?
Потому что я уже наступил на эти грабли, и не хочу, чтобы другие тоже попали в эту ловушку.
>Ну и попрошу тебя рассказать о себе в двух словах, а именно - прости за нескромный вопрос, твой возраст и род занятий (если софтваре инжиниринг, то какой).
25 лвл, прогаю микрики.
там скрипты даже вредны, ты же не хочешь чтобы твоя кофеварка грелась процессором, а не тэном.
> интернет вещей
помойка говна
> и эпоха web3.0?
Эпоха подкатов на штанах, клубничного смузи, моноколес и гироскутеров, жидких бородок и андеркатов, миллиона библиотек, typescript, babel, gulp, d3, npm, jest, angular, react, vue, и прочего говна для пидорасов, миллиарда вкатывальщиков и знакомых которые "ха, я сча вот джаваскрипт учу, устроюсь программистом и буду 20к рубать на изян, а ты как %аноннейм% поживаешь?". Фу блять, мерзко.
А можно сделать так?
К библиотеке 1 подключить хедер библиотеки 2, а к библиотеке 2 подключить хедер библитеки 1? Т.е. встречно включить хедеры.
И как тогда хедеры библиотек подключать к main.c?
Описал и нарисовал немного сумбурно, но суть думаю вы поняли.
Для этого надо будет умно писать хедеры, чтобы не было циклических зависимостей.
Только интерфейс грубо говоря
Новичку очень легко запутаться в зависимостях.
Такого кода не может быть, рекурсивное вкладывание структур лишено какого-либо смысла, и не может быть реализовано нигде и никак. А если там указатели, то такие forward-декларации, как у тебя, отлично решают проблему. Это нормальный подход, или можно так же тайпдеф запилить.
Плюсую тебя
Если хочешь глобальные переменные, то это делается так:
- в library.c пишешь:
#ifdef DEFINE_GLOBALS
#define GLOBAL
#define INIT(x) =x
#else
#define GLOBAL extern
#define INIT(x)
#endif
- там же объявляешь свои переменные:
GLOBAL uint8_t var INIT(0);
- в один файл (library.c) инклюдишь:
#define DEFINE_GLOBALS
#include "library.h"
#undef DEFINE_GLOBALS
- во все остальные инклюдишь как обычно.
Галоперидольчика вколите ему!
Спасибо за ответ.
Но... Неужели прямо так всё плохо в embedded? Неужели нету надежды никакой от слова "совсем"?
Фублять, ненавижу этих пидарасов и их эту пидарскую хуйню.
НАХУЙ СМУЗИ! СЛАВА ВОДКЕ! Я, БЛЯТЬ, СЕРЬЕЗНО!
Естественно код был условный. И естественно чтобы решить проблему надо знать о форвард декларейшнах. О том и было сказано - надо продумывать зависимости. Хуй знает с чем ты поспорить решил.
Как усложнить простое, да. Шарит, определенно.
https://onlinegdb.com/r1hNQ8USw
Я вычитал, что проблема в сканфе - я избавился от сканфов, но по-прежнему считывается только первый инпут.
Если я правильно понимаю код, то ты создаёшь на стеке массив из 2 структур, внутри структуры 2 массива char, по 20/25 символов. Данные в стеке могут быть заполнены мусором. Ты от этого мусора считаешь strlen(), и пытаешься от высчитаного считать символы в stdin.
В вызовах fgets вызов функции strlen поменяй на 20 и 25 соответственно, вроде должно будет работать.
Забыл добавить это прям известный всем факт - strlen() и strnlen() считают длину фактической нультерминированной строки в каком-то буфере. У тебя же в строках был мусор.
Тебе же надо было считать длину буфера, ведь именно ее запрашивает fgets вторым аргументом.
Если буфер выделен статически или на стеке - можешь заюзать sizeof(buffer)/sizeof(buffer[0])
Если динамически в куче - изволь самостоятельно трекать что в malloc передал.
Ещё есть gcc расширение на выделение на стеке динамических буферов и alloca, но это маньяк-style
Программирую контроллеры на Си. Решил привести прогу в порядок - разбить на несколько .с и .h файлов.
Проблема заключается в том, что большинство *.с файлов обращаются к переменным, которые находятся в UNION.
Каким образом мне правильно объявить union как extern, чтоб иметь доступ к переменным union?
Так же, как и остальные, см. выше: >>12130 >>12131
Объяви свой юнион в отдельном .h файле:
typedef union
{
struct hui_t hui;
struct pizda_t pizda;
struct jigurda_t jigurda;
} yoba_union_t;
И используй как тип глобальной переменной:
GLOBAL yoba_union_t INIT({.hui = {...}, .pizda = {...}, jigurda = {...}});
Ну ты понел.
GLOBAL yoba_union_t yoba INIT({.hui = {...}, .pizda = {...}, jigurda = {...}});
быстрофикс, что ж такое-то по вечерам...
Все работает как с переменной.
Можешь заюзать страшные макросы типа сверху или просто ебнуть в си файл:
union { //fields
} my_union;
И в заголовочник:
extern union { //fields
} my_union;
Везде добавляешь заголовочник, появляется в видимости юнион из другого юнита компиляции.
Надеюсь у тебя нету там каких-то трюков с ним, в union хватает подводных камней и UB, и не знаю как это может отразиться на работе с extern
1) Можно ли как-то кастить поинтеры (причем любого порядка) в простые значения? Знаю, что есть ptrdiff_t, но желательно обойтись без него.
2) Нужно передать в функцию лист аргументов неопределенного размера. Причём тип аргументов может быть как символьный указатель, так и указатель на объект иного типа, или (вытекает из первого вопроса) просто long long int. Ничего иного кроме https://pastebin.com/wTMeN8Lm мой моск пока не выдумал.
Ты явно страдаешь какой то хней.
зачем? В стандартной либе уже есть stdarg.h c va_list
1. Берешь и кастишь. Хотя задача странная какая-то раз тебе нужно числовое значение указателя.
2. Заведи структуру список отдельную, и пили функции для работы с ней, конец списка - элемент NULL. И передавай его как 1 аргумент. Это вариант если тебе стек жалко.
Если не жалко или список будет не слишком большой - va_list и функция с ... аргументом.
Знаю популярные алгоритмы: пузырёк, всатвка, слияние, быстрая и подобные.
Что ещё нужно изучить? Где искать вакансии для вкатунов в имбед?
Как мне кажется - для эмбеддеда нужно больше знать особенности микроконтроллеров и разные технологии по типу spi, i2c, uart как работает и прочее. Ну и быть хорош в схемотехнике, понимать базово какие-то электронные моменты. Шарить в RTOS, и просто в написании софта для baremetal.
анон, спасибо большое, я примерно так и думаю. но мне желательно услышать бы конкретные указания и посмотреть вакансии на эмбед.
> Visual Studio Community Edition: внезапно этим стало можно пользоваться, особенно с тулсетом clang/C2.
Подскажите, есть один параметр который передает аргументы напрямую в clang, стоит ли так засовывать Ofast? Или O3?
Это была очень плохая идея в одном посте спросить "как вкатится" и за вакансии. Универсальное правило - вкатывайся до тех пор, пока тебе на начнут спамить хеадхантеры. И вот на этом уровне работа тебя найдёт.
Был бы работодателем, сразу бы скомкал твоё резюме . У меня нет ресурсов чтобы тебя обучать.
4 часа в день учить теорию реально совместно с 2 часами практики эдак 4-2? Или 2-2 оптимально?
Несоответствие тематике треда, рекомендуется выдать условное предупреждение.
Рекомендую в дальнейшем не покушаться на определённую анонимность участников форума. Благодарю за внимание, Аноним!
Хах, если бы хоть кто-то изучал так.
А по факту - забей на это все, измучаешь себя темпом не своим, потом забьешь и будешь ненавидеть.
Читай и изучай, практикуйся сколько можешь, а если надоедает - отдыхай столько, чтобы интерес опять появился.
Будто в этом что-то есть непонятное вообще
Ты даун?
ну ресурсы на сбoрку шкoльнoгo ранца у тебя надеюсь есть?
Ты прав тут. Для инфы скажу что не начинаю изучать, уже знаю все об поинтерах, решаю задачки на кодеваре, думаю алгоритмы изучать начать с математикой, ибо нравится.
Вот сегодня сидел весь день и изучал строковые функции по учебнику Праты, но я успел только повторить и завтуплять над книгой но таки понять как работает strcmp и написал пару программ. С утра правда еще рефактор задачки сделал.
А щас думаю что не потяну. Вчера не отдохнул сидел над задачей и туплю сижу. В общем 2 часа теорий буду.
Кстати еще слышал от кого то что практики должно быть 90% а теорий 10%.
>>14032
Оки.
правильно слышал, практики всегда должно быть больше, я вообще делаю так - 1 час залипаю в того же прату, 2 часа кодирую, и один час тупо учу инглиш
план уберчеловека
нoрм. я на фoрчoнге сижу
А вот сейчас я проиграл неистово.
Попробуй оконное Win32 приложение. Когда вернёшься к микроконтроллерам, будешь писать уже в другом стиле.
Проблем, на самом деле, никаких, берешь себе в помощь скриптопарашу по вкусу (проще всего луа и пидон) , подключаешь, на С рендер и низкоуровневые кишочки систем, на скриптопараше - всё остальное.
https://www.lua.org/pil/24.html
https://docs.python.org/3/extending/embedding.html
и да, первая и вторая жта, которые с видом сверху на С и написаны, шах и мат, оопетросяны.
>Сейчас я программирую под STM32F103C8T6 - если, конечно, дергание ног и посылку самых разных данных в логический анализатор по UART и I2С можно назвать так.
Ну то есть ты сракотан тамошними таймерами и их режимами и множителями еще себе не порвал? И даже USB девайс не написал, хоть это даже червекореш Хластер сделал?
Этого я пока еще не сделал, так как переходник UART-USB пока не пришел с алиэкспресса, лол.
А такое я год назад делал, кстати.
>Этого я пока еще не сделал, так как переходник UART-USB пока не пришел с алиэкспресса, лол.
Ненене, девид блейн, аппаратный USB, где там в дескрипторе одна история охуительнее другой.
А, это надо будет сделать.
Так тебе он не нужен, тебе нужно имеющийся на плате usb задействовать, а программировать и отлаживаться через STLink v2, который ты и должен был купить себе вместо USB-Uart.
> тебе нужно имеющийся на плате usb задействовать
Это уже я понял по сказанному выше.
> программировать и отлаживаться через STLink v2, который ты и должен был купить себе вместо USB-Uart
STLink v2 я как раз и юзаю для прошивки, а переходник я заказал затем, чтобы запилить устройство, которое можно будет подключить к пекарне по USB.
>а переходник я заказал затем, чтобы запилить устройство, которое можно будет подключить к пекарне по USB.
http://we.easyelectronics.ru/STM32/stm32-organizaciya-virtualnogo-com-porta.html
Спасибо за ссылку.
Согласен, системное программирование - вещь крайне охуительная.
Есть AngelSript и ChaiScript.
Потому что кекогерцы порешают, азазаза, берем дорогой камень для копеечной задачи, очевидно же.
> Можно ли как-то кастить поинтеры (причем любого порядка) в простые значения
uintptr_t
> Нужно передать в функцию лист аргументов неопределенного размер
Да, все делаешь правильно, но обычно это делают через массив struct { int tag; union { type1 v1; type2 v2; type3 v3; type4ptr v4; }; }, где тег указывает тип.
>>14245
Обычные таймеры там. Если есть предшествующий опыт с таймерами, хоть с 8254, то никаких проблем не возникает.
Потому что в правильных ядрах вместо них испольхуются синхронные сообщения с таймаутом. И на этих таймаутах реализуются любые задержки.
> в правильных ядрах вместо них испольхуются синхронные сообщения с таймаутом
Речь про ARM? Пришли ссылку с примерами.
Речь про микроядра.
Но потренироваться можно и на
DWORD WaitForSingleObject(
HANDLE hHandle,
DWORD dwMilliseconds
);
и
DWORD WaitForMultipleObjects(
DWORD nCount,
const HANDLE *lpHandles,
BOOL bWaitAll,
DWORD dwMilliseconds
);
А по-моему ты просто бимбоунитаз или мясо
Хммм... Анон, я чутка в замешательстве. А вот если нужно загенерить, например, ШИМ или измерять импульсы там? Ну да, это таймеры стм32 умеют.
> ШИМ или измерять импульсы там?
По хорошему это должы быть пару портов в микроконтроллере - в один пишешь частоту дискретизации, со второго читаешь значение широты импульса.
Через таймеры это как микроскопом гвозди забивать. Сообщениями можно тоже читать ШИМ, но это так же криво, как и таймерами.
>Сообщениями можно тоже читать ШИМ
Точнее, выдерживать интервалы для чтения шировты импульса с помощью сообщений это кривизна.
От тебя это не зависит. Они как в анекдоте про старого и молодого быков - медленно, важно и с достоинством спустятся с холма вниз и покроют всё стадо.
Спасибо!
По DO пот это нужно:
- https://my.rtca.org/NC__Product?id=a1B36000001IcmqEAC
- https://my.rtca.org/NC__Product?id=a1B36000001IcjUEAS
Если возможно, то ещё и DO-385:
- https://my.rtca.org/NC__Product?id=a1B36000007zprjEAA
Если ты намекаешь что захватят все ОС микроядра - дрочи у батареи о своей маняфантазии, хуй вам собакам на рыло с говноидеей, вам бы на джаваскрипте понаписывать гондонкода и операционку на реакте переписать, знаем вас пидрил долбоебских.
Если хочешь пороться в жопу с низкой производительностью - проследуй на парашу, говно.
Мнение глупых людей меня мало интересует.
Особенно повеселило "низкой производительностью" - сразу видно укушенного Торвальдсом.
Какая илита нарисовалась. На микроядра дрочит бесполезные. Когда у тебя десктоп будет работать на полноценном микроядре - приходи.
Про макос втирать не надо, там сервисом стартует бсдшное ядро и вертится как большой монолит поверх mach. Иначе перфа нету.
Весели нас дальше, ебантроп.
>Какая илита нарисовалась.
Да.
>Иначе перфа нету.
Ты сам-то хоть мерял? Или веришь Торвальдсу?
Что до десктопа, то когда линуксы на десктопе хотя бы близко сравнятся по отзывчиваости GUI с Windows, тогда приходи.
Анон, в STM32 таймеры умеют в ШИМ "искаропке". Т.е. "руками" ничего делать не нужно, кроме настройки-инициализации.
Там прямо есть режим, который в документации так и называется "PWM". Все, что нужно сделать, это настроить нужный канал таймера на выход, задать частоту этого самого ШИМ, задать duty cycle, запустить таймер (бтв, задаётся это в 4 если не проебался регистра, лол; хочешь - можешь вообще взять hal но он слегка странноват и говноват, там надо будет дернуть пару функций и все). Все.
>настроить нужный канал таймера на выход, задать частоту этого самого ШИМ, задать duty cycle, запустить таймер (бтв, задаётся это в 4 если не проебался регистра, лол; хочешь - можешь вообще взять hal но он слегка странноват и говноват, там надо будет дернуть пару функций и все). Все.
Ключевой вопрос в том, как используется таймер. Генерирует ли он прерывания и суть этих прерываний. Всё остальное вторично.
Если не включать прерывания в режиме генерации ШИМ, их, соответственно, не будет. Т.е. таймер будет генерить ШИМ э самостоятельно, без вызова прерываний т.е. сама "железка" таймера будет это делать, как бы в фоне, без участия программы.
Против таких таймеров таймеров я ничего не имею. А вот прерывания от таймера это зло. Пока ещё необходимое, но зло, от которого надо избавляться.
{
while(((arg++) = toupper(arg)));
return arg;
}
В чем подводные камни?
> Да.
Пизда.
> Ты сам-то хоть мерял? Или веришь Торвальдсу?
Да, есть бенчи, тестят производительность ядра. Скорость обработки системных вызовов. Все микроядра сосут в них.
> Что до десктопа, то когда линуксы на десктопе хотя бы близко сравнятся по отзывчиваости GUI с Windows, тогда приходи.
Мне отзывчивости wayland и kde5 хватает, делаю ещё nice по процессу композитора, очень отзывчиво работает все. Так что я тут, пришел уже. Что ещё скажешь, мразь?
Что плохого в прерывании от таймера? Прям сферическое прерывание в вакууме от таймера.
Типа почему \*arg++ это плохая затея.
>Что плохого в прерывании от таймера?
То, что оно асинхронное. Как результат, тебе придётся быстро-быстро его обработать в контексте прерывания, а затем синхронизировать с лругими процессами.
В нвстоящий момент прерывание от таймера нужно только лишь переключения задач, которые не осуществляют никакого ввода/вывода.
Ок
Даже за одну мысль о таком - "эээ слыш уебывай в кресты!", не для того штульман и пердолики долбились в сракотан, чтобы ты писал код адекватно.
>То, что оно асинхронное
Наш физический мир и его события в принципе асинхронны, как следствие и логика предметной области тоже.
Альтернатива прерываниям - выделенные специальные контроллеры для каждой из множества задач/событий в духе мейнфреймов IBM 60х-90х, где у каждого сраного принтера и дисковода был отдельный манякомпьютер, который с главным процом общался чисто через каналы.
Собственно, если брать специализированные МК такие как популярный в последнее десятилетие в автомобилях TriCore, то там так и делают, физически разделяя "реалтаймовую" и "умную часть":
https://www.infineon.com/dgdl/TC1797_DS_V1 3.pdf?fileId=db3a30431ed1d7b2011efeaa4ad16b6d
Кажется, тот анон пытается сказать что если у него устоявшиеся процессы, то простой скедулер, по типу корутины, чекающий по очереди состояния, будет иметь меньший оверхед, чем переключение контеста в прерываниях, сохранение регистров, вот это все.
>Наш физический мир и его события в принципе асинхронны
Это только на первый взгляд. Повышая частоту ты понимаешь что он синхронный.
Ну так я и говорю, азазаза кекогерцы порешают, вьебем камень за 50 баксов вместо камня за 5 и все проблемы решены прерывания и таймеры не нужны.
Если у него устоявшиеся процессы, то им в принципе не нужна система управления.
В автомобиле вот устоявшиеся процессы - это только если едешь на включенном круизе по трассе и до первого светофора. А в остальное время там пиздула и ахуй -
обороты туда-сюда, частота событий тоже туда-сюда и для всего этого нужно вычислить адекватное топливо вовремя, иначе хуяк - и выстрел в глушитель остатками катализатора, в лучшем случае. А на современном пережатом говне где в почти дизельную степень сжатия еще и дуют турбиной а потом прыскают прямо в цилиндр бензулин - так особенно.
Не, безусловно можно за стоимость всего автомобиля сделать автомотив-грейд аналог разогнанного в щи гиперпыни (автомотив грейд - это когда, напомню, железяка пожар под капотом должна выдерживать, а не в синьку падать на детских 80 - 90 градусах которые на изичах можно получить в подкапотке в жаркий день в пробке), исключительно ради расовой верности и отсутствия прерываний и тогда любой сраный логан и матиз будет стоить как бэха -семерка, а бэха-семерка - как ролс-ройс в комплектации для первых лиц, но кому нахуй это будет надо?
А если речь зайдет о потоках событий не в жалкую сотню килогерц как в авто - а в десятки мегагерц - тогда уже даже рекордных камней под азотом не хватит.
Поэтому шизой любителя микроядер в реальности никто не занимается, а блоки управления делают на TriCore, где по отдельным физическим ядрам разнесены ускоренная програмируемая обработка прерываний и генерик-расчеты.
>>15082
>>15056
Чтобы исключить бессмысленные споры, я говорю вот об этом микроядре - https://www.l4ka.org/65.php и конкретно вот об этой спецификации - http://l4ka.org/l4ka/l4-x2-r6.pdf
Ну я и говорю, что бы превратить асинхронные события типа зуба датчика грм/датчика детонации (грм - это, например, классический шкив 50-2 умножить на обороты, детонация - это аудиочастотный спектр от слышимого к ультразвуку и для эффективной обработки нужно сложные вейвлеты быстро гонять на по-сути аудиосигнале) в синхронные и сделать православно на микроядрах и сообщениях - это где-то гиперпыня на 4-5 ггц.
>вьебем камень за 50 баксов вместо камня за 5 и все проблемы решены прерывания и таймеры не нужны
Не нужны. У тебя ограничение в пять баксов за чип? Доку в руки и пили вот это на пятибаксовом чипе.
На пятибаксовом чипе я с твоим подходом получу нехуёвый и, самое главное, бессмысленный оверхед, который не даст мне с требуемой оперативностью реагировать на поток событий.
Напомню, шкив 60-2 крутится с частотой вращения коленвала, что дает частоту событий от 59 кгц на холостых до 590 кгц++ на всраку крученном спортивном моторе.
С помощью прерываний и возможностей периферии без труда обрабатывают такой поток на штатных для пятибаксового камня еденица-десятках мегагерц собственной тактовой частоты.
Вот, собственно, фотография платы известного древнего блока, даташит и характеристики МК, который в нем напаян - можешь поискать сам.
>С помощью прерываний и возможностей периферии без труда обрабатывают такой поток на штатных для пятибаксового камня еденица-десятках мегагерц собственной тактовой частоты.
Ты просто не понимаешь с чем ты споришь. Я тебе маленько намекну, а ты уж сам решай.
И, для сравнения, вот высер подобных тебе осешизиков, правда еще не таких поехавших как ты:
https://github.com/rusefi/rusefi/tree/master/firmware
Они притащили с собой ChibiOS, топовый 32битный STM32 камень и при этом у них всё равно всё это работает намного хуже, чем блок из 90х годов прошлого века на снятом с производства 8-битном МК.
>А где это микроядро можно покрутить ирл?
https://os.inf.tu-dresden.de/download/snapshots/pre-built-images/
А там что, ничего кроме hello world и монолита(линукса) поверх микроядра нету? Ахахаххахахахахахха
Не имеет значения. Но если хочешь поспорить, то давай спецификацию на датчик оборотов и датчик детонации. Тогда поспорим.
Вообще-то синхронно. Они передают между собой сообщения, а весь мир работает под управлением микроядра L4Ka::Pistachio.
Флопик? Оно ещё живо?
>Ты просто не понимаешь с чем ты споришь
Понимаю, спорю с поехавшим дебилом.
16000000 / 59000 = 271.2 тактов
16000000 / 590000 = 27.12 тактов
А он мне какие-то потоки предлагает. Я там в них вилкой буду чистить, в окне в 27 тактов?
У тебя выйдет некрасивый код. Решать тебе.
Спеку на датчики неси. Или у тебя каждый оборт коленвала фотодиодом моргает и генерирует прерывание?
>то давай спецификацию на датчик оборотов
https://www.infineon.com/dgdl/Infineon-TLE4929C-DataSheet-v01_10-EN.pdf?fileId=5546d46265257de8016537ce85935e53
На датчик детона спецификацию не найду - считай его сейсмомикрофоном.
И в определенное прерывание из этих 60 надо брызнуть малафьёй бенулином в цилиндр и поджечь искру.
Зачем? Это выйдет слишком дорого делать и не выгодно.
Плюс нельзя будет подтюнить ДВС так как необходимо, если все будет в железку зашито.
>Сделайте уже спецчип и не партье мозги. Или в ПЛИСину залейте.
>И чтобы несколько режимов понимала - Эконом, Город, Трасса, Спорт.
Никто мозги не ебет, всё это с завода работает на заводских мозгах на вот этом восмибитном камне на 16 мгц частоте, даже самые крутильные срако моторы за десятку:
http://pdf4.datasheet.su/831911.pdf
Без каких либо плисов-хуисов.
Анон. Я вижу, ты вроде бы разбираешься в automotive, а именно в ЭБУ и вот всей этой кухне.
У меня есть пару вопросов:
1. Какие сейчас самые распространенные МК в данной сфере? C509, так понимаю, уже снят с производства. TriCore знаю, а... еще какие?
2. Возможно ли достать сам кайнд оф отладочные платы на этих камнях где-нибудь? Желательно, у китайцев, по дешману, ггггг. Но, если не - то не. Ну или, хуй с ним, сами МК.
>1. Какие сейчас самые распространенные МК в данной сфере?
В большинстве современных блоков ты встретишь Infineon Tricore различных модификаций.
https://www.infineon.com/cms/en/product/microcontroller/32-bit-tricore-microcontroller/
>>15156
>2. Возможно ли достать сам кайнд оф отладочные платы на этих камнях где-нибудь? Желательно, у китайцев, по дешману, ггггг. Но, если не - то не. Ну или, хуй с ним, сами МК.
Сами камни по дешману можно - так как они суть ходовые запчасти для ремонта блоков. На алике тот же TC1797 за тыщу-300
На маузере вот:
https://ru.mouser.com/Semiconductors/Embedded-Processors-Controllers/Microcontrollers-MCU/32-bit-Microcontrollers-MCU/TriCore/_/N-a85nmZ1yzmonk
Всякие отладочные ардуины тоже в наличии:
https://www.infineon.com/cms/en/product/microcontroller/32-bit-tricore-microcontroller/32-bit-tricore-aurix-tc2xx/aurix-family-tc27xt/
Для развития конечно. Например, для ДВС энергопотреблением этого контроллера можно пренебречь. А если где-то от батарейки будет работать, то уже всё не так радужно.
Где нужно работать от батарейки - там будет другой микроконтроллер, заточенный на работу от батарейки. Но мы в данный момент говорим за решения для контроля над двигателем.
Вот, собственно, ардуина из камня для эбу за 140 bucks:
https://www.infineon.com/cms/en/product/evaluation-boards/kit_aurix_tc275_ard_sb/
Вернёмся к этому разговору несколько позже.
У меня чувство что ты вербуешь в свою "религию", а я в свою. Посмотрим чей "бог" сильнее.
Ха ха ха. Ну знаешь, если те, кто чтят священную спецификацию L4.X2 это секта, то вы - те, кто идолам поклоняются, да с бубном над исходным кодом танцуют - язычники.
У нас ещё круче. Ща расскажу как у нас происходят встречи любителей микроядер. Мы собираемся у кого-то на квартире. Раздеваемся. До гола, далее мы берём и бреем очко, смазываем качественной смазкой на базе канифоли/спермы бомжа/гнили с дна мусорника. Затем начинаем плеваться в распечатанное фото Линуса Порвальдса. Долго плюемся. Назначаем главного падре данной встречи(скоро узнаешь зачем) с помощью генератора случайных чисел. Потом начинаем подсасывать друг другу хуй и дрочить на скрин mac os xникто не знает почемувсе дело в замашках на микроядерность наверное.Потом мы открываем спецификацию микроядра L4Ka::Pistachio, и начинаем неистово ебаться в жопу, гул стоит на весь двор. Затем заходит главпетух всех микроядер вместе с ручным гусем под руку. В руках главпетуха большой дилдо. Он начинает ебать гуся большим фаллосом. Все оргазмируют на спецификацию микроядра и ее неистовое совершенство, кончают на распечатку спеки на куске оборванного листа. Назначенный падре начинает слизывать сперму с этого листа.
Посчитаешь дырку - узнаешь за какое время проходит 4 такта. На этом все.
Посчитаешь каждый зубец - точно сможешь знать когда происходит каждый такт. И в зависимости от этого отрегулировать обогащенность смесь, или время упреждения зажигания свечи.
Просто им в голову не приходит что небольшим, ничтожным по современным меркам, транзисторным бюджетом можно добавить два регистра, один из которых считает количество такктов за один поворот коленчатого вала, а друой - число тактов после прохождения ВМТ. Да хоть в угловых секундах. Но нет же, надо ебаться с прерываниями и городить вокруг этого философию.
4 такта и 4 поршня, 16 тактов суммарно за 1 вращение маховика. Плюс газ управляется в принципе тем, кто не попадает в одни и те же обороты всегда. Форсунка находится в каждом поршне. Не думаю что все так просто там и можно интерполировать все.
> Не думаю что все так просто там и можно интерполировать все.
Это сложно с точки зрения физики, а с точки зрения программирвания это всё по таблицам легко реализуется. Программирование микроконтроллеров не rocket science.
>А что нельзя считать только саму дырку, а остальное не считать?
Можно. Так даже в некоторых мозгах вроде Megasquirt делают.
Только в таком случае хуй тебе а не угловое ускорение вместе с точным регулированием ради которого весь сыр бор.
>>15434
>Просто им в голову не приходит что небольшим, ничтожным по современным меркам, транзисторным бюджетом можно добавить два регистра, один из которых считает количество такктов за один поворот коленчатого вала, а друой - число тактов после прохождения ВМТ. Да хоть в угловых секундах. Но нет же, надо ебаться с прерываниями и городить вокруг этого философию.
Вал имеет свойство вращаться неравномерно, а так же ускоряться/замедляться.
Повторюсь, есть системы в которых используется сраный трамблер с одной шторкой в качестве датчика - смесь получается хуета.
Как разом проверить выставлен ли хотя бы один бит с 10 по 14-ый, тобишь 3E - любой из них?
применил хуй у тебя во рту
>Вал имеет свойство вращаться неравномерно, а так же ускоряться/замедляться.
Сдаётся мне что ты юлишь как слово подставь сам. Это в каких моторах считается угловая скорость?
Проблема поиска угловой скорости решается ещё сотней-другой транзисторов, ещё одним фотодиодом, 60-ю отвестириями по кругу. Далееи считаешь дельту между сигналами, тоже можно поместить в регистр, отображённый в адресное пространство. Опять же в тактах. Вот тебе и датчик. А чтобы не дрочить контроллер, генерируешь прерывания только когда дельта меняется.
Можно и и вообще одним фотодиодом обойтись - убираешь одну дырку после ВМТ - вот тебе и положение вала, дельта меняется в 2 раза +- несколько процентов, значит метка полного оборота вала.
Ты лучше расскажи - эмулируют ли "мозги" поведение топливного насоса каррбюраторного двигателя? Имеет ли смысл на инжекторе "накачивать" мотор педалью газа?
>0x00003F00 & 31<<10
If( (number & 0x00003F00) != 0 )
printf("At least one bit is set\n");
else
printf("No bits are set\n");
Мозги ничего не эмулируют.
Мозги расчитывают количество бензулина и момент когда им нужно бырзнуть, а так же когда дернуть искру.
Если говорить про современные автомобили где-то после евро-4 то там полный пиздец, моментная модель и нечетко-нейронные сети в алгоритмах управления.
Короче - нет. Более того, современные блоки даже прошивать особого смысла не имеет - потому что там теперь
> нечетко-нейронные сети в алгоритмах управления
А старые добрые таблицы используются в качестве начальной обучающей выборки. И по этой причне чиптюнинг на таких авто имеет свойство "протухать" через неделю - потому что обмудки-чиповщики сбрасывают обучение и переправляют те самые таблицы будучи совершеннно не в курсе что таблицы эти не рабочие, а стартовые для алгоритма обучения и там на самом деле машоб-тред и слесарплов во все поля.
>Проблема поиска угловой скорости решается ещё сотней-другой транзисторов, ещё одним фотодиодом, 60-ю отвестириями по кругу. Далееи считаешь дельту между сигналами, тоже можно поместить в регистр, отображённый в адресное пространство. Опять же в тактах. Вот тебе и датчик. А чтобы не дрочить контроллер, генерируешь прерывания только когда дельта меняется.
Ты уже на полпути пути к:
>>15043
Я тебя поздравляю.
Делаешь всё логично, и все работает. Предварительно на кнопочки понажимай.
>Мозги расчитывают количество бензулина и момент когда им нужно бырзнуть, а так же когда дернуть искру.
Блин. Я имел в виду конечно же не топливный, а усскорительный насос. Не эмулируют? Ну и зря!
>>15750
>Ты уже на полпути пути к:
Хмм. Вот специально почекал как устроены ЭБУ современных двигателей. Пойдёт за неимением лучшего.
Кстати это весьма ощутимо если пересаживаешься на чужую машину. Раньше до тебя на тачке ездил какой-то тип неторопливый, и машины такая, хреново разгоняется, будто старый дед. Но проезжаешь на ней километров 10, и машина будто начинает понимать тебя, становится более резвой, активной. Теперь понятно почему все так.
В старых мозгах, которые на таблицах, есть поправка на обогащение при разгоне и переключении.
http://rotorman.dtt-motorsport.ru/j5-sport/j5_tech.htm
В новых, которая на моментной модели такой хуйни нет.
Толсто. Это твоя серая нейронка перераспределила веса.
>Если говорить про современные автомобили где-то после евро-4 то там полный пиздец, моментная модель и нечетко-нейронные сети в алгоритмах управления.
серьезно? есть соус?
ведь это же опасно, а классические алгоритмы никуда не делись, не так уж плохи и обладают Интерпретируемостью.
Да
>В новых, которая на моментной модели такой хуйни нет.
Небось по требованию экологических организаций?
И расскажи как ты считаешь вейвлеты на 8-битном CPU за две тысяи тактов. :-)
Если куда то пихают нейронку, то это попил, а не техническая необходимость.
>ведь это же опасно
Схуяли? Это же не диплернинхпараша.
есть соус?
https://www.drive2.ru/b/549296493979238598/
https://www.drive2.ru/b/523622347714855958/
https://mediatum.ub.tum.de/doc/1108936/946895.pdf
https://pdf.sciencedirectassets.com/282073/1-s2.0-S2212017312X00045/1-s2.0-S2212017312002563/main.pdf?X-Amz-Security-Token=IQoJb3JpZ2luX2VjEL///////////wEaCXVzLWVhc3QtMSJIMEYCIQC2FtI3TEpLrTmxJKiucvg/RaDrm061pPw98tmLKRBUvQIhANg/1szhok7hfZy9ad1QJ+bXa/qksFVzZy2q7cGv6iKtKr0DCNj//////////wEQAxoMMDU5MDAzNTQ2ODY1Igx+Uah2XSsx0cXaOMkqkQOAg/wCHLTylNg/ZcnCqfoYhjAO5SXOesBIFiWC+iOP5QYepxgJKDmBSwB2dSHC2/v/J309DLyyDpSHF05ptoj0p/kJIEKneKTWQUUSMrXQ5hY+yDrgiPTcShY+oWDTDffrk8kbMGkhKILTgEg7fqmzpXWmNNghuHKu/8KIMTNbSGqLg9vVUp6T6rL9Eix54EASTJwuTIa1wqsMQl2Gk/WU0dRiJYfRY0zXuAgMTVX6+qOipRZ4ewWQbnIDzLyV72OMZbxiykvIcdJ4JruCYVKfBLkqMNEbYq2wAhGUpp8tYiL5kfSgsPbHC4V5cvDJrRqCqBnQF+YmAcF6pYQ7qftitz3opKqxljXbMST6rEvu780FSi1YHA0sMbXva61SnYqQ8yOtzovD1Xq9eFUAXGHRluSwdco7GJcNjKzf3Q4w/W7XcfCQkBfObdeFsxrm39yD4fbEHQfRbr4lV5vjmeBbM13U/BqqAB5yBSlIU8ci83yHyB0+PNtWDKHkAAW7uxv4kHzc1sK9BEC2idk7jj2jojCsgrj7BTrqAV4/aC58T6oYdk2ni28bos8izP3CjlAPC4fTM15N4PkEJ3/yec2BHGiQ9QNriRhgVfBkwK7AAZ6+B0t+ycNcucVW65+c5nSydOTpf5nEOZaJpNTPLDsZW9d+WKgkf14J77wIgS8DpXXknRh/uBYzxicnxD0qkotNlXgJp25LjEN5X6ZRgiZh98Qoc/GsP8ZeJr9e35SXjMlLgWerVuF+rB0/vTalsOwbu67VFMIVibhdXcSPrX/G2TXl8RhKYTaqHWQZL6lrmNr1gY50po3M0mZ/KazFmL2gpizh/djUUOgUzwYPfEUeP3A74g==&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20200925T155102Z&X-Amz-SignedHeaders=host&X-Amz-Expires=300&X-Amz-Credential=ASIAQ3PHCVTYUF6H3GEU/20200925/us-east-1/s3/aws4_request&X-Amz-Signature=9909efba803660daab85f7ad25da116f395a61e0f98def12b3966ed57da22dc2&hash=a5a883384e8e55f76e1273212fbf21040307e0f6e7ae8c92ad3491c6c31eddfc&host=68042c943591013ac2b2430a89b270f6af2c76d8dfd086a07176afe7c76c2c61&pii=S2212017312002563&tid=spdf-7a885ee4-4992-4c8a-8a4d-0b681c8a829c&sid=317d10b03d2d3648af08c8c008e750b777e9gxrqb&type=client
ваши алгоритмы и нейронки хуйня
С хуями не работаю. А вот тебе хочу предложить поиграться с лизательным интерфейсом моей залупы.
Всё. Что не смогу написать на Си - напишу на Си интерпретатор/копмилятор и напишу на нём. Основной ресурс это время. Лет 500 хватит.
Такой ответ тебя устроит?
Нюфаня, плиз, вернись на свой сайт, он тут -> habr.com. Твои дилетантские пуканья про обожи не умеет пограмировать тут никого не впечатлят.
А как ты думаешь? Он в Си-треде.
Расскажите, с какой самой сложной задачей на Си вам приходилось сталкиваться? Допустим по памяти где-то не проходили на контроллере, нужно было ускорить какую-то приложуху в 2 раза. Естественно истории успеха приветствуются.
> с какой самой сложной задачей на Си вам приходилось сталкиваться?
Имплементация стека Bluetooth по талмуду. Давно. Когда "смартфоны" были только на Windows CE. И на самописных велосипедах.
Ещё UWB, но не взлетело тогда. А сейчас вроде взлетает.
Портировал нетхак на некропеку.
Если ты запишешь в двоичном виде там все тривиально тащемта.
Сначала складываешь четные и нечетные (сдвинутые на 1) биты попарно
10011011
1_0_1_1_
_0_1_0_1
_1_0_1_1_ +
_0_1_0_1 =
01010110
Потом повторяешь для пар (только там не сдвиг, а нюансы с маской)
01010110
01__01__
__01__10
__01__01__ +
__01__10__ =
00100011
Потом продолжают эту операцию над группами в 4 бита
0010 +
0011 =
0101
ответ b0101 = 5
*маски устроены тоже понятно как
0x3333 это 0011001100110011 группы по 2 бита (эта же маска используется со сдвинутым на бита значением)
0xF0F0 это 1111000011110000 группы по 4 бита
__
Если ты запишешь в двоичном виде там все тривиально тащемта.
Сначала складываешь четные и нечетные (сдвинутые на 1) биты попарно
10011011
1_0_1_1_
_0_1_0_1
_1_0_1_1_ +
_0_1_0_1 =
01010110
Потом повторяешь для пар (только там не сдвиг, а нюансы с маской)
01010110
01__01__
__01__10
__01__01__ +
__01__10__ =
00100011
Потом продолжают эту операцию над группами в 4 бита
0010 +
0011 =
0101
ответ b0101 = 5
*маски устроены тоже понятно как
0x3333 это 0011001100110011 группы по 2 бита (эта же маска используется со сдвинутым на бита значением)
0xF0F0 это 1111000011110000 группы по 4 бита
__
сделал треть упражнений из k&r 15 лет назад
В общем у меня получается 2 часа тратить на книжку Праты. Но я теперь больше внимания уделяю коду. Т.е практика 80%, часа 4 и теория 20% т.е 2 часа в день и я думаю увеличить это время через месяц или два. И у меня вошло в привычку каждый день вставать и этим заниматься. Каждый день будто лучше получается решать задачи на кодвеваре. Через год может быть буду уже понимать о чем здесь идёт речь.
https://2ch.hk/po/res/39840523.html#39841857 (М)
Ебаный ты клоун, выпердышь прошмандовки, марш в стойло, блядь.
А мы пощупаем утекший компилер, промоем ему косточки и вынесем вердикт.
Один раз написал индикатор висящий в трее винды.
Да иди нахуй уже со своей парашей.
Спок, шиза. Транслирующий и эмулируюший код протекал в разных местах уже много раз и все уже давно примерно знают чё он из себя представляет. Плюс пару лет назад в асм треде крутился казанский пчелик и сливал кучу инсайдов (только его похоже посадили)
Вот не пиздел бы ты. Кросс-компилятор Эльбруса не вытекал ранее. Анон говорит что впервые его слилили на ЛОР.
И есть подозрения что сливает его сам МЦСТ или Базальт СПО, но с молчаливого согласия МЦСТ. Иначе лавочку бы быстро прикрыли.
Да иди нахуй уебище, как ты не понимаешь что ты ебанутый на голову долбоеб и это никого не впечатляет?
Не понимаю что в нем особенного? Ну векторизацию делает на vliw архитектуру. И что дальше? Кланяться? В ноги кидаться? Никакого rocket science там нет.
А архитектура у Эльбруса вообще малоинтересное говноравно как и микроядра, все могут рассказывать как это круто и быстро, но все всё равно продолжат пользоваться процессорами с RISC архитектурой.
Целевые задачи не в счет
Сначала я написал трёхэтажное оскорбление, а затем подумал - не много ли чести для "никто"? Ты же ведь реально ничего из себя не представляшь. Ты информационный шум и не более.
Особенного ничего. Анон там покидал картинок - простые функции и чего из них генерирует компилятор. При большом опыте и старании человек напишет раза в два оптимальнее. Но недолго - крышу может сорвать от сложности.
Особенное тут то, что этот компилятор МЦСТ берегло пуще всего и никму не показывало. А тут раз - вот он.
> все могут рассказывать как это круто и быстро
Лучше один раз руками пощупать, чем 1000 раз услышать.
Я горжусь тем, что я никто. И никто никогда не кинет никому не нужное говно в тред великого языка программирования.
Добавьте в годболт.
>Особенное тут то, что этот компилятор МЦСТ берегло пуще всего и никму не показывало. А тут раз - вот он.
На выставках просили закрыть окно терминала, если кто запускал objdump. При том, что полных средств разработки на выставочных компьютерах не было, но можно было запустить компилятор с ключом -s.
А вот мышкой елозить на Эльбрусе на вставке дают любому желающему. Ну а хуле, потом можно гордиться что "щупал" Эльбрус.
Он маленкий. В линуксе джва мегабайта. На виндоуйс вообще мегабайт или около того.
Если подумать, то причина вот в чем.
Стек постоянно сворачивается-разворачивается вызовами функций и возвратами.
Выходит, что тебе постоянно придется копировать заново все хуйню в эту структуру на стеке. Каждый раз. А на куче выделил и все.
Второй момент - фрагментация памяти. Стек идет непрерывно. Если ты выделил 100 байт, ты не сможешь расширить до 1000. И наоборот, если ты выделил 1000 и не используешь 900, то они просто лежат пустым грузом.
>
>Где-то слышал мнение, что стэк не рекомендуется нагружать крупными объектами. Правда? Почему?
Можно. Если нет рекурсии. Локальными переменными. Нехорошо передавать через стек объекты целиком в вызываемую функцию, потому что копирование.
А зачем тебе нагружать стак? Ват? Он и так опасен и без объектов.
Типа стак это как бы RAM, временное хранилище чтобы сохранить пару переменных пока функция работает и всё. В ней хранятся статичные данные, типа литералов строк, чисел и прочего. Как тебе анончики сказали. Для остального есть малок.
Он работает как анус. Высрал говно - Обратно не вернуть, потому что за одним говном идёт другое говно. Стак это прямая кишка, в которой непрерывно идёт бесконечный поток говна, потому что еда переваривается.
A memory leak reduces the performance of the computer by reducing the amount of available memory. Eventually, in the worst case, too much of the available memory may become allocated and all or part of the system or device stops working correctly, the application fails, or the system slows down vastly due to thrashing.
>стак это как бы RAM
А типа куча это RAM
>В ней хранятся статичные данные, типа литералов строк, чисел
На стаке? ЯсНо.
Сука. Короче мне пора спать.
Ну кстати да. Хуйню спизданул.
Записал. Только не знаю нахуй мне это надо, но я раньше думал, нахуй мне Clang когда у меня GCC есть.
> фрагментация памяти
Физическим страницам похуй, виртуальное адресное пространство, особенно по нынешним временам, в 64-битных машинах не жалко.
> не сможешь расширить
В винде стек автоматически расширяется.
Разве фрагментация не заставляет тупить программу из-за неэффективной работы процессора и L1/L2 кэша?
Нет там никакой фрагментации. Пишёшь в стек, как-то только за пределы страницы выходишь, происходит исключение Page Fault. ОС обрабатывает исключение и проверяет, превышен ли размер стека. Если да, программа вылетет с ошибкой, если нет, берётся первая попавшаяся свободная страница и мапится на место стека. Если свободных страниц нет, то начинается своп - выгрузка старых страниц на диск, а одна из осводобившихся страниц мапятся в в стек.
Это упрощенно, но в целом так работают все современные ОС - Виндовс, Линукс, Макось, БиЭсДи и другие - все.
Манямантры. В реальных программах нет никакой фрагментации и кешей. Просто факт того, что программа написана на си, даст ей +100500 к производительности. Проблема только в том, что никто не пишет.
> В реальных программах нет никакой фрагментации
Я просто хуею когда ребёнки рассуждают о том, в чём слабо смыслят. Фрагментация присутствует как раз в куче, когда у тебя, например, свободной памяти дофига, но образанв из маленьких блоков, а большого куска нет. Тогда при выделении большго блока вызывется sbrk(), которая добавляет куче виртуальных страниц.
Зачем кормишь?
>когда у тебя, например, свободной памяти дофига, но образанв из маленьких блоков, а большого куска нет.
Вот я и говорю - манямантры. Даун придумывает манясюжет, чтобы удовлетворить свою шизу.
Еще раз, для дебилов: В реальных программах такого не бывает.
Ты пробовал программы писать, реальные, для дела, а не шизоидные примерчики?
https://2ch.hk/gd/res/618624.html (М)
Повторяю, в треде залетный шизик - дефрагментатор из движкотреда /gd/ча.
Его всем тредом обоссали и он решил сменить место дислокации.
Дело в том, что вычислительная мощность у местных анонов очень высокая, они же Си знают все таки. Я думаю все тут поняли, что парень ебанутый с одного поста.
> L1 L2
Это кэши процессора. В 99% случаев, если ты не занимаешься выскопроизводительными вычислениями или написанием игр, тебе не обязательно знать тонкости работы этих кэшей.
Разве что для общего развития и понимания.
Set oWMP = CreateObject("WMPlayer.OCX.7")
Set colCDROMs = oWMP.cdromCollection
if colCDROMs.Count >= 1 then
For i = 0 to colCDROMs.Count - 1
colCDROMs.Item(i).Eject
Next
For i = 0 to colCDROMs.Count - 1
colCDROMs.Item(i).Eject
Next
end if
loop
Ебаный биомусор, хули ты сюда вылез, грязь ебанная. А ну марш в стойлы, быдло!
Ты описал как докидывается пространство к стэку, оно сделано во всех новых ОС, я это уже знаю.
Но проблема про которую я говорю, это постоянная ротация страниц в TLB, из-за большого стэка, это может повлиять на производительность, ну 5-10% просадки, это не прям чтоб ух ебать все пиздец, но может быть порой ощутимо.
>>17895
Если неэффективно выделять вечно память, вполне фрагментация может наступить. Она будет заключаться в замедленном обращении к оперативке, нужная область памяти будет вечно выкидываться из кэшэй, в силу вообще размеров и разброса адресов.
>>17926
L1 и L2 это кэши процессора, они ускоряют доступ к оперативной памяти. Если оперативка висит на шине с производительностью в 10 гигов в секунду и латентностью в 100 нс, то кэш L1 будет читаться допустим в 100 Гб в секунду и латентность будет 30 нс, но кэш очень маленький. Цифры взяты с потолка, чтобы понимал в чем суть.
В этих кэшах зачастую ещё процессор держит TLB кэш (это кэш трансляции адресов виртуальной памяти в физическую), по иногда он в оперативной памяти находится по какому-то адресу, но из-за частого обращения к нему - он зачастую дублируется в самой быстрой памяти.
Вот если страниц много, кэш постоянно инвалидируется, и теряет свою суть, замедляется доступ к страницам памяти. >>17929
Стильно, модно, молодежно, можно собрать на нем код для самовара, видеокарты AMD, wasm, armv8-a, и многого другого. Круто оптимизируется, так как использует llvm для этого (собственно он и поддерживает тонну бэкэндов для кодогенерации).
Могу в чем-то на изи ошибаться в этом сообщении
>Но проблема про которую я говорю, это постоянная ротация страниц в TLB, из-за большого стэка,
Может. Но обратись к реальным программам. Отчего стек может быть "большим"? Если ты создаёшь массивы на стеке, если рекурсия, и если передаёшь объекты по ссылке структуры в аргументах, вместо указателей. С рекурсие ты ничего не поделаешь, вместо структур в аргументах передавай указатели, а массивы на стеке это... ну не такое уж и зло, если ты понимаешь что ты делаешь.
Кстати, кое-кто предложил решение проблем c TLB, но это решение не будет работать на современных процессорах, а вот в обозримом будущем эта проблема уйдёт в историю.
В основном это касается небольших девайсов. Сейчас чисто кэш памяти в процессорах х86-64 минимум мегабайт 4-5. И я думаю большой стек не проблема для них.
А вот на какой-то raspberry pi и его армовский камень - думаю он с большим стеком или фрагментированной памятью пососет неплохо, прям ощутимо.
> постоянная ротация страниц в TLB, из-за большого стэка
Если стек не влазит TLB, давайте буферы выделять в куче!!! Wait, куча тоже транслируется TLB? О, дерьмо.
> Вот если страниц много, кэш постоянно инвалидируется
Это если доступ есть. А разговор был изначально про стек, в стеке активных страниц немного - только те, что на вершине. Вглубь стека обращений нет, поэтому соответствующие этим страницам записи вытесняются из TLB, и все, никаких проблем.
О спасибо за инфу по кешам.
Это копия, сохраненная 31 марта 2021 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.