Это копия, сохраненная 11 апреля 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 помогает читать сложные сишные декларации.
Прошлые треды:
- №61: https://arhivach.net/thread/610541/
- №62: https://arhivach.net/thread/616070/
- №63: https://arhivach.net/thread/623165/ >>1818156 (OP)
The C++ standard guarantees that it is legal to use a null pointer in a delete-expression (§8.5.2.5/2). However, it is unspecified whether this will call a deallocation function (operator delete or operator delete[]; §8.5.2.5/7, note).
If a default deallocation function (i.e. provided by the standard library) is called with a null pointer, then the call has no effect (§6.6.4.4.2/3).
Аналогично в С для вызовы free.
Не проверяй. Если ты не ембеде, то у тебя в системе всё равно memory-overcommit включён и NULL никогда (почти) не будет.
Я, оказывается, промахнулся тредом.
Сорян.
В любом случае, требования стандарта в этом плане одинаковые.
Исправляюсь.
Да.
Я только с беззнаковыми и работал.
Для знаковых надо определять возможность переполнения до сложения.
в интернете есть код проверки, возьми там
У тебя 0 может вылезти из-за фрагментации памяти. Поэтому все же надо бы придумать дефрагментатор оперативной памяти
Если ты точно уверен насчёт использования памяти своей программой - пиши свой аллокатор памяти на базе mmap и madvise.
> Поэтому все же надо бы придумать дефрагментатор оперативной памяти
Только через managed возможно. В противном случае невозможно. Да и не нужно, пока есть страничная организация памяти.
> Да и не нужно, пока есть страничная организация
Это 64 бита 48 бит хватит всем. А в 32-битных ОС есть проблема фрагментации адресного пространства, особенно со всеми этими рандомизациями.
Пойми простую вещь - дефрагментация кучи невозможна, поскольку "дефрагментатор" не имеет понятия об указателях на выделенную память. Двигать блоки в памяти не проблема, но нет средств чтобы сообщить об этом программе, которая запрашивала память. При любой попытке склеить свободные фрагменты в куче, указатели в программе сразу станут невалидны и всё рассыпется.
Если тебя так волнует проблема фрагментации, пиши свою обёртку над malloc и free и добавь абстракцию, которая из нескольких фрагментов будет эмулировать непрерывный блок памяти.
В Wolfenstein 3d была дефрагментация - у них было так что мог быть только один указатель на каждый блок памяти, указатель на этот указатель хранился в заголовке блока, соответственно дефрагментатор мог его обновить.
> Пойми простую вещь - дефрагментация кучи невозможна
Так я с этим и не спорю. Я сказал, что проблема фрагментации есть. Хотя если куски не очень большие, менеджер кучи использует всякие пулы для объектов примерно одного размера, и сильной фрагментации не возникает. Вот когда mmap() вручную, там да, там можно намапить так, что потом память есть, а адресов нет.
>>30828
В винде были Local/GlobalAlloc(), они возвращали хэндл, который программы и хранили вместо указателей. А для получения "реального" указателя требовалось сделать явный Lock(), который ставил блоку флаг, что на данные есть живые указатели. По Unlock() флаг убирался, и после этого система могла двигать блок как ей угодно безо всяких последствий (пользовательских указателей нет, внутренний указатель на блок в таблице хэндлов обновляла сама система). Сейчас апи остались (для совместимости), но ничего никуда уже не двигается, флаг стоит перманентно.
> лямбду калбэк поинтером в сишную библиотеку с выкидыванием прерывания
А в обычном си вообще есть ловушка исключений?
> лямбду калбэк поинтером в сишную библиотеку
Все таки оказалось что полноценно с видимостью переменных внутри текущей функции - нельзя, то есть использовать тут лямбды и смысла тогда нет.
Решение с Lock/Unlock мне нравится. В этом что-то есть.
Возьму на заметку.
И ещё аргумент Exclusive в функции Lock не помешает - если TRUE то критическую секцию включить, если FALSE то подсчёт ссылок.
В PalmOS что то подобное тоже было.
Не надо мне ничего сосать, я натурал
Это отчасти философский вопрос, или если угодно архитектурный - а что ты будешь делать, если переполнение произошло? Значит у тебя что то не то с данными, а значит надо было валидировать их заранее.
А так - логика простая.
Во-первых, переполнение будет только если знаки у обоих равны.
Во-вторых, в таком случае переполнение будет при условии a+b > LONG_MAX
Что можно переписать как a > LONG_MAX-b
(Переполниться это вычитание не может, т.к. a>0 и b>0, т.о. LONG_MAX-b >= 0)
Это для положительного случая, для отрицательного аналогично
Условие переполнения a+b < LONG_MIN
Переписывается как a < LONG_MIN-b
Пример на байтах
-101 + -100 < -128
-101 < -128 - -100 (== -128+100 == -28) переполнение есть
-101 + -10 > -128
-101 > -128 - -10 (== -128+10 == -118) не меньше, поэтому переполнения нет.
> а что ты будешь делать, если переполнение произошло
Трапать или пересчитывать результат в бигнумах.
> логика простая.
Решение правильное, но громоздкое. Где битовые хаки?
>или пересчитывать результат в бигнумах.
Так считай сразу в "бигнумах".
long long для кого придумали?
И трапы по моему тоже не работают в современных компиляторах.
Как вариант посмотреть в мануале проца наличие флагов для индикации переполенния при выволнении арифметических операций.
Знаковое переполнение это UB (по умолчанию по крайней мере), не получится ли так, что ты выполняешь сложение, потом асмом проверяешь флаг, а компилятор выкинул сложение из за UB и ты глотаешь воздух?
Если проверку делать через флаговый регистр, то и складывать лучше в асме, потому что тебе никто не гарантирует, что между выполнением арифместичекой операции в коде и проверкой в асме компилятор не вставит какую-нибудь операцию, которая сбросит этот флаг
Ты не прав. Складывать лучше всего в бинарном коде.
Сама задача про криптографию и электронную подпись.
Производительность при переписывания лоу-левел части кода (математика, бигнума) с асма на С упала в десять раз.
В некоторой степени (но не только) из-за невозможности нормально работать с флагами, переполнением, производить умножение uint64_t на uint64_t с получением 128-bit результата без интринсиков, етц.
Да хуй знает.
>при переписывания лоу-левел части кода (математика, бигнума) с асма на С упала в десять раз.
Цена за простоту кодирования и портабельность.
А зачем переписывал-то? Мог бы на каждую платформу заделать библиотеку на ассемблерне .
>А зачем переписывал-то?
На будущее не все платформы известны. Специализированную реализацию сделал очень быстрой, попросили к ней рядом добавить не специализированную, хоть и в ущерб производительности.
>Мог бы на каждую платформу заделать библиотеку на ассемблерне
Дальше если требования будут, то буду приделывать, да
>А если надо обнаружить переполнение 64-битного сложения?
Тебе тут уже ответов накидали на все случаи жизни, а ты всё горишь.
Владею нативным жс, там ботаны на ноде хуйни запилили по этой теме, но что-то мне подсказывает - это детский лепет по сравнению с си. Короче хочется более взрослого серьезного дерьма.
Спасибо
Ага
А что в робототехнике появилось прогрессивного с 1980 года? Там же количество логики на уровне бота для кс1.6, написанного школьником 15 лет назад.
https://pastebin.com/Qcc5QW5V
То ли я дебич конченый, то ли действительно пример корявый, но gcc выдает хуйню на пике, скобки по всякому ставил, что он от меня хочет?
>int caller ((int(*function), (int), int b);
У тебя здесь 4 открывающих скобки и 3 закрывающих. Так не бывает.
Сервоприводам и прочей поебени кекогерцы не нужны. В этом печаль робототехники - пока остальная индустрия уже general AI проектирует, в робототехнике все те же шаговики, никаких тебе наномышц и йоба-композитов.
Поэтому даже если у тебя в роботе будет нвидиа джетсон с бегающей на ней нейронкой, для кручения двигателями все равно будет достаточно той абстракции, которую предлагает сишка
Вряд ли. Пришли фотку книжки с этой строчкой
Самая первая скобка лишняя
int caller (параметры)
int caller (параметр1, параметр2)
int caller (параметр1, int b)
параметр1=int(*function)(int) - указатель на функцию под именем function которая принимает int и возвращает int
https://ideone.com/HAGtVb
Та вроде все работает, хотя и код странный, будто прошлись сканером по книжке, потом image to text(чем собственно и проебали все скобки, кое-где и лишние запятые есть), а потом переводили.
Этак говнина заработала, но сука, я опять наткнулся на ошибку в примере знак разыменования не с той стороны поставлен. Улетел в стратосферу с этого учебника, полет нормальный.
Как конверится пдф я не вкурсе, но разве артефакты на скане не должны остаться? Во всяком случае в других учебниках ctrl+c/v не прокатывало, текст с лишним мусором вставлялся
А зачем ты ставишь скобки в прототипах?
У тебя весь код по пизде написан. Учебник нормальный, просто ты не понимаешь, что делаешь.
>Учебник нормальный
Это тот, в котором скобки не парные?
Это тот, в котором автор не додумался сделать typedef указателя на функцию?
Нахуй такие учебники и их авторов.
Возьми нормальный учебник блеадь. Зачем тебе перевод? Я понял бы если бы ты читал какой нибудь учебник написанный русским автором.
Двачую.
Тем более, все равно английский придется изучать. Особенно, если хочешь получить адекватную работу.
А почему бы и нет? Заодно человек сможет написать дефрагментатор стека для нужд треда после таких онлайн курсов.
Синтаксические ошибки я пофиксил, с указателем в прототипе функции я затупил, и поставил лишнюю запятую. Но бля, как бывалый вкатывальщик (можете гнать ссаными тряпками, но учиться не возбраняется, НИ В ОДНОМ учебнике до этого, я не встречал таких грубых ошибок в пунктуации кода. Это же не задачник по багфиксам, тут базу по си дают, а тут эта срань.
Нахуй ты читаешь десятый учебник подряд? Прочитай K&R и пиздуй ебашить код
man free
UB, зависит от реализации
free можно вызывать только с NULL или с тем указатем, который ранее был получен с помощью malloc (и только единожды).
Всё остальное — UB.
дело такое: хочу перейти из сферы микроконтроллеров в что-нибудь более серьезное а ля системное программирование
Вопроса два: насколько это востребованно в Мск и какой бы проект в портфолио ебануть, чтобы заинтересовать работодателя?
Спасибо
> из сферы микроконтроллеров в что-нибудь более серьезное а ля системное программирование
Это не одно и то же?
Менеджер памяти хранит свои данные по отрицательному смещению от указателя. Если ты ему скормишь рандомное число, он по отрицательному смещению найдет мусор и корруптит тебе кучу, в лучшем случае программа упадет
Зависит от реализации. Причём не в ядре, а реализации malloc/free. В юниксах malloc изредка дёргаяет вызов sbrk().
Хотя вот была задача про прайм числа, я её решил с нуля. Оказалось просто. С помощью википедий.
Куда мне блять реальные если я не могу даже эти решить? Тем более, они прокачивают мозг и помогают понять язык. Проверено уже.
Тебя уже один раз нахуй послали, еще раз хочешь?
>Тем более, они прокачивают мозг
Дебилу прокачивать мозг вредно. Просто дебил это еще ничего, а вот с прокачанным мозгом получается активный агрессивный дебил, от которого куча вреда сраньем, и ИТТ тред тому уже демонстрация.
Математика прям жёстко в Си тебе не потребуется. Необходимо понимание основ и умение разобраться в математических моделях с интернета и закодить их.
Если ты смог решить задачу с простыми числами и закодить по описанию решето Эратосфена, то не все так плохо.
реально хороший кейс что ли? я думал, что сейчас буду советы а ля НАПИШИ СВОЙ ОС, НАПИШИ ВИРТУАЛ МАШИН и тд
я все равно не понял, pow должен значение i возвести в третью степень, потом это значение прибавить к z и все. Объясни пожалуйста, где я не прав и как это пофиксить
pow(i, 3); возведет в третью степень и отбросит результат, так как ты его никуда не запоминаешь
Надо запомнить результат в i обратно
не буду я ж все за тебя фиксить
Код не читай
@
Сразу отвечай
Где счётчик i увеличивается? Какое начальное значение? У тебя оно равно мусору со стека. Таки результат pow() лучше сразу плюсовать к z как-то так: z += pow(i,3);.
Лабораторку в универе делаешь?
а ты хочешь не только лабораторную обсудить?
Имел опыт помощи лабораторных, который сводился к таким подсказкам что не так. Закончилось плохо. Люди вроде и с мозгами нихуя не освоили, лучше сам изучай построчно свою программу и пытайся понять что ж не так, иначе результат будет хуёвыйне хочешь ведь быть неучем?
не ну понятно что сам питон в системном нахуй не нужен
ну кроме как разве всяких сборочных скриптов
меня в уныние вгонять 0.1 вакансия по системному проганью
все так плохо или не там ищу? (я не про embedded)
Для того, чтоб найти работу, достаточно удачно воспользоваться одной вакансией.
Чел, когда тебе дебилы будут отвечать неправильно на вопрос, ты тоже будешь агрессировать. Я не спрашивал про работу или нужно ли мне этим заниматься, просто долбоебы начали отвечать не в тему на те вопросы которые не спрашивали, из-за чего делается вывод что это какие то долбоебы. Я знаю что мне нужно и как мне это делать, вопрос был в другом. Но мани начали плакать мол, ууу он дегенерат решает че то там не зоробатывает деньги но я этого как бэ ни знаю уууу он плахой.
>>32622
Спасибо. Я кстати знаешь что заметил? Когда надо было закодить задачку с координатами, там понадобились знания икса и егрека. Тип расчитать расстояние которое нужно пройти за 10 минут и вернуться в точку из которой начал. Ты прав.
>>32959
Хуй будешь?
> вакансия по системному проганью
>все так плохо или не там ищу?
Настоящий embedded, тот, который не Ардуино, это и есть системное программирование.
Но если тебе интересуют ОС, то ищи вакансии в МЦСТ, Базальте или подобных компаниях.
Но в целом в России это глухая тема. Если шаришь, то можешь перекатиться в Юго-Восточную Азию. В Китае и Корее тебя примут. Можно и в Японию, но сложнее. Это надо быть известным специалистом.
Вакансий много чел, много. В моем городе хоть и платят мало, но имеются. Судя по всему там немного то и надо работать за сотку.
Двачую про Китай, там он будет миллионером рмбишным.
Без смс и регистрации!
грустно, очень грустно
не очень хочу из рашки переезжать. А так видел похожие вакансии только в Яндексе, Касперском и (внезапно для меня) Баду
И не такое аутсорсят
Отличная идея. А где можно инфу почитать?
И пропустить через 3 анальные корзины истины Сократа.
Анон прости меня за грубость. Я шизик просто у меня нервы иногда сдают.
есть ли какие-нибудь похожие опен сорс системы, которые менее популярны и обладают меньшим комьюнити разрабов, но в которые ниже порог входа? Конечно круто, если это также системщина, но мб есть что-то иное интересное, где также было бы круто поучаствовать
Спасибо
Соси писос
Хуй будешь?
Все б хотели такой проект. Но их мало. Ищи по гитхабу рандомную ос или ядро на си.
И ссы на ебало любителям микроядер L4, они выблядки говноедских хуесосок.
https://pastebin.com/FMV0xt8b
Компилируется без проблем, но при любом раскладе флаг вернет 1 , что за хрень
Почему бафомёт на маскоте ГНУ?
isdigit() return Value
A value different from zero (i.e., true) if indeed c is a decimal digit. Zero (i.e., false) otherwise.
for(i; i<6; i++) => for(i=0; i<6; i++)
Прошу оценить и поставить звездочку указать на проблемы:
https://github.com/texhnolyzze/buddy
Думаю без CLion-а я бы еще долго над этим просидел (пиздец сколько до меня допирало, что void x -- это указатель на массив указателей).
Блин, после веба это прям глоток свежего воздуха лол.
Короче, хочу вкатиться в сишку, так как веб заебал и бизнес-логика заебала. Хочу программировать микроволновки и газовые котлы. Чтоб было ощущение, что занимаешься чем - то значимым. В общем нужен совет как найти работу C-программером, какой проект сделать и тд. Спасибо за внимание
Блин, звездочки пропали, имелось ввиду void ∗∗x
положи в репозиторий README.MD
и исходник сравнения скорости твоего менеджера памяти с либсишным.
реквестую вопрос еще раз, сорян
Хочу вот начать контрибьютить в линукс кернел, но понимаю, что уровень пока не дотягивает
есть ли какие-нибудь похожие опен сорс системы, которые менее популярны и обладают меньшим комьюнити разрабов, но в которые ниже порог входа? Конечно круто, если это также системщина, но мб есть что-то иное интересное, где также было бы круто поучаствовать
Спасибо
бля респект за переход
расскажи немного плз - у меня просто такая же тема: прогал на си - ушел в геймдев - хочу обратно,но ссу, что не возьмут
на чем писал? по чем осваиваешь си? какие планы?
Хуй будешь?
И я б хотел такой проект, если найдешь - кидай сюда, всем /pr/ будем контрибьютить.
Главное чтоб не микроядро.
Интересная техника аллокатора.
Было бы здорово, если бы он был сделан lockfree для МТ приложений, не использовать calloccalloc хорош, просто было бы круто не юзать вообще левые аллокаторы памяти, ну и сделать свои malloc/realloc/calloc/free.
Ну и тест производительности с glibcшным аллокатором было бы интересно глянуть.
Подобный подход buddy memory allocator использует jemalloc, он lockfreeв дебри не лез, но работает будто без мьютексов написан и умеет по аренам память выделять, очень быстрый, дефолтный аллокатор в freebsd. Прикольно было бы и с ним сравнить.
А я уже другой хуесос.
Хуй будешь? Будешь у меня сосать? А я тебе за это крутой проект скину. На си. С микроядром и windows/visual studio.
Не пали гондоту быдлу.
Давно оно проще Linux?
Есть идеи как можно это сделать не используя сортинг? А ли к черту?
Сделай за прохода для начала. Первый проход это поиск наименьшего. Второй проход - поиск наименьше, которое больше заданного числа. На этом этапе ты увидишь как свернуть поиск в один цикл.
Из практической точки зрения сортингом будет лучше думаю, но ограничить при этом до двух итераций функцию сорта. Ибо лучший Варик с одним циклом это зачизить два начальных значения до максимальных по типу возврата и потом уже сравнивать, что не есть канон. Но это тем не менее хороший пазл.
if(length == 2) return arr[0] + arr[1];
int min_a = max(arr[0], arr[1]);
int min_b = min(arr[0], arr[1]);
for(int i = 2; i < length; ++i) {
if(arr < min_a) {
min_b = min_a;
min_a = arr;
}
return min_a + min_b;
}
И почему не бабахает?
проверь что возвращает raise(babah);
The signals SIGKILL and SIGSTOP cannot be caught or ignored.
RETURN VALUE
signal() returns the previous value of the signal handler, or SIG_ERR
on error. In the event of an error, errno is set to indicate the
cause.
ERRORS
EINVAL signum is invalid.
https://man7.org/linux/man-pages/man7/signal.7.html
Судя по мануалу по 0 индексу нету никакого сигнала. И отловить соответственно его никак нельзя судя по всему. Вполне вероятно на других posix системах так же
Из двух аргументов.
Больно читать твои вопросы. Потому что нет понимания у тебя.
Макросы min и max это просто подстановки проверки на меньшее или большее число. Они сравнивают два простых значния.
Иди наверное в тред С++, там есть шаблоны min и max для массивов. В Си тебе придётся писать цикл, пробегающий по всем элементам масссива и сравниваюший каждый элемент с найденным наименьшим.
> Си тебе придётся писать цикл, пробегающий по всем элементам масссива и сравниваюший каждый элемент с найденным наименьшим.
Я об этом изначально подумал. А макросыч не понимаю всё равно, не дорос. Ну чуть-чуть, т.е это как шорткат, чтобы постоянно не писать if else?
Макросы обрабатываются препроцессором и в компилятор попадают уже в виде Си кода. Во многих случая это даёт оптимизацию на этапе препроцессора. И повышает читабельность кода.
В макросы можно помещать разные вещи, не только проверку.
Я еще до макросов не дошел. Я рак. По Прате на 12 главе малоки ток начал изучать.
Сука, как же я ору с дефрагментации стека. Каждый раз вижу и не могу сдержать ржекич.
А что смешного? Вполне серьезная идея. Возьму и напишу для ядра Линукс патч с дефрагментацией стека. Буду под виртуальными страницами стека физические дефрагментировать.
А heap, это типа "кучка" из динамически выделенной памяти с помощью малоков и т.д ? Там нет порядка получается или как?
Далее есть еще литералы (строки присваемые) и статические переменные которым память выделяет сам компилятор?
Прата нормально объяснит далее по книжке, или покурить надо по теме материала?
До этого места не дошёл, но думаю что то типа зависит от конкретной реализации.
Не подскажешь, почему называется кучкой? Потому что адреса кучкуются? Или как? Я почитаю по теме, но любая помощь будет драгоценна. Плиз
> Короче, стак это место куда программа складывает автоматические классы хранилища, да? Входим в блок функций, или лупа, создаем авто переменную и она складывается на стак, потом выходим из блока и эта переменная исчезает, если мы не объявим её статической?
Если судить про язык Си, то на всё воля божья
> А heap, это типа "кучка" из динамически выделенной памяти с помощью малоков и т.д ? Там нет порядка получается или как?
В языке Си на подобное воля божья
> Далее есть еще литералы (строки присваемые) и статические переменные которым память выделяет сам компилятор?
И на это воля божья
> Прата нормально объяснит далее по книжке, или покурить надо по теме материала?
Да, но не может быть неправ, ведь на всё воля божья
Нет, ты должен дефрагментировать стек как он есть. Например, бесконечно рекурсирующая пара функций должна работать в конечном объеме. Эту задачу уже решили для Чикена и нормальных Прологов, так что вперёд.
Пришлось погуглить термины.
чёт я тебя не понимаю.
в схеме(в чикене, например) бесконечная рекурсия решается оч просто. У тебя каждый вызов функции создаёт новый энвайронмент (сопоставление символов реальным объектам), фика в том, что энвайронмент тоже нормальный объект (только тебе недоступный), потому. он может быть спокойно сожран обычным сборщиком суора. такие дела. никакой специальной дефрагментации стека не нужно.
Ты хочешь сказать, их сборщик мусора не дефрагментирует стек?
А не слишком ли много ты на себя берешь? Мертвые объекты - дырки на стеке. Между ними живые фрагменты.
Ох, двачую, анон.
Формошлеплю, а хочу ковырять железяки на Си. Ну, я рад, что не один такой, хех :)
с меня как обычно <3
Ты же понимаешь, что такая книжка - это не трудный путь, а очередное инфоцыганство? Что мешает тебе поставить Бсд с исходниками и ПОГРУЗИТЬСЯ В ЯЗЫК С ГОЛОВОЙ?
Я кстати дошел до фрагментаций, но не могу её понять щас.
>>36487
libgen.is
>>36502
Ой да ну
>>34062
Я щас параллельно изучаю Си с Пыхой. У меня нет денег на существование, а Си вакансию без образования я врятли найду, хотя попытаюсь, в треде отпишусь об успехах, до чего доведёт самообразование по Прате, Кернигану и куче книг по Си, алсо плюсах.
Думаю фрилансить делая людям форумы, сайты, магазины и параллельно заниматься тем, что люблю больше всего, Сишечкой.
> Не подскажешь, почему называется кучкой?
Потому что так перевели слово heap
А за "почему обозвали словом heap" так и за прочими похожими вопросами ща спалю годноту действенную методу.
Когда ты встречаешь английское слово и чувствуешь что вокруг него прямо таки вьются всякие контекстные мемасы и аллегории и что ты не догоняешь прикола, то заходишь в гугл, набираешь там это слово и, ВНИМАНИЕ, тыкаешь на вкладку картинки, после чего вдумчиво скроллишь увиденное.
В 70% случаев из 100 ты таким макаром увидишь подтекст того или иного слова как его воспринимает загадочная англосаксонская душа.
Второй способ (постоянное общение с носителями языкаи и перестройка внутреннего диалога на иностранный язык) более действенный - но требует заводить трактор и съебывать.
Типа того. Вроде компилятор защитит меня от этого, верно? И утечки памяти не опасны на нубном уровне да? Я справшиваю в общем, я рак и мне нужно знать, смогу ли я случайно направив не туда указатель, или использовать малок, сломать систему?
>>36678
>Потому что так перевели слово heap
Это я перевел. Мог бы и догадаться. Алсо можешь идти нахуй я понял что ты несущественную хуйню несешь.
Потому что данные лежат неупорядоченные как куча говна, в отличие от статически размеченной памяти и стэка.
>дырки на стеке
Вот смотри, шиз, ты сейчас делаешь классическую ошибку гондоти из треда откуда ты сюда съебал и где тебя уже обоссали.
Обосравшись на ровном месте.
Дырок на стеке не бывает по определению, этого самого стека - у него как у структуры данных добавлять и убирать можно только с конца, причем с одного.
И вот по причине этой промашки тебе в место красивой, пусть даже жирной, демагогии придется начинать демедж-контрол путем врубания тупого гондоти.
Это понятно, а от кого сам термин пошёл. кто первый его употребил.
>Дырок на стеке не бывает по определению
Двачую. Я сначала подумал, что он имеет ввиду динамическую память.
У тебя Прата нормальный скан? Счас до 6ой главы дошёл глаза потекли, так херово видно.
Вот такой
Это залетный мамкин тралль из /gd/, там он в треде движкосрачей урину ловил, вот теперь и сюда перебрался.
>Дырок на стеке не бывает по определению,
Смотря что считать дыркой.
Например, если выделить достаточно большой массив на стеке и ни разу к нему не обратиться. Ни чтением, ни записью В таком случае несколько страниц памяти не будут замаплены в стек.
При условии что компилятор не оптимизирует неиспользуемый массив.
Ну это так, к слову. На самом деле я не понимаю что там надо оптимизировать и отношусь к этим предложениям как троллингу.
>Например, если выделить достаточно большой массив на стеке и ни разу к нему не обратиться
>По улице идет старенькая бабушка (Б), рядом проходит пионер (П), подтянутый, бодрый, с барабаном. Бабушка громко чихает.
>П: - Будьте здоровы!
>Б: - Да, внучек, я здорова. А чихаю потому, что табачек нюхаю.
>П: - По мне, бабушка, Вы хоть хуй нюхайте, а пионер должен быть вежливым!
А никого не ебет что ты его не используешь - раз ты его выделил значит обязан лежать по условию контракта этой структуры данных, в противном случае контракт будет нарушен и стек перестанет считаться стеком.
Вот, кстати, почему когда процессорам придумали виртуальную память, то аппаратную трансляцию и таблицу страниц им сделали, а дефрагментацию аппаратную нет, хотя уже в 70х и 80х были такие технологии и даже специальные процессоры-ускорители на них основанные.
https://en.wikipedia.org/wiki/Intel_8237
Причем проблема эта действительно есть, именно из-за неё в AMD64 и позже в ARM появилась концепция больших страниц в 1GB, как раз для нивелирования фрагментации в тех случаях, когда традиционные мелкие странички засирали память.
На работе 99% задач это бойлерплейт и типовая рутина, только и всего.
А задачки нужны что бы искусственно раздувать конкурс для кандидатов.
Ну понятно что олимпиады ниочем. Но это тоже самое что и знать математику, она не нужна вообще, как Линус Торвальдс говорит, но бэкграунд который она дает, развивает мышление, это имеет пользу.
Математика не нужна ровно до тех пор когда она нужна.
Потом резко начинаются изобретения неэффективных велосипедов.
То же самое и с паттернами программирования и алгоритмами тащемта.
То есть ты за программные задачки для развития мышления?
Не дырки, а отверстия.
Так один хуй оба шизы.
Айда к нам в тред, кста, там у нас сейчас гондотя интерполятор, графики интерполирует, доказывает что дроуколы ничего не стоят.
>случайно направив не туда указатель, или использовать малок, сломать систему?
Нет. Но теоретически, если компилятор будет таким образом интрпретировать UB, то это не будет противоречить стандарту.
Можно поныть?
Хочу вкатиться к вам, но думаю что шансы у меня почти нулевые, а раньше были амбиции игры создавать, даже идеи были. А щас не знаю, если буду создавать игры это сложно. Пытался в сурсе ковыряться но плюсов не знаю и ООП. А на их изучение уйдет наверное еще год минимум. А деньги зарабатывать надо, планирую в Laravel вкатываться и пыху.
У нас никаких игорь писать не нужно, у нас можно хвастаться вымышленными играми, можнотак же играть за годотю, тогда высасываешь из пальца аргументы, а когда всем тредом обоссут, то говоришь что это был не годотя а его подражатель.
> И утечки памяти не опасны на нубном уровне да
Да. Вот будешь драйвера писать - там опасно, спектр эффектов очень широкий, и бсодами не ограничивается. А в юзермоде ничего не сломаешь. Ну разве что, если ты написал программу для удаления да или просто записи файлов, и у тебя UB, ты можешь случайно удалить/перезаписать не тот файл, с каким-нибудь похожим названием. Но ничего нелогичного не произойдет.
>игры на чистом Си? нахуя?
Действительно.
https://www.youtube.com/watch?v=1adapsraGTY
https://www.youtube.com/watch?v=T9Yb4-mNjvM&list=PL_zCHIGF5VNPmRCd7LZu5MqXdrDXzoRHh
я хочу что бы мне объяснили как для дебила ^^
ну и чего ты мне этим говно мамонта тычишь? не нашел игр на ассемблере?
... Единственная причина писать на C вместо C++ это если нужно написать библиотеку, доступную из чего угодно, все остальные причины это хипстерское кривляние а ля Линусовское "C++ превращает любого человека в индуса!".
> Что значит хуже? Больше буковок набирать? Больше шансов багу словить?
И то и другое и еще меньше шансов разобраться в собственном коде через пол-года, не говоря уж о том, чтобы кто-то другой разбирался.
... Давай по существу выступать, что такого можно написать на современном С, что не будет современным С++ или нельзя сделать современным С++ с минимальными изменениями? Вот чего можно сделать на современном С++ и нельзя на современном С: дефолтные аргументы, дефолтная инициализация, нэймспейсы, генерик функции, метапрограммирование. Это что было в, например, языке Лисп 1958го года и нет в современном С. И никто не заставляет тебя в С++ писать паттерны из книги четырех придурков и вызывать библиотеку, клянусь.
https://kunaifusu.livejournal.com/467799.html
.... Стотья и каменты в хакерньюз доставляют.
Пока Кармаковские кракозябры (это кодом назвать сложно, разве что в смысле "код Да Винчи") продаются и вызывают ахи и вздохи хипстеров я на хлебушек смогу заработать.
... Кармака пинать не надо. Сделать то, что он, даже умея программировать, это охуенно. Кармак же, со своим программированием на уровне шестиклассника, просто гений
.... Там куча проблем с перформансом и с логикой ...
https://kunaifusu.livejournal.com/210876.html
... все что он сказал из критики ПС3 было "может быть в этом поколении хбокс и не сольет", от человека, предсказавшего победу PowerVR над GeForce, такие заявы вообще мало чего стоят. Вот ежели бы он хоть одну консольную игрушку с тиражом хотя бы миллион сделал тогда может быть это можно было воспринимать как плохой прогноз для ПС3, а пока что - писишник о чем-то своем, писишном...
https://kunaifusu.livejournal.com/488092.html
... Как бы мы не смеялись над его кодом и "продвинутыми" алгоритмами ...
... Единственная причина писать на C вместо C++ это если нужно написать библиотеку, доступную из чего угодно, все остальные причины это хипстерское кривляние а ля Линусовское "C++ превращает любого человека в индуса!".
> Что значит хуже? Больше буковок набирать? Больше шансов багу словить?
И то и другое и еще меньше шансов разобраться в собственном коде через пол-года, не говоря уж о том, чтобы кто-то другой разбирался.
... Давай по существу выступать, что такого можно написать на современном С, что не будет современным С++ или нельзя сделать современным С++ с минимальными изменениями? Вот чего можно сделать на современном С++ и нельзя на современном С: дефолтные аргументы, дефолтная инициализация, нэймспейсы, генерик функции, метапрограммирование. Это что было в, например, языке Лисп 1958го года и нет в современном С. И никто не заставляет тебя в С++ писать паттерны из книги четырех придурков и вызывать библиотеку, клянусь.
https://kunaifusu.livejournal.com/467799.html
.... Стотья и каменты в хакерньюз доставляют.
Пока Кармаковские кракозябры (это кодом назвать сложно, разве что в смысле "код Да Винчи") продаются и вызывают ахи и вздохи хипстеров я на хлебушек смогу заработать.
... Кармака пинать не надо. Сделать то, что он, даже умея программировать, это охуенно. Кармак же, со своим программированием на уровне шестиклассника, просто гений
.... Там куча проблем с перформансом и с логикой ...
https://kunaifusu.livejournal.com/210876.html
... все что он сказал из критики ПС3 было "может быть в этом поколении хбокс и не сольет", от человека, предсказавшего победу PowerVR над GeForce, такие заявы вообще мало чего стоят. Вот ежели бы он хоть одну консольную игрушку с тиражом хотя бы миллион сделал тогда может быть это можно было воспринимать как плохой прогноз для ПС3, а пока что - писишник о чем-то своем, писишном...
https://kunaifusu.livejournal.com/488092.html
... Как бы мы не смеялись над его кодом и "продвинутыми" алгоритмами ...
микрочелика обоссали в С++ треде, он пошел в С тред срать. Необучаемый.
Весь рот в говне от вашего Zig. C код глазу всяко приятнее чем это ваше нинужно.
Да необязательно на Си, можно и на плюсах. Просто на их изучение уйдет уйма времени. Хотя интересно было бы. У меня лежит пратовская книжка по плюсам, там под 1к страниц.
Не выдавай свои маняфантазии за реальность.
Был бы Zig приятным и самое главное полезным в реальной жизни - был бы у него отдельный тред в /pr/, и думаю комьюнити побольше чем 1.5 дебила.
Т.е если я на сишке писать умею, то с плюсами тогда вообще проблем не будет и я быстро схвачу?
То есть ты не можешь оценить няшность синтаксиса сам, без чьего то мнения, если кто то не создал тредик на дваче?
Постепенно схватишь.
Концепция классов довольно проста. Когда осознаешь, всё на классах будешь делать, даже там где это ненужно и вредно. Затем придёт понимание когда они нужны, а когда нет. И тогда постепенно остальное изучишь.
Дело в том что у меня программа на Qt а библиотеки сторонние на си, собранные их стандартными опциями компиляции. Хочу чтоб просто при компиляции qt/qmake их всасывало в бинарник программы но как то не совсем понимаю как это сделать
LIBS += -L/путь/до/либы/ -lname
Это я так понимаю оно просто внешние библиотеки линкует, естественно статические так не пашут.
Помохите уже въебал с горя нахуй
нет ну плюсы это другое дело, там и привет от анриал и пр
но чистые Си в играх - это уже архаизьмь
>статические либы в бинарник при компиляции
cc -o yourprog yourprog.c libstatic.a
cc -o yourprog yourprog.c -lstatic
LIBS += -L/путь/до/либы/ -lyoba
Если по пути L есть либа libyoba.a
Дада, помню как этот мудак обосрался с железом каррентгена соснулей.
CPU БОЛЬШЕ НИНУЖЕН ЯСКОЗАЛ ВИДИТЕ БУДУЩЕЕ ЗА GPU, CPU ЭТО ПРОСТО ТАКОЙ СТАРТЕР ОТ МАШИНЫ УЖЕ НИКОМУ НЕ ВАЖНО НАСКОЛЬКО ОН МОЩНЫЙ
В итоге консоли, как это и ожидалось, сели на бутылку своих говноплатшетных процессоров, растеряв весь свой потанцевал.
http://talonbrave.info/files/software/games/unreal/source/
>консоли сели на бутылку своих говноплатшетных процессоров
Почему не на бутылку говнопланшетных видеочипов? Ведь именно на неё приставки и сели, а ЦПУ и правда не нужен, имеющегося ноутбучного хватит.
Ядро Jaguar на 1.6 ГГц в консолях - это что-то примерно как Athlon 64 3200+ (2.0 ГГц) из 2005, который у меня был? Ну и что принципиально изменилось в игровой логике со времен Far Cry 1 (раз уж берем условный "опенворлд"), который на нем летал в 100+ ФПС? Да, конечно же, объектов больше, но и ядер теперь шесть (из доступных). Вон, есть тесты двухсокетного Pentium III в Crysis 1 на Youtube. Там было что-то вроде 15-30 ФПС.
> Ядро Jaguar на 1.6 ГГц в консолях - это что-то примерно как Athlon 64 3200+ (2.0 ГГц) из 2005, который у меня был?
Нет. Jaguar это что-то типо атлонов А4/А6 годов 2013-2014.
> Ну и что принципиально изменилось в игровой логике со времен Far Cry 1 (раз уж берем условный "опенворлд"), который на нем летал в 100+ ФПС?
Чем больше объектов тебе надо рендерить - тем больше тебе надо в очереди видеоускорителя напихать задач для карточки, плюс симуляция становится сложнее, систем симуляции в игре больше.
>Да, конечно же, объектов больше, но и ядер теперь шесть (из доступных). Вон, есть тесты двухсокетного Pentium III в Crysis 1 на Youtube. Там было что-то вроде 15-30 ФПС.
Смешно, но Интел на базе архитектуры Pentium III делала архитектуру Core 2(пентиумы 4 дропнули отчасти). Она таки у них была пиздецки удачной и с большим запасом на вырост, и буст производительности.
спрашиваю именно в этом треде, тк я тут за все время одного-двух шизов увидел, остальные адекватные ребята
Рекомендую попросить отпуск. Лечится только так. В крайнем случае, попробуй сменить рабочее место, имею в виду передвинуть мебель в другое место или поменяться с кем-то, если в офисе сидишь. Это поможет на 2-3 дня.
Ничего не путаю. Pentium 4 поняли что хуйня с кукурузными частотами, и новые камни в 2006 делались на базе более старой архитектуры, которая использовалась в мобильных процессорах. Из пня 4 насколько знаю забрали только самые удачные идеи, одна из них это HT.
Архитектура к слову до сих пор усовершенствуется у Интела. В лице всех этих Cascade Lake, Coffee Lake и прочего.
>тк я тут за все время одного-двух шизов увидел,
А тебе не приходило в голову что "шиза" это следствие выгорания?
>остальные адекватные ребята
Да, мы такие ;-)
Все инцеловские ядра, за исключением р4 и атома, микроархитектурно являются развитием пняПро 92-го года. Поговорите мне тут о прогрессе.
>дефолтные аргументы
Есть с COM
>дефолтная инициализация
Специфика сишных примитивов и отсутствия ООП оверхеда мешает
>неймспейсы
Неймспейсы есть везде, нету пользовательских неймспейсов
>дженерики
Завезли ещё в бородатом с11
>метапрограммирование
Пчел метапрограммирование это не какой-то товарный знак, ты можешь на чем угодно писать в стиле метапрограммирования. Нет никакого правила что мол тру метапрограммирование эт ток в рантайме. Мб пояснишь как же сишка мешает тебе в этом. Да, нету сахарка и конкатенации строк изкаропки и чё?
Ты говоришь с пастой
>>> А тебе не приходило в голову что "шиза" это следствие выгорания?
да я любя же, все ведь одним делом занимаемся
Это как ядро Линукс, монолит из начала 90х, в 2005 кажись последний раз с нуля переписывали. Юзают и пилят до 2020 года, и конца и края не видно. Уж слишком много сил было вложено, быстро работает и в какой-то мере все очень даже удачно как для монолита спроектировано.
Можете описать в общих чертах идею/алгоритм? У меня нихера не выходит
проебались звездочки, офк перед s одна звездочка, перед words 3
Распиши по шагам. Пиши в тетради в клетку. Смотришь - ага вот у меня указатель дошел до пробела, в этот момент я должен выделить память, для этого мне надо запоминать начало слова пока еще не было пробела, значит надо второй указатель. Так, а размер слова это расстояние между этими указателями. Так, теперь надо добавлять слово в массив. Но его размер ты заранее не знаешь, так что либо в 2 прохода сначала узнать сколько слов, либо каждый раз выделять на n+1 элементов и копировать старые.
Найс углы, чел.
Есть 2 кода:
1) https://wandbox.org/permlink/YanLdqAjqQksxn2l
Работает, только если размер массива 1, 2, 3 или 5. Иначе до функции "out" сам массив не доходит по какой-то причине и не выводится корректно в функции "out".
2) https://wandbox.org/permlink/9gZDuBHw3gOqZ5UI
Работает с любым размером.
Поэтому в этом и вопрос. Почему первый код работает только при определенных размерах? Какая вообще свзязь с размером массива там может быть?
Если там ошибка, то какая и почему все же иногда это может работать?
Два кода отличаются лишь 1 стокой. В 1 я вызываю функцию "out" в функции "create" сразу после "fill". А во втором коде "out" вызываю в конце функции "fill".
разбей задачу на подзадачи
сделай динамический массив
сделай динамическую строку
те которые автоматически увеличивают свой размер
а потом уже пиши свою фунцию сплит, которая использует две первых
шину fsb поменяли на кольцо в сендике
это только один пример, но который рушит твое категоричное утверждение
вернемся к исходному
ты утверждал что на третьем пне была уже core2
мне кажеться, это не правда
Core2 и дальше - наследник P6
Еще были отдельные netburst и atom
вроде так
на вики почитал
еще p6 начался с pentium pro
Пентиумы-хуентиумы.
8086 - RuleZ 4ever.
Где я это утверждал?
Я утверждал что P6 архитектура с 3 пня была была весьма удачной, настолько что ее положили в основу более новой, прям которая пошла через поколение после.
>8086
Не нужны эти ваши микроподелки.
Только миникомпьютеры из 70х, только хардкор.
Слабо написать программу в эмуляторе pdp11 на си, скомпилировать и скинуть сюда результат работы?
Поздравляю, ты разъебал стек. Если меняешь порядок функции - ты просто обходишь эту проблему. Вероятнее всего ты перезаписал значение аргумента функции.
Там есть строчка в коде
>array = &A[array_size];
Нахера это написано? Собственно оно и вызывает это все говно.
Я еще пробовал через malloc создавать массив. Так работает даже при первом коде.
Но я так и не понял, в чем беда изначального кода и что именно лучше не делать...
Когда размер массива не известен, то всегда динамический массив надо брать же?
Я с Си знаком всего полтора месяца, а с массивами еще меньше, поэтому такие вопросы и задаю...
>Но я так и не понял, в чем беда изначального кода и что именно лучше не делать...
Тебе дали проблемную строчку.
1. Погугли как брать адрес массива.
2. Подумай.
3. Сообрази, адрес чего ты на самом деле взял и куда пишешь свои числа.
>но Интел на базе архитектуры Pentium III делала архитектуру Core 2
формально это не так
не на базе
"на базе" была последняя итерация p6 - Core
а Core 2 наследник p6, а не на базе
Ты взял указатель за пределами массива, на последний элемент. После пары вызова fill ты начинаешь писать рандомные числа в стек фрейм вышестоящей функции, где у тебя выделены все массивы, array_size и прочее.
Если хочешь передать адрес начала массива - просто используй его имя(его идентификатор уже является указателем):
> array = A;
И все заработает как следует.
Это я уже понял.
Но почему тогда оно может работать, когда размер массива 1, 2, 3 или 5? С такой ошибкой вовсе всегда не должно было работать ведь.
Но стек то имеется, и программе пофигу куда что писать. Управляешь всем ты. Логика компилятора - если ты это написал, значит зачем-то это нужно.
По сути у тебя последний элемент твоего массива А переписывает значение размера массива для последней функции в стек фрейме. Попадание в четные числа явно связано с какой-то оптимизацией, например использовался битовый сдвиг для взятия адреса &A[array_size];
Чисто предполагаю. Надо в код смотреть под микроскопом в godbolt.
А то.
Кстати, int A[array_size], где array_size не константа(в твоем случае вводится с клавиатуры) это расширение gcc, на каком-то msvc компилироваться не будет.
Хорошо, спасибо за помощь.
Если тебе на самом деле интересно, то запускай отладчик и смотри ассемблерные инструкции. Это путь в реверс.
В его случае был С89, так что - я все верно сказал.
lol
на вики написано:
"Микроархитектура Intel Core проектирована с нуля, но по философии микроархитектуры Pentium M"
но следует учитывать что
"Микроархитектура Intel Core основана на обновлённой версии ядра Yonah и может рассматриваться в качестве последней итерации микроархитектуры Intel P6"
там без тебя куча корпораций контрибютят) максимум драйвер для чегото можешь законтрибютить ,если его еще не существует там
>Слабо написать программу в эмуляторе pdp11 на си, скомпилировать и скинуть сюда результат работы?
Нет, конечно, не слабо. Но не интересно, если писал на листке инструкции PDP11, а затем проверял их на БК-0010Ш
> но по философии
Так, падажжите, не надо размывать своей гуманитарщиной технический вопрос. Не по философии, а развивая. С нуля вряд ли серьезные люди проектируют что-то серьезное.
Это не совсем так. Можно убедиться, что кода для SPU немало (вплоть до чего-то вроде волос и одежды IIRC). Во-вторых, посмотреть на то, что реально зашипили в любом случае интересно.
Интереснее бы было поздний тайтлы посмотреть, где GPU рисует только GBuffer, а весь deferred shading сделан на CPU + посмотреть ранние идеи ECS вроде тех, которые упомянуты в постмортеме-презенташке нотидогов про дрейкфекйс 2.
Аноны, хуяру код под МК на C. И хотел бы повысить свои навыки путем чтения исходников других проектов. Может быть, у вас найдется для меня какой-то совет?
Работаю уже в embedded порядка 8 лет, и ни разу ни одну книжку целиком не прочитал. Все изучал по крупицам и из разных источников.
Тоже восторгаюсь теми кто может прочитать эти большие рукописи.
Двачую этого
Годные книжки это
W. Richard Stevens - Advanced Programming in the Unix Environment
Kyle Loudon - Mastering algorithms with C
А потом после таких кулибиных-левшей самолеты падают и котлы взрываются. Но ведь это так сложно просто взять и обучться.
При выполнении упражнения, хочу считать из файла две строки символов. При выводе на консоль, вместо строки выводится мусор - очевидно, что путаюсь где-то с указателями, но что не так понять не могу.
https://pastebin.com/S04i0XYz
>rmvstr
На, ты потерял: e o e i
>malloc(sizeof(char))
Ну и сколько по твоему памяти ты запросил?
>Ну и сколько по твоему памяти ты запросил?
На один символ, пока длина строки неизвестна. Дальше при считывании каждого следующего символа и под него запрашиваю.
s1 = realloc (s1, (len[0]) * sizeof (char));
Видимо, проблема в этой строке - всё ломается при достижении строкой длины 16+ символов. Осталось понять что её так ограничивает.
realloc - та ещё беда. Использовать его можно при крайней необходимости, а в повседневной жизни от него лучше отказаться.
Да похуй)) Бабосик уплочен, а дальше хоть камни с неба)))
После реаллоков ты рано или поздно получаешь новый указатель, но в main() его никак не возвращаешь, и main() продолжает использовать старый, уже инвалидный.
Не делой так. Во-первых, почини возврат указателеей. Во-вторых, выкинь маллоки: realloc(NULL, size) отлично работает. В-третьих, не дергай реаллок на каждый чих. Увеличивай размер буфера сразу на 16 байтов, например: string_size++; if ((string_size & 15) == 1) realloc(ptr, string_size+16).
А стандартный подход к динамическим массивам вообще хранить сразу два размера: used и available, и по необходимости перевыделять буфер двукратного размера или 3/2. Ты, например, такой while (used + size_needed > available) available ∗= 2;, и потом realloc(ptr, available).
Ну это вообще опасная функция, она может выделить как-то не так память. И вообще, ты хочешь со мной и моим 20 летним авторитетом поспорить? Я такую малявку с сажей легко могу раскусить, ты чмырдяй не совмевайся в моих словах. Я вас таких в 2000х легко щёлкал после МФТИ.
Обучение и учеба это разные вещи.
Обученние - человек делает дело и учится.
Учеба - ясли с программой для сопливчиков дебилов, где нянечки с ложечки кормят, и пасут как скот, говоря что и как делать, а сопливые дебилы ноют, жрут и подчиняются. Учебник это лишь запись с оной программы.
> может выделить как-то не так
Проиграно. А system - опасная функция, она может выполнить как-то не так rm -rf /, ага.
Естественно опасная, иначе сидели бы под рутом как на винде и в ус не дули. Но СТРАШНА же, вот и не сидят, опасно.
Ничего ты не понимаешь в серьёзном программировании, щенок.
system действительно опасная функция, через нее можно выполнить произвольный код. Это игры с огнем.
Ты не понимаешь всей тяжести и сложности Си.
Ссал тебе в рот, щенок. Наберешься опыта - поймёшь меня. Наверное и пары лет не пишешь на нем, а уже выебываешься.
А почему у тебя индекс на <= проверяется относительно длинны? Ты всегда будешь залазить на один символ за массив
for ( i = 0; i <= len; i++)
В функции вывода
Хуя ты толстый. Ещё и физтех приплёл.
>Давай расскажи нам, какие могут быть беды с реаллоком?
Нарежет тебе кусочков. Для GUI в основном похуй, но если будешь использовать его для серверной програмы, которая работает годами - ОХУЕЕШЬ.
Более семи лет аптайма.
А теперь попробуй выполнять на нем какую то полезную работу.
Кстати в реализации динамического массива использую realloc, приложуха с диким аптаймом, не падает. Стек слегка фрагментируется. А так в принципе норм.
Спасибо, буду исправлять. А чем плох malloc, что вместо него realloc лучше использовать?
>серверной програмы, которая работает годами
Хуя, манядебильный мирок.
Эта серверная говнопараша - апофеоз непредсказуемого говнокода, который работает только благодаря постоянным перезагрузкам.
Realloc плох, используй всегда malloc.
Не нарежет, если блоки вменяемой длины. Блоки одного размера в аллокаторах группируются в списки. Если ты увеличишь размер своего блока, то произойдет одна из двух вещей (зависит от аллокатора): либо он займет соседние слоты такого же размера (лежал в списке блоков из 64 байт, слился с соседним блоком, стал 128 байт), либо он попадет в список блоков большего размера. При уменьшении размера блока он либо переедет в список поменьше, либо кусок, кратный размеру блоков в списке будет помечен свободным (и соответственно, будет реюзнут в новых аллокациях такого размера). Никаких дыр. Собственно, у анона выше именно это и происходит.
>>42964
> А чем плох malloc
Ничем, просто он там не нужен.
Ну вот зачем и зачем? Лучше бы они "фрагментацию стека" realloc-ом задетектить и победить пытались, может чему полезному научились бы. Или на собесе повеселили кого
Можете нубасу объяснить что будет если в указатель записать число? К примеру:
int * pi = 5;
Указатель просто стал переменной или чо? printf без разыменования даёт на выходе 5.
Не бейте плз, просто в гугле ответ не нашёл
> int * pi = 5;
Указатель начнет указывать на int по адресу 5. Если включишь предупреждения (а должен был сразу включить!), будет предупреждение, что ты неявно кастишь инт в указатель.
Если ты после этого сделаешь ∗pi = 123; то по адресу 5 (точнее, по адресам 5, 6, 7, 8 из-за того, что sizeof(int) = 4) будет записано число 123.
Если ты хочешь пользоваться указателем правильно, то тебе сначала нужно создать где-то int (или выделить sizeof(int) байтов), а потом уже записать адрес этого объекта в указатель: int myvar = 5; int ∗pi = &var; Если вывести pi, выведется большое число, если вывести ∗pi, увидишь 5.
Алсо, в питоне все то же самое, просто там обычных переменных вообще нет, они все ссылки (указатели).
спасибо, абуанон
да, в предупреждении выдаёт
ПредупреждениеC4047инициализация: "int *" отличается по уровням косвенного обращения от "int"
Т.е. вместо 64 инта он хранит 64 ссылку на 64 инт и жрет в два раза больше памяти?
Да, необязательно. Но мне кажется, что лучше привести конкретный пример, чем рассказывать, что Си гарантирует только минимальную длину int, не гарантирует последствия преобразования интов к указателям, а потом еще рассказывать, что на самом деле там будет сегфолт, потому что современные ОС не мапят ничего в нулевую страницу.
>>43827
А в питоне нет 64-битных интов, лал. Они там безразмерные, и они гораздо жирнее: 28 байт для самых коротких. Но они еще и иммутабельные, это позволяет создать первые 256 чисел заранее, при старте интерпретатора, и многие переменные с пятеркой в программе ссылаются на одну и ту же пятерку:
>>> a = 5; b = 4; с = b + 1; print('%x %x' % (id(a), id(c)))
7f119cefa820 7f119cefa820
>Но они еще и иммутабельные
Те когда я делаю а = а + 1 реально создаётся новая переменная? Смутно догадываюсь что это для тредсейф но как тогда другой тред догадывается к какой версии обращаться?
Создается новый объект, а не переменная. Переменная - это именованная ссылка на что-то, переменные хранятся в одном из словарей, поэтому проблемы с версиями не возникает - у тебя есть имя, по имени получаешь актуальную ссылку на объект-значение. Но во-первых, мы сильно ошиблись тредом, и пора это заканчивать, а во-вторых, в питоне есть функция id(), и так уж получилось, что в CPython id равен адресу объекта. Поиграй сам. Можешь заодно и с sys.getsizeof() поиграть.
Представь себе что у тебя микроконтроллер или ретрокомпьютер какой. А там вместо участка памяти могут быть замаплены пориы ввода вывода или видеопамять к примеру. Например на c64 запись по 0xD021 меняла цвет фона экрана. В винде конечно такое не прокатит, там куча слоев виртуальной памяти и т.д.
порты*
execve
Поделитесь опытом, что ли.
Как вы оцениваете студентов?
Меня на старости лет запрягли студентам преподавать. С подачей материала проблем нет, а вот как оценивать х.з.
"Windows для профессионалов", Джеффри Рихтер
Полугли, если есть в электронном виде, там всё что надо расписано.
На Русском хоть?
>Ну кому сука нужно это говнище? Даже паскаль лучше.
Ты так говоришь, будто иежду ними большая разница.
Тогда это и есть твоя проблема. Нам в универе рассказывал один препод, что ни в коем случае не стоит учить питон как первый язык, иначе ты от него отупеешь и будет сложнее выучить нормальные языки. А лучше, вообще не учить этот недоязык, программы, написанные на нём, работают через жопу.
> Нам в универе рассказывал один препод
Молодой, наверное.
Страый препод вслух бы не стал такое говорить, даже если так думает. Тоже наверное.
Отчасти правда, если не знать что весь твой говнокод в 20 строк строк с целью считать строку неизвестного размера из потока ввода заменяется единственным s = input() на питоне, то и баттхерта от этого не будет.
Массив строк кстати тоже можно создать в одну строчку на питоне. И потом просто передать его в функцию, лол. И изменить. И скопировать. И никаких тебе указателей, никакой блядь динамической памяти, просто блядь ты можешь не думать об этом блядь, а заниматься чистой математикой, писать алгоритмы - творить. Твой препод был прав, да, пересесть с питона на си, все равно что всю жизнь работать экскаваторщиком на карьере, а потом у тебя отбирают экскаватор, дают в руки пластиковую говнопалку, которая постоянно ломается, и говорят теперь копать ей.
Написав такой говнокод, его можно вынести в функцию и использовать только скромную короткую команду.
Привыкнут к своим экскаваторам, а потом пытаются им зубы удалять, а на возмущение отвечают что надо просто было рот шире открыть.
две с половиной строчки, анон.
Цикл с fgetc, и наращивание буфера realloc/malloc если потребуется.
Напомню, ваш бог кармак перешёл на кресты после Q3.
Ваш бог Трольвардс одобрил раст в ядре и признал что С устарел.
Ваша вера тщетна, ваш инструмент устарел.
Посоветуйте литературу по эффективному программированию на C для embedded. Интересуют виды оптимизаций в коде (а не флаги компиляции), как сократить количество бесполезных тактов и не удариться в асм. Пример типовой задачи: Есть монохромный дисплей и указатель на видеопамять. Требуется функция прорисовки прямоугольника disp_fill(x1, y1, x2, y2) с произвольными сторонами. Однако, каждый байт видеопамяти управляет восемью пикселами, тут-то я и обсираюсь нахуй. При заливке по невыровненным координатам я должен каким-то образом считать смещения для пикселей или делить прямоугольник на разные части(?) с сохранением производительности.
Чи 12864? Чи ще щось?
Вот тебе подсказка
unsigned char left_mask = 0xff >> (x1 % 8);
unsigned char right_mask = 0xff << (x2 % 8);
А если компилятор тупой, то вот так красивее будет.
if((x1 & 7) | (x2 & 7) )
{
unsigned char left_mask = 0xff >> (x1 & 7);
unsigned char right_mask = 0xff << (x2 & 7);
// алгоритм c учётом границ здесь...
}
else
{
// алгоритм без учёта границ здесь...
}
Быстрее уже не бывает.
Ты пишешь очевидные вещи. Давай про неочевидные лучше: как именно ты будешь делать проверки на границы, и как именно ты будешь рисовать прямоугольник шириной в 1 пиксел.
> Быстрее уже не бывает
Бывает. Анон, задавший вопрос, сам написал, как быстрее можно:
> делить прямоугольник на разные части
За счет трех отдельных циклов (невыровненное начало, выровненная часть, невыровненный конец) можно экономить такты на проверках внутри цикла. Алсо, именно таким способом реализована memcpy() в сишной либе.
int i;
video_ptr++ |= left_mask;
for(i=x1+1; i<x2; ++i) video_ptr++ = 0xff;
*video_ptr++ |= right_mask;
Вакаба сука, восприняла звёздочку как разметку.
но это оптимально для восьмибитного процессора, таких сейчас днём с огнём не найдёшь. Нужно маску и указатель переделать на тип данных, чей размер равен разрядности процессора.
> и как именно ты будешь рисовать прямоугольник шириной в 1 пиксел.
Там ещё одна проверка для такого случая понадобится.
if( (x1 & ~7) ) == (x2 & ~7)
{
unsigned char thin_mask = left_mask & right_mask;
// Здесь цикл, ресующий вертикальную составляющую для случая когда пиксели не выходят за ширину байта
}
И вот теперь самый быстрый алгоритм для отрисовки на 8-битных процессорах
Как вообще организовывают ОРХЕТЕХТУРНО в коде на C UI во встраиваемых системах (мелких всяких, типа на stm32f1)? Абстрагируют ли функции отрисовки хуюзеринтерфейса от "низкоуровневых" функций отрисовки драйвера дисплея?
Мне пока пришли в голову структуры с указателями на функции драйвера дисплея, лол.
Ну надо сделать микросервис для отрисовки на экран. Микросервис блиттера. Микросервис для общения с аппаратурой. Микросервис HAL. Все на FreeRTOS, общение микросервисов наладить через mqtt.
Вот ты меня туда посылаешь, но на каком-то espruino пилят железок тоже немало.
Си - устарел. Феминистки не могут найти логику в вашем языке. Все эти указатели, адресная арифметика. Все должно быть куда проще. Память это объект, а женщина - это феминистка. Поэтому и скриптовые языки захватывают мир. Скоро победим вас ебучих капиталистов, зальем ваши лица гендерноравными смузи. Да будет власть меньшинств!
>Как вообще организовывают ОРХЕТЕХТУРНО в коде на C UI во встраиваемых системах
Паяют микросхему ftdi FT8XX серии
Нахуй фемок! Нахуй смузи! Нахуй коммуняк! Нахуй меньшинства!
Слава мужикам, да здравствует маскулинность! Пиздуйте, мужики в качалку и на борьбу! Слава Си! Слава адресной арифметике!
А вопрос такой вот. Кто чем пользуется для генерации шрифтов под монохромные дисплеи с разными контроллерами? Вот, например, есть шрифт с буквами-пиписьками в TTF и хочу я его отрисовать на дисплее с контроллером SSD1306. Вот чем его генерить?
Неужели, тока писать свой скрипт?
Вчера заюзал строку с украинскими матюками и собрал прошивку, затем "колупнул" секцию .rodata - выяснил, что кодирование там идет utf-8, но явно я его не указывал. А хотелось бы. И хотелось бы со всем этим "собрать чехлы".
Воровать ttf-шрифты нехорошо. Просто извлеки шрифт из пзу ega/vga, в интернете есть целые коллекции.
Лол. А воровать из пзу хорошо? Полно опенсорсных ttf.
Понял, воровать шрифты не буду.
По поводу ПЗУ EGA/VGA - спасибо, учту. Дельный, кстати, совет для нюфага.
Все таки по поводу TTF... А если шрифт фриварный? Или если я, например, куплю шрифт? (да, есть такая тема) Тоже нельзя, получается?
-fexec-charset, алсо сишный стандарт, там описывается как source character set превращается в execution character set.
>Вот, например, есть шрифт с буквами-пиписьками в TTF
Вот тут было смешно.
Не лезь туда, оно тебя убъёт.
BitFontCreator Grayscale. Экспорт в си формате, куча настроек формата выходных данных, рекомендую.
Почему С а не С++?
Шапку внимательно прочитай, похуй что ничего не поймёшь, читай до просветлеия.
Не нашел там ответа.
Хороший ответ. Без иронии.
Разные же языки. Вот я хочу, чтобы символ foo в дизассемблере выглядел как foo, a не fooZzbh12i. И чтобы можно было назвать локальную переменную new, a функцию - delete.
ну вот я знаю это ваш си, есть у меня программатор и микросхема и как погромировать это всё?
а как? скажи какая либра нужна, как то всё привести к виду пошивки чтобы через программатор зажить?
> Вот я хочу, чтобы символ foo в дизассемблере выглядел как foo, a не fooZzbh12i
Нормальные дизассемблеры умеют делать demangle. Алсо, extern "C".
>>49029
Пишешь ld-скрипт, в нем указываешь, чего куда класть (где код, где память и стек размещены). Если не знаешь, смотришь в даташите микроконтроллера. Компилируешь, линкуешь, получаешь бинарник. Берешь objcopy, делаешь из бинарника .hex, его и шьешь программатором.
Чекнем-с, благодарю.
спасибо большое, приблизительно понял. пойду гуглить как это делать.
>Попробуй написать компилятор к плюсам и к си
Но ведь сам компилятор писать не нужно, и прыщецц и прыщешланг модульные, если ты изобрел новый процессор с невиданной ранее архитектурой то тебе нужно писать
бэкенд IL->Machine code,
а не
Language->Machine Code
Что-то в этом, конечно, есть. Я думаю, си просто проще. Проще выглядит, проще читать и писать. Намного быстрее компилируется. Но сам я на плюсах ебашу, не мне на такие вопросы отвечать
Я пытался написать кодогенератор на основе Tiny C Compiler. Охуел и забил (на tcc), начал писать компилятор с нуля.
Когда охуел со сложностью кодогенерации, решил сделать для начала интеппретатор.
Зачем делать интерпретатор примитивного языка? Если уж интерпретировать, то сложные операции, дополняя это сборкой мусора, бигнумами, исключениями, нитями и пр. То есть лиспы-питоны-луа... У лиспа ещё и синтаксис элементарный, то есть можно не тратить время на возню с грамматикой, а скорее делать вкусности.
>Зачем делать интерпретатор примитивного языка?
Чтобы наработать опыть для написания компилятора, чтобы попробовать в оптимизацию. Больше незачем. IMHO
А какие сложности? В тцц кодогенератор максимально просто пилится. Проще, чем где бы то ни было, потому что оптимизаций на уровне машинного кода там нет.
Возможно квалификации не хватило. Не помню.
Компилю на VS простую прогу. Запускаю. ОК. Переношу на Виртуалку с 7кой.
И что я вижу?
ОТСУТСТВУЮТ КАКИЕ-ТО ЕБАНЫЕ БИБЛИОТЕКИ. ок.
Ставлю vc_redist.x86.exe.
Нихуя. ок.
Пробую комплить через MinGW.
Ставлю, компилю, переношу
отсутствует libstdc++-6.dll
Блять. Гуглю. Надо поставить флаг -static-libstdc++ ОК
Ставлю, компилю, переношу
отсутствует libgcc_s_seh-1.dll
Блять. Гуглю. Надо поставить еще флаг -static-libgcc ОК
на компьютере отсутствует libwinpthread-1.dll
СУКА БЛЯТЬ
Почему ебаный питон прокрученный через косой и убогий pyinstaller запускает мои проги? а?
Если ваш С такой пиздатый, то почему я не могу компилировать его под сперму?
С с++ такая же херня
Что это? Каким статиком? Я прописал все возможные и невозможные флаги, но оно по-прежнему просит какие-то библиотеки
Уходи от сюда
Миша лох.
Стааь линукс, таких проблем не будет.
Пиши на диалекте Визуальный С++, который предназначен для выньдос. Это стандартный спермоязык со стандартными спермобиблиотеками.
Твой питон конченная залупа, впрочем как и ты сам. Макакам в Си нечего делать, тебя сам язык и компилятор нахуй посылают дурак блять, очнись! Иди В тред для питоноанананистов и жабадаунов и там высирайся! А то пришел глав.петух ебанный к элите и хайло свое вонючее открыл, срыгнул блять отсюда, куда указали.
>В Winapi при асинхронном чтении/записи файла нет возможности повесить обработчик на завершение операции
Как и в Nodejs под капотом, да.
Лоулевел, что ты хотел? Что бы шиношс сам тебе такой асинхронно поток ломал как в прерывании ардуины?
Можешь поток усыпить, можешь другие полезные задачи поделать и потом вернуться и еще раз проверить
>Как и в Nodejs под капотом, да.
Дак вот разница в том, что у ноды это под капотом, а тут ты сам должен изобретать хуйню вместо того чтобы просто обработчик приколотить и дальше пойти.
>Что бы шиношс сам тебе такой асинхронно поток ломал как в прерывании ардуины?
В шиносе тоже треды есть, так уж.
>Лоулевел, что ты хотел?
Да не настолько уж и лоулвл.
Хм, про лп-оверлаппед я всякой хуйни читал читал, а за колбек вообще ни слова не было. Спасибо, гляну.
> 5й параметр как раз колфбэк
Он вызывается, когда поток в alertable состоянии. А в этом состоянии поток, когда чего-то ждет. Например, события. Так что, как ни крути, а WaitForSingleObject/MultipleObjects/SleepEx все равно нужен. И это нормально. Если ждать не хочется, а работы много, можно посмотреть в сторону IOCP, там потоки.
> просто обработчик приколотить и дальше пойти
Ой, с такими познаниями и таким подходом просто стартуй отдельный, в котором синхронно выполняется IO. Других способов "прикрутить обработчик и пойти дальше" нет и никогда не будет.
Да, но он сработает только в том случае когда тред после вызова ReadFileEx/WriteFileEx усыпили c помощью SleepEx или WaitForXXXObject.
Просто так продолжать что то делать в треде и что бы процедура завершения (тот самый колбек) сама дернулась прервав тред нельзя.
Вообще, семантика Async Fire and forget это UB в чистом виде по определению, именно поэтому во всех языках она или с ньюансами, или от нее избавляются деелая ее применение максимально болезненным.
>, нужно что бы потоков было ровно по количеству ядер и они были загружены только полезной работой?
Ты про Job System?
Там вообще асинхронщина не нужна. Нужен лишь тредпул и мейлбокс из двух очередей, одна на вход, другая на выход, в один суешь джобы, из другого читаешь отчеты о выполненни джобов.
>Почему?
Просто ответь, как сам думаешь, файл святым духом читается вне потока и его процессорного времени? Fire And Forget - это тупо магическая семантика, предполагающая что что то где то в варпе магически исполнится и вызовется колбек по результату.
В реальности никакого варпа нет, а в ноде, которая сожрала твой мозг, его роль выполняют невидимые тебе потоки от батареек и внутренних библиотек и локстепнутый цикл, про который бы тебе следовало почитать.
> Но ведь стартовать кучу потоков считается зашкваром
Нет, это заблуждение. Зашкваром считается стартовать потоки, которые активно используют процессор, т.е., что-то считают в цикле, например. Их, действительно, нужно по одному на ядро. А потоки, которые висят на IO - это почти бесплатно по процессору, и не очень дорого по памяти, поэтому если у тебя не нужно экономить каждый байт, то очень даже можно.
>>51898
Большинство мелких серверов раньше писалось по такому принципу - соединение получил, поток стартовал и пошел хуячить синхронно. А UB - это если ты на что-то надеешься. Например, что оно прочитается/запишется за какое-то время и без ошибок. К тому же, никто не заставляет тебя forget, можно из тредов срать ошибками в основной поток, хоть в глобальный массив, который потом основной поток будет поллить, лал.
Только вот жаль он существует где то на уровне ядра ОС и занимается лишь разруливанием чтения из железяк в рам и там еще всякие файловые буферы хуюферы кеши хуеши, так что один хер процессору пердеть.
Без шуток, в консолях прошлых поколений сосони доступный быдлокодеру DMA контроллер являлся главным средством раскрытия потанцевала.
Ну и в целом, даже если и так, то одним из контрактов многозадачных OS является явный виртуальный поток управления без всякой хуйни уровня "возврат из прерывания, которое магически что то там переписало"
В forget как раз основной смысл нодовской модели асинхронности,
точнее - в комбинации асинхронной логики в цепочки.
а rand() вызывать в дочерних потоках?
Ничего интересного не заметили?
Каким подходам уж обучен, зачем стукать. Просто, ну епт, я это еще в коде для стм (та же ардуина) первое время делал, пока не обучился dma, прерываниям и вытекающим из них ивентам.
>>51914
>а в ноде, которая сожрала твой мозг
Как что-то плохое.
>файл святым духом читается вне потока и его процессорного времени
Другим потоком на другом ядре или перемежающимся с основным благодаря планировщику. Да уйма способов, просто какой смысл в таком асинхроне когда можно действительно сделать отдельный поток с синхронными методами, который будет сам по себе вариться и в конце вызывать тот же самый обработчик, располагаясь при этом где-то в задворках структуры проекта. Нюанс только в том, что его нужно писать самому, а не юзать что есть, потому что этого тонет.
>Сыновних потоках
Забавно. Да. Спасибо. Наверное "порождённых" будет гендер-нейтрально. Но замечание ценное.
Нити?
Эти либы не отсутствуют на компе, они идут в поставке с gcc. Обычно их можно отыскать в каталоге с MinGW, и скопировать в каталог к выходящему бинарю.
Зачем все эти либы нужны? Windows не posix система, и ей нужны либы переходники для запуска гнутого кода as is.
То что ты плохо разбираешься в теме и юзаешь шиндошс, это не означает что технология говно.
Селедки - пидарасы \thread
У меня получилось что все потоки выдают одну и ту же последовательность псевдослучайных чисел.
srand() был вызван в родительском потоке.
Забавно, да?
>rand() is not guaranteed to be thread-safe.
RTFM
>Что ты предлагаешь взамен?
Как насчет PCG?
https://www.pcg-random.org/download.html
Хотя не уверен что он дает хорошие результаты в multithread
tls-prf или mt на основе сида из hw rng
Интересно. Спасибо.
Я решил проблему проще - вынес генерацию случайных чисел в отдельный поток и прошу случайное число у него. Сложнее, медленнее в несколько раз, но как вариант - вполне.
Где располагается нессылочная переменная в ссылочном объекте с++?
Допустим, я создал класс:
class X
{
QVector<int> var;
};
Теперь создаю объект этого класса, но как ссылку:
X * x = new X;
Вопрос - переменная var у объекта x будет создана в стеке или куче(Оперативной памяти)?
Вообще - как вы выбираете где создавать переменные - в куче или стеке?
Важно ли это вообще? Где можно нормального почитать об этом?
Благодарю!
1. Тебе в плюсотред.
2. Выбор создавать на стеке или нет определяется тем, использовал ли ты new или написал просто int a = 5;
3. Любая переменная любого типа создаётся там, где ее разместить, то же касается и сложных типов (классы, стракты..)
4. Как выше написали - не путай указатели и ссылки
В куче.
Выбираю исходя из задачи. В разных случая по-разному. На стеке дешевше.
Да, это важно.
Пиши больше - сам разберёшься.
Ах ты неполиткорректная сука!
ИНДИЕЦ, А НЕ ИНДУС!
Мы за тебя тут шествием за права трансгендеров шли, а ты уротребляешь и-слово!
Да ладно тебе. Я и тест написал. Супротив обычного вызова rand() оказалось лишь на 20%-25% медленнее.
Делайте перекат.
Наверное потому, что в rand уже есть мьютекс. А вообще для многопотока есть rand_r или нормальный генератор из Личной Библиотеки Сишника.
Ты как бы такой умный всё знаешь. Представь себе - не все такие. Этот тред для вопросов, а не для твоего выпендрёжа.
Нихуя себе ты исследователь. Прям открытие уровня /pr/ по С++ в Сишном треде. А сразу в тред по назначению зайти сложно?
НЕССЫЛОЧНЫЙ СЛОЖНЫЙ ОБЪЕКТ
Что несёт этот долбоеб?
Используй нормальную терминологию.
Сейчас бы блядь деструктор вызывался для объекта, который ты создал и не удалил, просто охуеть.
Пока что ты только свой монитор слюной забрызгала.
>А вообще для многопотока есть rand_r
Да, это неплохой вариант, но этой функции нет в майкрософтовских хидерах.
Последний ответ вот тут - https://social.msdn.microsoft.com/Forums/vstudio/en-US/3263ab0b-da3f-4737-9d80-0788a5b426db/randr-identifier-not-found?forum=vcgeneral предлагает решение -при инициализации генератора случайных чисел подмешивать к времени GetCurrentThreadId().
>>54397
вопросы из Праты.
Потому что ЖМИ клавишу ENTER!
Что попалось в памяти, то и выводится. UB говорит, что если ты нарушаешь, то никто тебе ничего не обязан, и результаты непредсказуемые.
Это копия, сохраненная 11 апреля 2021 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.