Это копия, сохраненная 23 мая 2023 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Пожалуйста, пользуйтесь https://ideone.com/ или https://pastebin.com/ для вставки кода, если он длиной больше нескольких строк или содержит или ∗.
Что читать:
- 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 (драфт)
- man/Dash/zealdocs
Чем компилировать:
- Очевидный GCC.
- clang: оче годно, батя рекомендует.
- Intel C++ Compiler: оптимизации, тысячи их.
- Visual Studio 2017 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://godbolt.org/ - Compiler Explorer позволяет посмотреть выхлоп компиляторов для введенного куска кода (больше полусотни разных версий компиляторов).
- http://cdecl.org/ - С Gibberish ↔ English помогает читать сложные сишные декларации.
Прошлый: >>2495049 (OP)
Какой шрифт используете?
Лично мне нравится Hack(нескучный DejaVU) и Iosevka. Не могу определиться...
FantasqueSansMono
орлы?
ну давай епт понятно что с каментами все понятно, но все равно модуль 1к лок это пиздец и погибель
Если интересно, то я 7 лет пишу под них, могу рассказать и научить.
firacode, конечно.
Привет, да, интересно. Вообще мне много не надо расписывать, я люблю сам вещи изучать, мне больше нужен старт. Во-первых как и спрашиал что по физике, во-вторых с каких лучше начать. В интернете посмотрел, нашел там AVR 8 битную, думаю с неё начать, но даже если и закажу её(кстати пока не смотрел ещё где и что заказывать), то не понимаю что с этим приборчиком делать, как я понимаю его надо подключить к чему-то, а к чему? вот эти вопросы меня и интересуют для старта. Заранее спасибо!
а что я о таком с си первый раз слышу?
ну хотя я на 89 сижу и давно в стандарты новые не смотрел
если интересно, то бери на али ардуино нано, они дешевые, потом набираешь к ним модулей и проводочков и тебя теряют на ближайшие лет 5-10
Этот оператор еще у Керниган Ритчи бьл
это говнокод какой-то, лол. Я уверен в мисре есть о таком слово, вы вообще в курсе что этот цикл неправильный, он не выводит 10. Инкремент/декремент всегда должен быть в конце итерации
То есть с ардуино хорошо начинать? Просто я слышал такую точку зрения, что они "игрушечные" и ничему особо не научишься
нормально научишься, в промышленности тоже используют, так что не бесполезно, есть для вката совсем новичков
С них очень вредно начинать, засрут тебе голову своими подходами. Лучше с STM32.
>что за стрелки там в коде?
Это серьезный вопрос, а не троллинг? Конечно, из-за лигатур не сильно понятно, но имхо это обычное "->" при обращение к полю структуры через указатель.
В APL стрелочка означало присваивание, видимо по наследству досталось.
подскажи как перехватить сигналы из кан шины - чтобы сделать хардверный макрос переключения режимов
правильно ли я понимаю что достаточно нажать нужный режим и записать сигнал, той же урдиной, а дальше просто воспроизводить и без головняка она все подцепит?
и вдогонку нужно написать опенсурц ECU, вдогонку контролить 6-axis imu && abs
Что-то про многопоточность.
Ну и чтобы не было как с сегментами в 16-битном ассемблере было.
Это вроде в DOS, в винде похуй.
которую очень заебывает держать в aligned стейте при помощи плагунов вскода
подскажите как это по красоте сделать чтобы потом использовать в пик2
арифметика индексов это отдельный пиздец, но об этом познее
>пик3
вдуше ничаю, какое то говно с алика, все вместе вышло около 25к₽ (сколько сама платка не помню)
а когда я узнал что эта паскудная параша не может в юникод, и весь мир жрет говно и костыляет юник через анси дрисню - мое срачло просто улетело на самый край галактики....
Что за условие в case такое с троеточием?
Которое ast_amp ... er_eri:
Вообще смотрю иногда чей-то код и вообще не могу понять что там написано, хотя вроде Прату вроде осилил. Как учиться читать и понимать чужой код?
Причем есть вещи, с которыми был не знаком, но там интуитивно все понятно. Встречался с таким когда вкатывался в FreeRTOS, там весь код хорошо понятен был.
> Как учиться читать и понимать чужой код?
не заниматься бесполезной хуетой и дрочевом древней юзлес дрисни, типа
> Прату вроде осилил
гугли или спрашивай у нейросети минимально необходимый бит информации, который нужен прямо сейчас, для решения конкретной задачи
В си такого оператора нет, это какое-то васянское расширение компилятора. Делает очевидную вещь - срабатывает на всем диапазоне (как 1...5)
>error: expected identifier or '(' before '=' token
>error: 'st' undeclared (first use in this function)
>error: 'ed' undeclared (first use in this function)
начинает пригорать потихоньку
если два кейса переставить местами тоже перестает работать
хотя казалось бы ему должно быть похуй на первый айтем энума..
Я про uint8_t mod_state. Зачем оно там? Или в кейс помести, или до свитча выноси.
это инты простые же
я что хочу вообще туда могу написать, ему тупо размер важен же
хуле он голову ебет?
как заэкстендить инам без говна?
Хочу запилить имплементацию сетевого протокола RTSP и RTP чтобы смотреть картинку со своей камеры как хочу и не платить охуевшим комерсам знаю что плееры умеют в ртсп, но хочу сам и чтобы дальше кодирование в hls было, про модуль для нджинкса тоже знаю
Стоит ли выбрать для этого си, или сложно для типикал формошлепа будет?
И что вообще можно почитать про работу с сетью/сокетами/tcp/udp? Не книгу же Танненбаума на миллион страниц читать
мой вариант лаконичнее и проще и никакой интерференции со стоковыми байтами
а я тебе сразу сказал няш что тут гниль по большей части, да школота
Почему не очень? Я думаю многим было бы тоже интересно, кто сюда в будущем может зайти!
Иди нахер, лигатуры рулят.
>>601391
Отлично, раз есть запрос, то отвечу тут.
Сначала небольшое вступление про образование
При поиске работы в области встраиваемых систем необходима вышка или спецуха по направлению радиотехника/робототехника/и т.п. Возможно кого-то и брали без диплома, но весь мой опыт показывает что берут только с ним. Так происходит, потому что при работе с железом никто не хочет кота в мешке.
->Во первых, часто приходится работать с напряжением, в том числе и высоким, с системами, которые опасны для жизни.
На учебе объясняют чем опасно высокое напряжение, СВЧ и т.д.
->Во вторых, при обучению ты знакомишься со всем по немногу и сможешь сразу говорить на одном языке с другими инженерами. Да, физика, матан нужны. Придется и фильтры писать, и расчеты иногда делать, и в целом понимать как физически устроен мир и различные приборы. Так же надо уметь хоть как-то читать схемы, но на это часто закрывают глаза.
Если учиться хорошо, и не пить пивко, то можно уже курса с третьего получать 1к+ долларов работаю прогером или схемотом. но обычно все учатся без интереса, и только через пару лет работы понимают что упустили кучу прибыльных знаний.
Без холливаров про вузы в постссср, но базе везде обучат, а это главное. Современные мк можешь и сам потрогать.
Если без вуза, то вопрос по самообучению.
Сам я после выпуска не умел кодить на Си под мк, но по совету научника взял отладочную плату, и по видеокурсу с кафедры разобрался с основами. Дальше учился сам и подсматривал у коллег.
С чего же начинать самообучение.
Как всегда ответить себе на главный вопрос: А зачем мне этот навык.
->Если для поиска работы, то идем в вуз. Может заграницей берут без диплома, не знаю. Надо уточнять.
->Если для себя, то встает вопрос как учиться.
Для простоты поделим умение программировать МК на три области:
1. Знание С/C++, компиляторов, IDE и т.д.
2. Понимание архитектур МК, рынок производителей, различных протоколов CAN, UART, I2C, SPI и т.д.
3. Матан, схемотехника, физика.
1. Сам язык Си простой, и не надо верить что он сложный, легко прострелить колено, это как клюква про матрешку, водку и медведя. Берем книгу Керниган и Ричи, и всю ее с примерами проходим. Простая книга, простые примеры. Примеры печатаем сами руками, чтобы лучше запоминалось. IDE можно взять Code Blocks с предустановленным mingwб чтобы сразу компилировать проекты по винду. Под Линуксом есть компилятор cc,там можно и руками собрать.
Чтобы писать примерно 90% кода под МК достаточно этой книги. Уж поверьте. Большинство программистов в первую очередь инженеры, и пишут на троечку с минусом. Если быть упорным, то через пару лет можно писать код лучше чем большинство коллег.
Ну пару недель читаем учебник, делаем примеры. Если что-то не идет, то возвращаемся через неделю.
2. Без холливаров про ардуино и STM, покупаем отладочные платы как под ардуинку, и ставим arduino IDE. И сразу же покупаем отладочную плату с STM и ставим STM32CubeIDE и keil uvision IDE.
Покупаем пару датчиков: например температуры и дальномер, любые. Покупаем паяльник дешевый, припой и т.д.
По схемам из интернета собираем сначала на ардуино оба датчика и отправляем полученные данные на компьютер по uart. Так же поступаем и с платой STM.
Уйдет на это пару тройку неделю и вуаля, вы уже сами можете сравнить не на словах, а на деле, что для вас лучше, ардуино или STM.
3. Со схемотехникой вы столкнетесь как только придется подключать датчики, в сети есть простые схемы подключения типовых датчиков, с сайтов, которые торгуют ими вместе с ардуино и stm. С физикой столкнетесь, если будите использовать ультразвуковой датчик расстояния. С матаном столкнетесь, как только придется написать первые фильтры, на полученные данные с датчика температуры и расстояния.
Поздравляю, после этих трех шагов вы можете сказать себе, а хочу я и дальше этим заниматься.
Если да, то можно заняться либо домашней автоматизаций, типа грядок и ферм с цветами, или строить радиоуправляемые модели самолетов.
Если нет, то вы получили интересные знания, и когда мошенники придут перепрограммировать вам счетчики воды, вы будете знать что в старых счетчиках нет МК, и сможете их тонко потроллить.
А вообще проще все это объяснять в телеге и отвечать на конкретные вопросы.
>>601391
Отлично, раз есть запрос, то отвечу тут.
Сначала небольшое вступление про образование
При поиске работы в области встраиваемых систем необходима вышка или спецуха по направлению радиотехника/робототехника/и т.п. Возможно кого-то и брали без диплома, но весь мой опыт показывает что берут только с ним. Так происходит, потому что при работе с железом никто не хочет кота в мешке.
->Во первых, часто приходится работать с напряжением, в том числе и высоким, с системами, которые опасны для жизни.
На учебе объясняют чем опасно высокое напряжение, СВЧ и т.д.
->Во вторых, при обучению ты знакомишься со всем по немногу и сможешь сразу говорить на одном языке с другими инженерами. Да, физика, матан нужны. Придется и фильтры писать, и расчеты иногда делать, и в целом понимать как физически устроен мир и различные приборы. Так же надо уметь хоть как-то читать схемы, но на это часто закрывают глаза.
Если учиться хорошо, и не пить пивко, то можно уже курса с третьего получать 1к+ долларов работаю прогером или схемотом. но обычно все учатся без интереса, и только через пару лет работы понимают что упустили кучу прибыльных знаний.
Без холливаров про вузы в постссср, но базе везде обучат, а это главное. Современные мк можешь и сам потрогать.
Если без вуза, то вопрос по самообучению.
Сам я после выпуска не умел кодить на Си под мк, но по совету научника взял отладочную плату, и по видеокурсу с кафедры разобрался с основами. Дальше учился сам и подсматривал у коллег.
С чего же начинать самообучение.
Как всегда ответить себе на главный вопрос: А зачем мне этот навык.
->Если для поиска работы, то идем в вуз. Может заграницей берут без диплома, не знаю. Надо уточнять.
->Если для себя, то встает вопрос как учиться.
Для простоты поделим умение программировать МК на три области:
1. Знание С/C++, компиляторов, IDE и т.д.
2. Понимание архитектур МК, рынок производителей, различных протоколов CAN, UART, I2C, SPI и т.д.
3. Матан, схемотехника, физика.
1. Сам язык Си простой, и не надо верить что он сложный, легко прострелить колено, это как клюква про матрешку, водку и медведя. Берем книгу Керниган и Ричи, и всю ее с примерами проходим. Простая книга, простые примеры. Примеры печатаем сами руками, чтобы лучше запоминалось. IDE можно взять Code Blocks с предустановленным mingwб чтобы сразу компилировать проекты по винду. Под Линуксом есть компилятор cc,там можно и руками собрать.
Чтобы писать примерно 90% кода под МК достаточно этой книги. Уж поверьте. Большинство программистов в первую очередь инженеры, и пишут на троечку с минусом. Если быть упорным, то через пару лет можно писать код лучше чем большинство коллег.
Ну пару недель читаем учебник, делаем примеры. Если что-то не идет, то возвращаемся через неделю.
2. Без холливаров про ардуино и STM, покупаем отладочные платы как под ардуинку, и ставим arduino IDE. И сразу же покупаем отладочную плату с STM и ставим STM32CubeIDE и keil uvision IDE.
Покупаем пару датчиков: например температуры и дальномер, любые. Покупаем паяльник дешевый, припой и т.д.
По схемам из интернета собираем сначала на ардуино оба датчика и отправляем полученные данные на компьютер по uart. Так же поступаем и с платой STM.
Уйдет на это пару тройку неделю и вуаля, вы уже сами можете сравнить не на словах, а на деле, что для вас лучше, ардуино или STM.
3. Со схемотехникой вы столкнетесь как только придется подключать датчики, в сети есть простые схемы подключения типовых датчиков, с сайтов, которые торгуют ими вместе с ардуино и stm. С физикой столкнетесь, если будите использовать ультразвуковой датчик расстояния. С матаном столкнетесь, как только придется написать первые фильтры, на полученные данные с датчика температуры и расстояния.
Поздравляю, после этих трех шагов вы можете сказать себе, а хочу я и дальше этим заниматься.
Если да, то можно заняться либо домашней автоматизаций, типа грядок и ферм с цветами, или строить радиоуправляемые модели самолетов.
Если нет, то вы получили интересные знания, и когда мошенники придут перепрограммировать вам счетчики воды, вы будете знать что в старых счетчиках нет МК, и сможете их тонко потроллить.
А вообще проще все это объяснять в телеге и отвечать на конкретные вопросы.
все комплёхается и корректно работает, но организация низушная, всратая, нихуя неудобная, невозможно сделать красиво
поэтому вытащу это дерьмо в хедер, и напишу ЕБАННЫЙ ФРОНТЕНД где бы я все хранил, отрисовывал и генерил конфиги сразу в буфер обмена
но на самом деле мне только сейчас пришла мега идея - просто нахуй забить хуй на это уебищное дефолтное дерьмище, просто Шифт это ебучий костыль для нищебродов и калоедов (запятая в верхнем регистре - охуенна да?))))
и просто создать кастомный слой, где бы я все обернул в модификаторы!
> но обычно все учатся без интереса, и только через пару лет работы понимают что упустили кучу прибыльных знаний
потому что все вокруг безинициативные престарелые пидарасы, которые трахают тебя юзлес дрисней, нахуй не нужной, которую ты забудешь через два года
я датасаентист и мне нахуй ни какая матёшка не всралась кроме умножения матриц (достаточно просто загуглить гугл-картинки) а вам и подавно это все не уперлось
учится надо только в работе - вот где кайф и реальный интерес
> видеокурсу с кафедры
нудный пидирас бурчит чето полтора часа - открываешь АНГЛИЙСКИЙ тубик и смотришь охуенного челика который на бодряках с задором и смехуечками в охуенной студии со спец эффектами тебе поясняет за всю хуйню за 12 минут
все твои задачи типовые, все давно придумали за тебя и даже я, занимаясь уникальной разработкой, находил кусочки которые мне в разной степени помогали строить аналоговнетную систему
>самостоятельно пошел получать образование
>ряяя скучно, где эффекты и терминатор вылезающий из стены?
>почему моему зумерскому мозгу не предоставили клоуна?
просто ты привык жрать говно, а я привык брать только самое лучшее.
Да-да, это же я дурачок с СДВГ, которому нужен скачущий негр, чтобы его величество соизволило учиться.
>я привык брать только самое лучшее
Поэтому ты смотришь говновидосы на ютубе, а не читаешь книги. А в книгах же спецэффектов нет...
какое
> СДВГ
додик
я ебашу сутками олмост нанстап
> а не читаешь книги
потому что это НННАХУЙ невсравшийся дрочь
я вот обсудил с нейросеточкой какие же инамы хуета, и пошел ебашить дальше, мне допизды на арифметику указателей, я её не трогаю, потому что она не решает мою задачу, это будет просто мусорные знания, которые отнимают мой нейросетевой пул
но тебе же надо перед барином выслужиться, барин каргокультный кусок дерьма пынямает только корочки и лычки, а по факту ты как ебашил за два мрота свое говно пыльное и убогое, так и продолжаешь это делать без изменений...
Ладно.
Спасибо большое за развёрнутый ответ
Не рвись, а то туза порвешь.
сек
Не работает.
#define _WIN32_WINNT 0x0501
#include <stdio.h>
#include <windows.h>
int main(int argc, char argv) {
AttachConsole(ATTACH_PARENT_PROCESS);
printf("Test");
return 0;
}
gcc -Wl,-subsystem,windows -O2
А нет - это я опции линковки убрал.
ну так ты в винде либо скрываешь консоль приложения либо показываешь, третьего не дано
Консоль можно просто не открывать, а присосаться к существующей. И оно присасывается, но почему-то не хочет туда писать.
Но не тут-то было и настало время делать невротебенные оптимизации и тем более разбираться в них.
Почитал про всякие SSE, AVX2, AVX512, вроде как понятно, но как их юзать вообще не ебу.
Анонче, посоветуй, пожалуйста, нормальных книг по оптимизации и использовании всяких расширений проца. Ну, там книжки, маны, которые знаешь, с которых начать. Как, собственно пользоваться всеми прелестями современных процессоров и использовать эти длинные инструкции, для оптимизации программ?
Как например, вогнать данные принудительно в кеш, например, и там перемолотить словами по используя шины 256-бит?
Ладно, думаю стоит ли вообще изучить ассемблер x86 от и до. А потом уже разговаривать.
Я так собственно микроконтроллеры учил, начал с ассемблера, за 2 месяца освоил азы, потом понял куда двигаться. Начну с пикрил. Там посмотрим.
Чел учение и знание это конечно хорошо, но особого смысла нету.
Если только не ради науки, и я не про практическую реализацию чего то научного, а про сугубо прогоамистские изыскания.
Я сравнивал скорость нескольких популярных математических библиотек, некоторые из них с ключами собираются с ссе или авх, а некоторые исключительно под авх и написаны, а так же свою простую скалярную.
Так вот с о0 разница действительно есть, те что фул авх быстрее гебридов, а те быстрее скаляров.
Но если собирать в релиз с арчнатив и о3, то все. Современные компиляторы и процы такие крутые что все, практически никакой разницы.
Расскажи свою историю переката из МК в большие процы,
Чем компания занимается? Свое сетевое оборудование делает?
Я не он, а всего лишь около годовалый вкатышь, но тоже перкатываюсь на линупс с микроконтроллеров.
Вкатился почти год назад в микрокамни, пока оформлялся началась заваруха с сво. В итоге вкатился в микроконтроллеры, даже кой чего уже написал, а в итоге к концу лета совсем все поставки оборвали. Теперь в суматохе переходим в эмбедед линукс и соответствующую комплектуху.
Твой отклик не оч, сорян. Сумбурно, как-то, да и опыта у меня больше, хотелось бы кого-то постарше.
Я - он.
Вообще, когда я работал в эмбедде, мне помогли широкого круга задачи на разных проектах, это SIO, эмбеддед Линукс АРМ (сборка ядра, дергание ануса драйверов) IoT, чипсеты, биосы, со всем работал по чуть чуть, так что появился кругозор.
Потом понял, что просто вырос и надо двигаться.
Если серъезно рассматривать, та работа на которой сейчас это самый крутой проект на котором я был. Также помог вкатиться опыт админа, внезапно. Понимание сетей и виртуализации.
Да, компания занимается и сетью, ОС и куча эмбеддеда, крупная компания по разработке всякого железа. Сейчас проект как раз - оптимизация алгоритмов и допил KVM и сетевых штук (DPDK, IOMMU, SDN)
>крупная компания
Каждый разработчик этой компании бегает на двач с вопросами "как и что делать?" или ты один такой уникальный ширококругозорный растишка?
Да ладно тебе, тред и так полумертвый. А так хоть какой-то движ есть.
Нет конечно, была небольшая база до этого, просто в серьезных проектах никогда не учавствовал. Да и не писал я, что все за год освоил. Только вкатился же.
Во первых я не спрашивал что делать, я спросил литературу, не каждый день тебе ставят задачу по AVX. И не знать это нормально. Ненормально ходить вокруг да около годами и не пытаться узнать или спросить.
А во вторых каждый разработчик ходит ещё и на StackOwf, LOR, а ещё ходит на дейлики и рассказывает проблему там, в которой ему, незнающему как делать, подсказывают.
> В итоге вкатился в микроконтроллеры, даже кой чего уже написал, а в итоге к концу лета совсем все поставки оборвали.
Так программирувай отечественные mik51 и миландры.
> Теперь в суматохе переходим в эмбедед линукс и соответствующую комплектуху.
Китайские клоны π?
Лол, я на миландры и вкатился. Но они ушли с рынка. Сейчас ждем ответа от другой фирмы.
Ну и да, юзаем "отечественные" клоны малинок, если это так можно назвать, хотя малинки не были первыми.
Платят хоть нормально?
А то я много лет занимаюсь байтоёбством в госконторе за копейки, думаю развиваться в этой области и попробовать найти работу с нормальной ЗП, либо попытаться перейти в бэкенд.
>
fak^NHemail.anon ANUSmaH9+il PUNCTUMr_//u
гречневые низушные мрот-скот животные не ведитесь!
спалите профиль на линкеде которого у вас нет и никогда не было ахахах и на него прийдет повестка прямиком из госуслуг!!!11
>Ван Гуй
Эта книга прям для совсем начинающих ассемблерщиков. Но в ней чел хорошо также раскрывает авх инструкции и действие в основном происходит в убунту 18.04 (только, чтобы gdb заработал должным образом в 20/22.04 нужно ручками пересобрать glibc) и он подходит к объяснению некоторых фишек ассемблера с помощью Си, а Круссвюрм с помощью плюсов и кодит в винде, но и раскрывает Круссвюрм авх, авх2, авх512. Так что, да, разница в этих книгах есть, поэтому, если совсем плох в ассемблере, то можно (и я бы сказал нужно) Ван Гуя почитать.
Спасибо за разъяснения.
Ну, ассемблер-то, естественно понимаю, а на слабых 8бит архитектурах вообще чаще с ним работал. Но сейчас каждневного использования нет, естественно.
Ну и понимание, конечно в большей степени это RISC или близкие к ней. Так что что посмотрю обе, в них вещи и там и там есть которые не знаю.
Книги хорошие, это да, но как я понял про asm их вообще мало.
>>605612
Негатива не делаю.
Ну разве что могу попросить прийти на Петровско-Разумовскую и принести с собой самый длинный AVX.
>но как я понял про asm их вообще мало
asm нынче не в моде, потому и книги по нему хорошо не продашь. Страшно подумать что будет, когда челы допилят гпт и копилот, потому что тогда вообще никакие книги не нужны будут. Это с одной стороны, но с другой стороны, если это будет век невероятного макакинга, то и багов будет в этом коде уйма, следовательно, если обладаешь навыками кодинга на ассемблере, плюс обладаешь навыками дизассемблирования, то в эпоху бесконечного макакинга можно иметь конкурентное преимущество. Так что сейчас нужно впитывать как губка всё, что связано с asm и дизассемблированием.
не на моем веку, на ближайшее время участь гпт в кодинге будет уровня помощника, стили погенерировать для ui и все такое
Так если всё больше и больше макак будут доверять прокодить часть своей работы недоработанному боту, то и кол-во багов в коде должно расти пропорционально. Так что, вот тебе и конкурентное преимущество.
ну так ты можешь и макакить как и раньше, у тебя уже будет преимущество, нейроночки тебе только будут быстрее подсказки выдавать, чем stackoverflow или когда что подзабыл, кодить все равно пока даже такое банальное человеку эффективнее
Короче, ты дебс, который нихуя не шарит в дизассемблировании и ревёрс-инжиринге, а потому и не понимаешь в чём именно сейчас преимущество у чела, который хорошо шарит в ассемблере и дизассемблировании; а потому и диалог с тобой я прекращаю уёбок, блять!!!!!
Хочешь, сказать, что нейронки выдают сразу идеально правильный код?
обнял подгоревшего няша :3
этот пидарас чванливый меня тоже выбесил, ууу, гандон ебанный!
>>605764
нихуя ты не шаришь даун, гпт3 был обучен через очко, уже признались что обосрались и начали делать лучше
у тебя нет уникальных задач додик, самую уникальную задачу можно деструктуризировать до простейшей, а потому сети заруливают такой биомусор как ты
но не прямо сейчас, а потом, уже вот-вот
>эвристическому подходу
Да причём тут это? Ты сетке говоришь: "Я хочу, чтобы мой алгоритм выполнял то и то.", а она и пишет для этой задачи код. Любая программа состоит из большого числа таких вот элементарных подпрограмм, которые за тебя пишет сетка, а ты потом всё это компилишь. Т.е. от будущей макаки требуется только разбить задачу на мелкие подзадачи, а после того, как сетка напишет каждую подзадачу, задача макаки переводится в сбор всех этих подзадач в единое целое.
Вот и представь какое это непаханое поле для дизассемблирования и ревёрс-инижиниринга.
> Я хочу, чтобы мой алгоритм выполнял то и то.", а она и пишет для этой задачи код.
там такое говно неоптимизированное будет, даже если будет работать правильно, что разгребать это все придется тоже долго или деньги вбрасывать для увеличения накладных ресурсов для поддержания такого бизнеса, что одно и то же, поэтому - пока это только отдаленное светлое будущее
бля реально ты пиздец бесячий душнила сука....
как будто от тут один тебе это пишет
Та что за прямолинейное мышление то, блять? Наоборот же!!! Сейчас у нас какая картина: говно на Мете (Еблокниге) выпускает под свою аську (ватсапп) обновы по 250-300 метров, блять: Ёбанный чатик получает обновы по 250-300 мегабайт, блять!!!!!!!! Их ебейшее говно под названием инстасрам, блять, нагружает сеть на 1,5-2 секунды на, блять, 25-50 Мбит/сек, когда ты перелистывешь в их приложухе один пост: БЛЯТЬ, ты в их ебанной приложухе, сука, перелистываешься с одного поста на следующий, и у тебя в этот момент, блять, нагрузка на сеть в 25-50 Мбит/сек в течении полутора-двух секунд, сука!!!!!!! Ты не хуйнул пальцем с дури по экрану смартфона, чтобы, блять, долистаться до середины всех постов, блять, за всю историю этой ебанной соц. сети, а просто пролистнул тихо, спокойно на след. пост в твоей выдаче!!!!!!!!!!!!! Ебать, веб-макаки шо вы, блять, делаете??????????!!!!!!!!!!!!!!
Понятно, что эти дебилы считают байты в уме только в фильмах как можно быстрее хотят выложить свою приложуху, чтобы захватить часть рынка, а дальше, блять, ебануто-огромными обновами всё стараться допилить, но также обсираться, как попрёт. Вот тут-то и помогут эти нейронки, потому что, когда не будет затрачиваться время на то, чтобы дебилам веб-макакам писать код, после того, как уже на блок-схемах или, блять, в майнд-картах или ещё где-нибудь, но сука, главное, чтобы не в голове, а то голова этих дебилов разорвёртся из-за такой сложной инфы, задача разложена на мелкие подзадачи, эти самые мелкие подзадачи скармливать нейронке, а остальное время оптимизировать всё то, что она высрала. Вот тебе и "коллаборация" нейронки и ревёрс-инженера, с навыками дизассемблирования. Так что и по времени и по деньгам будет примерно всё равно, но только приложуха, с большой долей вероятности, будет уже оптимизрована и ахуенна.
Как же у питонической шлюхи горит то!!!!!!!!!! Полыхает!!!!!!!!!!!! Мы байтоёбы тебя заменим, сучка!! Бойся нас и нейронок!!!!!!
> этот первый ответ уровня гороскопа в газете по обобщенности
И че, скоро у твоих нейросеток появится интуиция? А свои собственные суждения она вообще научиться делать?
Как же припикает то!!! Это боевая картиночка, похоже, многим суть на них раскрывает!!!!! Каааааайф!!!
> Мы байтоёбы тебя заменим, сучка!! Бойся нас и нейронок!!!!!!
ты смотри там от голода не умри байтоебик лол
300кнс то у меня 😉
>>606283
> интуиция
есть у меня, и просто пёхая её вопросами она реально вытаскивала меня на верный путь в казалось бы безвыходной ситуации (дико всратая апишка которую я не имел ни возможности ни времени дебажить)
> свои собственные суждения она
пусть запихает себе в электронное очко
я не двачной додик, я сам осужу кого хочешь
>300кнс то у меня
Чел, просто ты не понимаешь куда всё движется, потому что ты что-то бОльшее, чем мат. анализ и теор. вера, чтобы обучать свои нейроночки, не изучал. Чел, мне тебя искренне жаль, потому что ты сейчас со своим замыленным взгладом от того, что у тебя всё получается, роешь себе же могилу, обучая нейроночки. Я уже вижу твою голодную смерть, через 3-4 года.
> мат. анализ и теор. вера
нахуй не нужны, это все форс для додиков-даунов и тупорылых скотопидорашьих кабанов, которые не могут отличить DS от CS
> Я уже вижу твою голодную смерть, через 3-4 года.
додик у меня жизненный путь такой что ты охуеешь, я долго искал себя, зарабатывал деньги, достигал совершенства и двигался дальше, датасаенс (графон, а не статка ссаная) идеально ложится на мою био-нейросеть и я бы не хотел никем другим работать, но это не значит что я забыл свои прошлые скилзы (проф студийная фотография, традиционный и сж арт, поли и солид сриде моделенг, процедурная генерация, геймдев в еуче, теч арт)
плюс у меня два велосипеда (электро и обычный) и мотоцикл
я занимаюсь накатом свободной прошивки на вело-моторчик и постепенно вкатываюсь в низину, чтобы вдальнейшем переключиться на мотоциклетные мозги, и сносить нахуй эту пропритарную пидарастию(и потом хочу заебашить контроллер подвески и всякую йобу типа селф драйва с хайв майндом для чиловой езды в колонне на 300кмч), а с более широким появлением электрокаров - этой пидорастии будет в разы больше просто оцени сука полет мысли и амбиции чмо
ну и плюс слесарные навыки, и умение варить тигом в инертной среде аргона
ну и совсем уж с натяжкой могу уйти в промальп, но там замкадские скотоублюдки, а в москве автовышки, так что такое
поэтому додик умрешь от голода ты, а я всегда найду чем заниматься по кайфу и рубить ловешку даже в постядерный апокалипсис.
>на мотоциклетные мозги, и сносить нахуй эту пропритарную пидарастию
Представил новости того периода:
Увеличение количества "хрустиков" в 15,6 раз власти связывают с неким программистом. Дело под свой контроль взял лично Министр Внутренних Дел.
>чем заниматься по кайфу и рубить ловешку
В итоге, после новости выше, оказавшись на зоне, ты не долго думая, понимаешь как рубить ловешку, продавая свои услуги(ротешник и очелло), что не нравится главным авторитетам этой зоны, ибо петуч это бесплатные ротешник и очелло, а этот просит деньги, твоим дыркам устраивают:
>ядерный апокалипсис
> количества "хрустиков
это константа, ты просто туповатый додик нихуя не разбирающийся в вопросе
мотоцикл не прощает даунов ты был бы гарантированно уничтожен таким образом поддерживается тесная взаимосвязь внутри братства
если жив - значит достоен доверия.
ну а наматываются на столб всякие нищие шакальники, одухотворенные и тупопёздные отбросы, ебливые позеры со шкурами, ну и анскильные говнари подпивасники
таким образом планета очищается, мир становится лучше
жаль у клеточных нет подобного механизма
> на зоне
кодеры это привелигированная каста, они пилят софт за еду, либо делают прозвоны и наебывают твою ебанутую бабку и мамку на бабки
>это константа
Туповатый додик тут только ты! Собираешься запускать авто-пилотные мотоциклы, но не знаешь того, что автопилот не с неба берётся, а его обучают, а в ходе обучения могут происходить разные казусы. Казусы, которые связаны с обучением твоей нейронки, я уже описал, и это похоже на правду, потому что ты туповатый додик, который не может связать А с Б. Этот диалог окончен! Мне больше нечего донести до дегенерата (тебя).
Если идеализировать, что нейронка умеет самообучаться, именно делать выводы, то да, может она и сделает что то и даже кого-то заменит.
Но, т.к. работа любой программы ведётся всегда на стыке чтения схем, спецификации, документации, требований, и собственно написания кода то мне просто сложно представить как нейронка может чему-то помочь.
В эвристику, дедукцию, статистику может да. И то отдельных блоков, предварительно декомпозированной задачи, потом проверенной и дрписанной при необходимости.
Но не в написание кода и даже не в замену джунов, как это говорят.
А если вы считаете что написание инициализации это и есть повод замены джуна, ну это слабый повод, даже потроллить.
Я как занимавшийся электроникой могу сказать что даже симуляция железа эмуляция схем, ну это ОЧЕНЬ не точные данные. Все эти Верилоги, симуляторы электронных схем, полноплатформенные симуляторы железа, статические анализаторы кода пишутся крупными компаниями годами, а они все не могут полностью заменить реальную практику. Там можно только обкатать и сделать претест.
Это все выливается в огромные тайминги, а если ещё все это между собой соединить и подключить к нейросети это просто будет код живущий в своем манямирке, не более. Который после выхода из манямирке придется просто переписать, а не подправить delay_ns().
Ну, мой вывод такой: на данный момент замена ограничена не более чем отсутствием реального мыслительного процесса. Имитация мышления это не мышление. Машина не может сделать анализ больший чем написан в документе или написанный в коде. Это так себе затея. Тогда все программисты превратятся в техпичав по сути. А зачем тогда? Сидеть писать тонны бумаг, чтобы превращать из в код? Тогда и второй вопрос встаёт - рентабельность бесконечной декомпозиции задач.
какой же ты блядь дегинерат сука ты элементарно прочитать ответ не можешь
ты явно малолетний дебил с клиповым мышлением и пятью секундами на чтения поста, дальше ты уже ниасиливаешь...
я прекрасно осведомлен со всеми особенностями, и я как геймдевелопер и течартист легко создаю обучающие датасеты в т.ч сейчас для оборонки
но это все не важно, потому ты даун, а я нет. я собираюсь прописывать движение в колонне, но с учетом окружения и нейро-предикта
Ясно! Школьник-фантазёр перед нами. Пока есть такая возможность, то учи математику и физику, особенно налегай на олимпиадные задачки по физике, потому что они хорошо развивают как логику, так и математический аппарат. И поменьше трать времени на двач, потому что это помойка. И не прерикайся с мамкой. Понял, школота???! А то приеду и ремня тебе всыплю!!!
Чел, это всё, если не учитывать то, что нейронки не будут дальше развиваться.
Не понимаю, почему ты так прицепился к декомпозиции задачи? Разве это не является нормальным решением любой мало-мальски сложной задачи? Конечно, тут можно пофантазировать, допустим, отталкиваясь от того, что а для чего программа разбивается на на подпрограммы? Разбивается она для того, чтобы этот код можно было читать людям. А, если весь код будут писать нейронки, то зачем тогда вообще декомпозитить программу? Получил пласт кода и норм. Правда, как это оптимизировать - хз? Но и тут можно придумать что-нибудь, исходя из соображения, что на уровне машинных команд, по сути все программы, допустим Word, Openoffice writer, Гугл док, etc, выглядят одинаково. Потому можно обучить нейронку, как бы мыслить паттернами, ну и оптимизировать эти её паттерны.
>Не понимаю, почему ты так прицепился к декомпозиции задачи? Разве это не является нормальным решением любой мало-мальски сложной задачи?
Да ты прав, любую задачу нужно декомпозировать. Но, я не просто так написал про мышление.
В жизни ты можешь вертеть декомпозицию как хочешь, если ты пишешь задачу человеку даже так (только без предирок, мы ж про абстрактную задачу):
"Посмотри документацию, там не соответствует действительности решение: галка "запомнить" при входе стоять не должна, поэтому у тебя автологин" в принципе все. Ты поверхностно описал техзадание, на один кейс. Сплочённая команда, где люди работают более полугода они варятся в задаче и поймут про что и как идёт речь. Им не надо рассумоливать.
В случае с компьютером, ты ему должен объяснить досконально что надо, о чём идёт речь, какое место в доке, про что ты точно говоришь и номер главы и пункта документа. Иначе тебе компьютер сделает чтобы ГАЛКА НЕ СТОЯЛА,а логику не поменяет.
Другими словами ты будешь писать человеческими словами программный код. Только мнемоника поменялась.
Далее, я говорил про рентабельность. Например, при появлении мультиплексора исчезла такая профессия как переключатель телефонной линии.
А вот при изобритении конвейера профессия упаковщик и мерчендайзер остались. Хотя конвейер это два моторчика, да и что стоит сделать в Ашане автоматизированные полки, которые будут подвозить товар на ленте со склада к стеллажам? И вообще товар раскладывать не надо будет, можно сделать вообще чтобы на складе был всего один оператор, который кнопки нажимает, а на лентах товары по всему магазину ездят, да?
Но это нерентабельно. Как и нерентабельно рассусоливать такие задачи компьютеру:
"Нужно сделать имитацию двух катушек индуктивности, и посмотреть на каком расстоянии они вместе увеличивают индуктивность, а при каком расстоянии они ее уменьшают, потом сымитуруй установку в вращающуюся шестерню из железа и сними на основе этих данных напиши программу которая будет менять предельную частоту" - это реальная задача у нас была (называется скоростемер в автомобиле). А такую задачу даже SPICE не справится очень много внешних факторов. А теперь представь сколько нужно сымитировать вводных данных, физических свойств, погрешностей, и прочего.
Вот тут легче взять паяльник и за пять минут спаять, поднести к шестерне и мультиметром тыкнуть. Вот задача на стыке требований и кода. Тут кода не будет пока не удовлетворяет все требования.
Таких задач масса. Даже схемы элементарно читать.
Анон, я не хочу сказать что все пиздец нейронки говно и не нужно. Но круг задач очень сужается какая бы она умная не была. Ещё раз:
рентабельность, глубочайшая декомпозиция, программист пишет текст а не код и является прослойкой для нейронки.
Если и сейчас взглянуть на мир как в примерах выше, технологии появились, но не все заменили, но все же облегчили.
>Не понимаю, почему ты так прицепился к декомпозиции задачи? Разве это не является нормальным решением любой мало-мальски сложной задачи?
Да ты прав, любую задачу нужно декомпозировать. Но, я не просто так написал про мышление.
В жизни ты можешь вертеть декомпозицию как хочешь, если ты пишешь задачу человеку даже так (только без предирок, мы ж про абстрактную задачу):
"Посмотри документацию, там не соответствует действительности решение: галка "запомнить" при входе стоять не должна, поэтому у тебя автологин" в принципе все. Ты поверхностно описал техзадание, на один кейс. Сплочённая команда, где люди работают более полугода они варятся в задаче и поймут про что и как идёт речь. Им не надо рассумоливать.
В случае с компьютером, ты ему должен объяснить досконально что надо, о чём идёт речь, какое место в доке, про что ты точно говоришь и номер главы и пункта документа. Иначе тебе компьютер сделает чтобы ГАЛКА НЕ СТОЯЛА,а логику не поменяет.
Другими словами ты будешь писать человеческими словами программный код. Только мнемоника поменялась.
Далее, я говорил про рентабельность. Например, при появлении мультиплексора исчезла такая профессия как переключатель телефонной линии.
А вот при изобритении конвейера профессия упаковщик и мерчендайзер остались. Хотя конвейер это два моторчика, да и что стоит сделать в Ашане автоматизированные полки, которые будут подвозить товар на ленте со склада к стеллажам? И вообще товар раскладывать не надо будет, можно сделать вообще чтобы на складе был всего один оператор, который кнопки нажимает, а на лентах товары по всему магазину ездят, да?
Но это нерентабельно. Как и нерентабельно рассусоливать такие задачи компьютеру:
"Нужно сделать имитацию двух катушек индуктивности, и посмотреть на каком расстоянии они вместе увеличивают индуктивность, а при каком расстоянии они ее уменьшают, потом сымитуруй установку в вращающуюся шестерню из железа и сними на основе этих данных напиши программу которая будет менять предельную частоту" - это реальная задача у нас была (называется скоростемер в автомобиле). А такую задачу даже SPICE не справится очень много внешних факторов. А теперь представь сколько нужно сымитировать вводных данных, физических свойств, погрешностей, и прочего.
Вот тут легче взять паяльник и за пять минут спаять, поднести к шестерне и мультиметром тыкнуть. Вот задача на стыке требований и кода. Тут кода не будет пока не удовлетворяет все требования.
Таких задач масса. Даже схемы элементарно читать.
Анон, я не хочу сказать что все пиздец нейронки говно и не нужно. Но круг задач очень сужается какая бы она умная не была. Ещё раз:
рентабельность, глубочайшая декомпозиция, программист пишет текст а не код и является прослойкой для нейронки.
Если и сейчас взглянуть на мир как в примерах выше, технологии появились, но не все заменили, но все же облегчили.
Жиза, большая часть разрабов мыслят о мире, только как о цифровом, потому что ни разу не физики и не инженеры.
Если перейти к физике, то там люди на порядке лучше нейронок решают проблемы, которые появляются в процессе исследования и разработок.
нет)
Какая твоя игра на этом твг, датасаентист?
Я выделяю массив "a" в куче, потом передаю туда байты используя ReadConsoleW, выделяю массив "b" в стеке размером wcslen(a)+2, далее копирую из массива "a" набор байтов меньше на 2 в массив "b" используя wmemcpy, т.е. wmemcpy(b,a, wcslen(a)-2), НО происходит ошибка, gdb показывает что в массиве "b" хранится лишний символ "P" который я явно не передавал в консоль.
(gdb) x/20ch copy
0x61fd70: 102 'f' 105 'i' 108 'l' 101 'e' 95 '_' 56 '8' 60 '<' 79 'O'
0x61fd80: 46 '.' 116 't' 120 'x' 116 't' 80 'P' 0 '\000' 0 '\000' 0 '\000'
0x61fd90: -32 'а' 22 '\026' 0 '\000' 0 '\000'
(платформа шиндовс, x64 )
Я если честно не могу там разобрать что ты понаписал. Ты бы лучше скриншот памяти показал и все.
Вот такие вот ребята приходят на митинг и хуярят хуй пойми что какие-то байты, биты, еще что-то там, потом переходы, возвраты. Уже голова на третьем предложении взрывается. И он там стоит 5 минут монолог читает, все молчат, а тимлид покорно кивает головой. Потом его это доебет он говорит: "Ну ты там в таску свои исследования кратко прикрепи... Давайте, кто там следующий?".
А так, если ты с клавы что-то вводил, может у тебя там нуль-терминатор.
>>607957
А можешь подсказать, как правильно сделать снимок памяти, нужно что-то вроде такого ?
(gdb) x/20i copy
0x61fd70: data16 add %ch,0x0(%rcx)
0x61fd74: insb (%dx),%es:(%rdi)
0x61fd75: add %ah,0x0(%rbp)
0x61fd78: pop %rdi
0x61fd79: add %bh,(%rax)
0x61fd7b: add $0x3c,%al
0x61fd7d: add $0x4f,%al
0x61fd7f: add $0x2e,%al
0x61fd81: add %dh,0x78(%rax,%rax,1)
0x61fd85: add %dh,0x50(%rax,%rax,1)
0x61fd89: add %al,(%rax)
0x61fd8b: add %al,(%rax)
0x61fd8d: add %al,(%rax)
0x61fd8f: add %ah,%al
0x61fd91: (bad)
0x61fd92: mov $0x0,%esp
0x61fd97: add %bh,%cl
0x61fd99: adc $0x40,%eax
0x61fd9e: add %al,(%rax)
0x61fda0: loopne 0x61fdb8
Ты ток не злись на меня, мне стыдно в этом признаваться, но я глупенький пока, учусь работать с отладчиками, пока работаю с gdb, и не в курсе как правильно сделать снапшот памяти...
Или тебе нужен вывод (gdb) info all-registers ?
Да скриншот обычный оперативки в отладке. Там байты есть.
Вот этого я просил.
>0x61fd70:
>0x61fd80:
>0x61fd90:
Просто то что ты написал ну совсем непонтно и нечитаемо.
Ты сюда смотрел?
https://en.cppreference.com/w/c/string/wide/wcslen
Посмотри что в массивах до введения в них данных и после.
Может ты когда массив выделяешь он забивается мусором?
Я другой но для этого есть мемсет 0 при инициализации чего либо
>Посмотри что в массивах до введения в них данных и после.
>Может ты когда массив выделяешь он забивается мусором?
Я посмотрел, а там мусор...там ведь нули должны быть ?
Я думал при объявлении массива в стеке, он автоматически нулями заполняется, а там каши.... bylaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
ну теперь знаешь, что выделение памяти, если это не специальная функция, не присваивает никакие дефолтные значения, потому что это не всегда нужно, а ресурсы отъедает, поэтому если в твоей задаче это необходимо, то просто дописываешь зануление или какими там значениями тебе нужно
386x480, 0:53
Самое обидное что я про это знал, но совсем забыл....
В общем, спасибо анон за помощь, хорошей ночи и хороших снов тебе.
да, кониох написал, но прикол в том что даже без него программа работает так же, +принтф работает без стдио
Это какая-то идэешка, что ли? Раз так, то беги в отладчик, смотреть почему программа не работает так, как запланировал.
Хз, анон, на стаке пишут, что это баг в винде и кто-то советует на прямую компилить программу, либо попробуй добавить заголовочный файл stdlib.h
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <locale.h>
int main() {
setlocale(LC_ALL, "Rus");
// Создаём сетку
int Biom[20][15];
for(int y_pos=0; y_pos<19; y_pos++) {
for(int x_pos=0; x_pos<14; x_pos++) {
Biom[y_pos][x_pos] = 0;
}
}
// Строим стены
for(int x_pos=0; x_pos<14; x_pos++) {
Biom[0][x_pos] = 1;
}
for(int x_pos=0; x_pos<14; x_pos++) {
Biom[18][x_pos] = 1;
}
for(int y_pos=1; y_pos<18; y_pos++) {
Biom[y_pos][0] = 1;
}
for(int y_pos=1; y_pos<18; y_pos++) {
Biom[y_pos][13] = 1;
}
// Точка спавна собаки
Biom[10][9] = 5;
int Dog_x = 9;
int Dog_y = 10;
printf("Нажмите любую клавишу для старта\n");
char Key = getch();
while (Key != "r") {
system("cls");
printf("Предыдущая команда: %c\n", Key);
printf("Dog_x: %d\n", Dog_x);
printf("Dog_y: %d\n", Dog_y);
for(int y_pos=0; y_pos<19; y_pos++) {
for(int x_pos=0; x_pos<14; x_pos++) {
printf(" %d", Biom[y_pos][x_pos]);
}
printf("\n");
}
Key = getch();
if (Key == "w") {
Biom[Dog_y][Dog_x] = 0;
Biom[Dog_y-1][Dog_x] = 5;
Dog_y--;
}
else if (Key == "s") {
Biom[Dog_y][Dog_x] = 0;
Biom[Dog_y+1][Dog_x] = 5;
Dog_y++;
}
else if (Key == "a") {
Biom[Dog_y][Dog_x] = 0;
Biom[Dog_y][Dog_x-1] = 5;
Dog_x--;
}
else if (Key == "d") {
Biom[Dog_y][Dog_x] = 0;
Biom[Dog_y][Dog_x+1] = 5;
Dog_x++;
}
}
}
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <locale.h>
int main() {
setlocale(LC_ALL, "Rus");
// Создаём сетку
int Biom[20][15];
for(int y_pos=0; y_pos<19; y_pos++) {
for(int x_pos=0; x_pos<14; x_pos++) {
Biom[y_pos][x_pos] = 0;
}
}
// Строим стены
for(int x_pos=0; x_pos<14; x_pos++) {
Biom[0][x_pos] = 1;
}
for(int x_pos=0; x_pos<14; x_pos++) {
Biom[18][x_pos] = 1;
}
for(int y_pos=1; y_pos<18; y_pos++) {
Biom[y_pos][0] = 1;
}
for(int y_pos=1; y_pos<18; y_pos++) {
Biom[y_pos][13] = 1;
}
// Точка спавна собаки
Biom[10][9] = 5;
int Dog_x = 9;
int Dog_y = 10;
printf("Нажмите любую клавишу для старта\n");
char Key = getch();
while (Key != "r") {
system("cls");
printf("Предыдущая команда: %c\n", Key);
printf("Dog_x: %d\n", Dog_x);
printf("Dog_y: %d\n", Dog_y);
for(int y_pos=0; y_pos<19; y_pos++) {
for(int x_pos=0; x_pos<14; x_pos++) {
printf(" %d", Biom[y_pos][x_pos]);
}
printf("\n");
}
Key = getch();
if (Key == "w") {
Biom[Dog_y][Dog_x] = 0;
Biom[Dog_y-1][Dog_x] = 5;
Dog_y--;
}
else if (Key == "s") {
Biom[Dog_y][Dog_x] = 0;
Biom[Dog_y+1][Dog_x] = 5;
Dog_y++;
}
else if (Key == "a") {
Biom[Dog_y][Dog_x] = 0;
Biom[Dog_y][Dog_x-1] = 5;
Dog_x--;
}
else if (Key == "d") {
Biom[Dog_y][Dog_x] = 0;
Biom[Dog_y][Dog_x+1] = 5;
Dog_x++;
}
}
}
Короче, во-первых, попробуй заюзать функцию getchar, во-вторых, у тебя идёт сравнение между целым и указателем на строку, потому что функция getchar или getch получает код символа, а не сам символ. Вот пример: это выход из цикла и я изменил твой код пик2 (114 это код символа "r"). Попробуй для начала заюзать getchar, а потом дальше иди.
scanf()
если что для ввода-вывода повсеместно sdl2 используют, лучше учи его сразу
Компиль напрямую, либо поставь себе на виртуалку убунту и кодь в ней через терминал, как диды. Обычно компилятор сообщает в чём проблема, при компиляции.
ещё какая то странная фигня, когда нажимаю esc, у строки "Dog_x:" пропадает буква D
Это явно баг идэешкия.
getchar возвращает тип int с ASCII кодом символа, а текст в двойных кавычках - это указатель на строку. Т.е. ты сравниваешь int с указателем.
Буква в одинарных кавычках - это как раз ASCII код символа, а не указатель на строку. Так что замени у себя в условиях двойные кавычки " на одинарные '
Двойные кавычки, одинарные, пять сортов каких-то скобочек, подчеркивания, табуляции. Почему нельзя сделать как у людей, и обозначать информацию общепринятыми методами a-zA-Z, а не какими-то манясимволами из глубин уникода?
а почему не выскакивает никакой ошибки, ведь Key инициализируется через char а не int
Неявное преобразование типов. Великом ту за клаб, так сказать.
МЛ- это датасаенс ?
Я видео взял из треда "субкота", вчера пару часов просидел в том треде, насмотревшись на котов и кошек, и мне оно тоже показалось очень милым, хотя надо всё таки было другое webm выложить, чтобы не было каверзных мыслей, ибо я не люблю педофилов, но в этом треде вроде как нормальный контингент, программисты, и таких персонажей тут нет надеюсь.
Ничего странного, как думаешь почему escape-последовательности в терминале называются ESCAPE-последовательностями.
> МЛ- это датасаенс ?
обвиосли
> не люблю педофилов
а насколько хорошо ты знаком с предметом чтобы столь категорично о нем отзываться?
для начала >=14 уже не педофилия, и даже в этой стране ты можешь завести жену этого возраста совершенно легально
а потом поразмысли над тем - насколько ребенок вырастет нисчастным и зашоренным двачером с зачморенными родителями скотопидарашками без любви и ласки
протестовать нужно против насилия (в той же шкале например) и против сука тупорылых ублюдков и неабортированных даунов (читай невежества) а от нормальных мужиков нужно просто взять и отъебаться нахуй
> программисты
люди думающие, а интеллект это не краник, его не прикрутишь, он работает всегда и как вода - постоянно точит рамки дозволенного, это рост братишка, это энтропия - так устроенна вселенная!
берешь полупрозрачную розовую пленку и она приклеивается к экрану под действием статического электричества
а вообще если ты серьезно, то вывод зависит от эмулятора консоли и операционной системы, по нормальному как выше написали бери sdl2
для консоли винды - ну вот тебе пример на разные цвета, выбирай, устанавливай
Смотри в википедии ANSI escape sequences
Слушай все люди не идеальны.
Вот ты считаешь нормальным, что например 40летняя чурка-педофил, толкает дурь крупными партиями и проводит время с 13-14 летними девочками ???!!!
А представь, что эта девочка будет твоей сестрой, или дочкой.
Я взял пример из реального мира, знаю о таком человеке и он к сожалению, сейчас на свободе.
Так что твои псевдо-филосовские рассуждения херня из под коня, ты зарываешься в своих абстракциях забывая о простой морали.
Предмет он блядь знает, ой пиздец....
А как "взять" sdl2? Не понял, что это значит
И с пикчи можно обьяснить, что этот цикл делает 255 раз?
Да нормальный видос, снимали же её родители и выкладывали потому что это выглядит смешно.
О чем люди думают то и пишут. Исходя из этого мнения можно вообще считать что нельзя выкладывать видео с маленькими девочками, а не то за педойфила примут.
>Не понял, что это значит
Забей. У тебя есть windows.h, его хватит.
>что этот цикл делает 255 раз
Печатает текст 256 раз (8 бит) разными цветами, очевидно же.
Спасибо.
> А представь, что эта девочка будет твоей сестрой, или дочкой.
тян не человек
если ты деспотичный додик-даун и считаешь детей своей безмозглой собственностью, то мне тебя жаль
минвайл жизнь так устроена - что чайлд при ините ролит рандом спеки, и хоть ты обосрись - но если чайлд сролил быть малолетней шлюхой и торчеебом (в зассаных дворах пидербурга), то это будет именно так и никак иначе
себе в тарелку смотри додик
если что то неустраивает зарабатывай на большее количество детей, сделай их 10 штук, и хотя бы один я думаю вырастет достойным человеком
ну а если ты тупорылая нищенка с двухзначным интеллектом, то тебе не нужны дети. ведь их основная функция это передача капитала, а у тебя его нет ахаха
так что отмени трясску и не завидуй успешным мужчинам с юга.
> Исходя из этого мнения можно вообще считать что нельзя выкладывать видео с маленькими девочками, а не то за педойфила примут
я бы так и сделал кстати
это самое натуральное растление малолетних
овуляшек с ютуба делающих из своих детей блядей на пожизненное нахуй, как и фк
>ЫГЫГЫГЫГГЫ МОРАЛФАААГГ В ТРЕДЕ, ЩА ЕГО ЗАТРАЛЛЮ ЫФХХЗВФПАХАХАХА ЫЫЫЫЫЫЫЫЫЫЫЫЫ
>Я ТИПА СМИЩНОЙ ТИПА ОЛД, КОРОЧ ВСЕМ СМИЯТЬСЯ, Я ЕГО ЗАТРАЛЛИЛ, ВСЕМ СМОТРИТЕ НА МИИЯНЯЯЯ ЫЫЫЫЭАЭАЭ
Дауненок, что ты забыл в этом треде ?
Пиздуй в /b/ыдлятню, там тебе будут рады.
Зря ты это написал дурачок, тролль мамкин)))
В отличие от /b/ этот тред долго не будут стирать, считай тебе повезло если ты сидишь через VPN+Tor)))
Посмотрим как ты будешь улыбаться, когда когда с тебе придут с обыском)))
Бери сразу ncurses. Там за тебя уже диды погуглили ansi цвета.
Ты сам не понимая того, демонстрируешь свой низкий интеллект.
Сначала ты писал что тян не человек, и то что педофилия это нормально >>609014
>так что отмени трясску и не завидуй успешным мужчинам с юга
Потом ты пытался "траллировать" и писал что выкладывать видео в которых есть девочки не нормально.
Ты сам того не понимая палишь себя, своей же тупостью.
Сам факт того что ты доебываешься до анонов, и засираешь этот тред, посвященный языку Си, уже не нормально.
Малолетний выблядок, ты занимаешься хуйней, портишь этот тред засоряя его мусором и доёбываясь до анонов, считаешь себя смешным и думаешь что твоя "псевдоанонимность" спасет тебя от ответственности и того что ты написал выше, но это не так, не забывай кому пренадлежит этот форум, не забывай что это не /b/ а когда нариману придёт запрос на твой ip-адрес, он особо мешкаться не будет (потому что должен по закону).
Я тебе дам совет, остановись анон, закрой вкладки с этим сайтом, посмотри фильм, почитай книгу или подготовься к экзаменам в своей школе/ПТУ или куда ты там ходишь, перестань портить этот тред и свою репутацию, пока ты не нахлобучил себе ещё больше проблем.
Тебе ведь не нужно, чтобы в 6 утра в квартире у твоих родителей выбивали дверь ?
какой же ты душный зачморенный низушник...
я не школьник, я уже давно знаю что анонимности не существует, i'm ok with it
> засираешь этот тред
это называется свободное общение, не, не слышал додик?
я увидел шебм с лолькой и мне пригорело от того что мл треды сносили из-за кривых нейро-лолей которых все обсуждали в техническом аспекте работы генерации
а что до моей позиции - я против педо-истерии, когда конченные кипишеры типа тебя или овуляшек на площадке - упаковывают рандом хуя присевшего на лавку передохнуть
или когда здоровая ебливая шалава сама скачет по хуям, но виноваты конечно же не они
поэтому пройди нахуй со своим манямиром и трясской.
Двачедаун ебанный, вжлинк мамкин, посмотрим кто из нас додик, и кто трястись будет, когда к тебе и твоим родакам в 4-6 утра придут дяди в форме, когда заберут твой комп. (и не только), твои родители будут визжать и охуевать от сыночки-долбоеба, а ты будешь с сонливым испуганным ебалом, своим тоненьким голосочком, оправдывать перед камерой всё что ты тут написал, следователь с радостью запишет это в рапорт)))
Анон хватит спорить с дебилом. Ты ж понимаешь, что он будет стоять до последнего, оставляя последнее слово за собой. Маняврирует, ставит анонов в неловкое положение за видосы, пишет что он против педоистерии, хотя триггерится на видос как педоистеричка.
Я вот вообще увидел в том видео, что анон >>607998 хочет показать, типа он как кот пытается что-то понять внимательно слушая других анонов, и было в тему, кстати.
Так что отпусти ситуацию, чуваку просто надо свое говно излить, поизливает да съебет.
> эти жирные набросы на датасаентиста который до сих пор не уехал из этой страны
> (хотя были оферы и линкед мой китайцы чекают регулярно)
=)
А зачем одно и тоже печатать столько раз?
потому что ты долбоеб даже в душе не едешь как он работает. Мать твою ебали всем отделом
Тип Переменная Операция присваивания Функция(Константа);
получаешь ссылку на консоль вывода своего приложения
потом с помощью ссылки на эту консоль, настраиваешь ее "стиль" вывода внутри цикла
*выходного буфера
%d
%i
%е
%f
%g
%о
%s
%x
%р
%n
%u
%[]Читает одиночные символы
Читает десятичное число
Читает десятичное число
Читает число с плавающей запятой
Читает число с плавающей запятой
Читает число с плавающей запятой
Читает восьмеричное число
Читает строку
Читает шестнадцатиричное число
Читает указатель
Получает целочисленное значение, равное числу прочитанных символов
Читает беззнаковое целое
Сканирует множество
А почему столько одинаковых знаков для одного и того же?
%d
%i
%е
%f
%g
%о
%s
%x
%р
%n
%u
%[]Читает одиночные символы
Читает десятичное число
Читает десятичное число
Читает число с плавающей запятой
Читает число с плавающей запятой
Читает число с плавающей запятой
Читает восьмеричное число
Читает строку
Читает шестнадцатиричное число
Читает указатель
Получает целочисленное значение, равное числу прочитанных символов
Читает беззнаковое целое
Сканирует множество
А почему столько одинаковых знаков для одного и того же?
Видимо оставлены по аналогии с printf. Хотя при выводе это не совсем одно и то же, наприме %e выводит в научной записи. (1.2e+2).
Не совсем строка, потому что нет завершающего 0. Поэтому просто массив из двух байт, 8 и 9. Char часто обозначает просто байт, а уж по совместительству массивы байт могут являться строками в кодировке ascii.
Да точно, это байты
>для одного и того же
Это не одно и тоже! Это разные типы данных, которые занимают различный объём памяти: https://metanit.com/c/tutorial/2.3.php
Вот тебе ещё скрины из книги Столярова:
500x500, 2:22
>>607987
Кстати анон, тут ещё такой прикол...
Когда я объявлял массив я использовал длину другого массива, т.е. что-то вроде такого:
short unsigned int new_array[wcslen(dif_array)]
Теперь то я знаю что так делать нельзя, т.к. получается этот массив будет иметь неопределенное поведение, для таких целей нужно использовать выделение в куче calloc() и memset() (чтобы избавить массив от мусора и заполнить нулями на начальном этапе), я правильно понимаю, или есть какой-то способ попроще?
ну если тебе массив определенного размера int array[4] - создаст массив из четырех интов на стеке
если тебе массив в куче, то любым из alloc-ов:
void malloc(size_t size) - выдаст тебе указатель на первый байт области памяти, что ты выделил, т.е. если тебе нужно 4 инта, каждый который по 4 байта, то тебе нужно size = 4 4
аналогично можно calloс(4,4 )
memset-ом ты можешь заполнить область памяти какими-то значениями,:
memset (src, 'a', 10) - заполнить десятью символами 'a'
а вообще подводных много
https://habr.com/ru/post/272269/
368x360, 0:41
Спасибо за ссылку анон :З
действительно можно же из сишки сделать самый топовый языкг псоле липса конеша
Ещё есть ньюанс, функция malloc выделяет память, которая будет содержать неопределенные значения, а calloc выделяет память и заполняет её нулями.
Или вот ещё прикол.
Думаешь что объявление в функции
char *str = "stroka";
и
char str[] = "stroka";
это одно и то же?
А вот и нет.
В первом случае память со строкой будет доступна и после выхода из функции, а во втором случае строка создаётся в стеке функции, который перестанет сосуществовать после выхода из функции.
>В первом случае
Память не выделяется в принципе, юзвер просто срет по адресу в созданном указателе говном. Если в следующей строчке юзвер создаст еще один указатель, который попадет в расположенный рядом участок памяти, программа вместо выполнения пошлет юзвера на хуi.
Вот это я имею в виду. Записать в такую строку не получится, поскольку та память защищена флагом в операционной системе, но если бы получилось, то изменились все три строки, поскольку видно что везде используется один и тот же адрес.
>char *str = "stroka";
>и
>char str[] = "stroka";
>это одно и то же?
Ну нет, я не настолько плохо знаю Си.
Я уже чего только не делал с массивами и указателями (двойными, тройными и т.д.)
А так да, ты всё верно подметил, я только недавно, посмотрев в очередной раз в отладчике, заметил что при вызове calloc массив при инициализации заполняется нулями.
А под юзвером ты имеешь ввиду обычного пользователя программы ?
И что ты мне это подсовываешь, шиз? Таблетки надо было принимать твоей мамашке, когда она была тобою беременна, так бы, возможно, у мира было бы в распоряжении на одного дегенерата меньше.
Как ты это объяснишь, уёба:
>%c
>%d
?
2-й том, где речь идёт про основы языка Си.
Да вроде только при первом запросе на выделение страниц процессом. В целях безопасности, чтобы данные из старого процесса не попали в хитрые лапки.
Под каждое устройство, операционку и железо свои либи и api.
Мне кажется без asmа особо далеко не уйдешь на одном Си.
Вот пример написания драйвера (на Си, то что там C++ на смотри, просто по умолчанию в доке все примеры под плюсы пишутся, хотя там чисто сишный код) из документации Microsoft.
https://learn.microsoft.com/ru-ru/windows-hardware/drivers/gettingstarted/writing-a-very-small-kmdf--driver
наверное для начала надо определиться что за драйвер ты хочешь сделать и для чего
Изучи API операционки, под которую будешь писать драйвер.
Например, вот для Linux https://www.kernel.org/doc/html/v4.11/driver-api/index.html
Ещё нужно изучить собственно саму железку, для которой будешь писать драйвер (Datasheet) и интерфейс, к которому подключена железка, например, PCI, SPI и т.д.
Ну и общие принципы драйверописания (что такое IRQ, DMA, режим ядра, пространство ввода-вывода и т.д).
Знание ассемблера при написании скорее всего не понадобится, но бывает полезно при отладке.
Наверное проще всего найти какую-нибудь книгу по написанию драйверов, типа такой http://dmilvdv.narod.ru/Translate/LDD3/Linux_Device_Drivers_3_ru.pdf
Только эта книга 2005г, там версия ядра Linux 2.6.10.
Лучше найди что-нибудь похожее, но по новее.
Ещё пригодится https://wiki.osdev.org/Expanded_Main_Page
Ещё можешь найти на торрентах книги Гук М.Ю. по интерфейсам. Правда они тоже старые, но могут пригодится, поскольку интерфейсы не так быстро меняются.
Спасибо анон.
Я уже узнал, оказывается HeapAlloc лучше использовать при вызове из DLL, т.к. при вызове malloc из DLL нужно оттуда же вызывать free, иначе существует вероятность повредить данные выделенные в куче, а лучше всего, если пишешь под винду всегда использовать HepAlloc, и дело тут не в проприетарности, а в том что винда так устроена.
Но я пока что на этапе лишь изучения джедайских искусств, поэтому обхожусь статической линковкой без использования DLL и использую malloc (не смотря на частое использование методов WinAPI).
Actually, malloc() (and other C runtime heap functions) are module dependant, which means that if you call malloc() in code from one module (i.e. a DLL), then you should call free() within code of the same module or you could suffer some pretty bad heap corruption (and this has been well documented). Using HeapAlloc() with GetProcessHeap() instead of malloc(), including overloading new and delete operators to make use of such, allow you to pass dynamically allocated objects between modules and not have to worry about memory corruption if memory is allocated in code of one module and freed in code of another module once the pointer to a block of memory has been passed across to an external module.
https://stackoverflow.com/questions/8224347/malloc-vs-heapalloc
>aligned_alloc
Почитал про эту функцию, спасибо анон.
Надо бы это в дизассемблере посмотреть... но мне лень
БЛЯДЬ ИДИ НАХУЙ ПЕТУХ!!!!
Я ТЕБЕ УЖЕ ПИСАЛ, СУКА ТЕБЕ МАЛО БЫЛО ПЕТУШОНИКС ЕБУЧИЙ!!!?
РЕШИЛ ЧТО ТЫ ЛИНУКСОИД НО ТЫ НИХУЯ СКОРЕЕ ВСЕГО НЕ ЗНАЕШЬ ПРО ЛИНУКС, ТВОЙ УРОВЕНЬ ЭТО МАКСИМУМ UBUNTU СКАЧАТЬ ЧТОБЫ В ВК ПОСИДЕТЬ И РАССКАЗАТЬ ВСЕМ КАКОЙ ТЫ ОХУЕННЫЙ ЛИНУКСОИД, ИДИ К ЧЁРТУ СО СВОИМ ТУПЫМ ЖИРНЫМ ТРОЛЛИНГОМ, ПЕРЕСТАНЬ ПОРТИТЬ ТРЕД, ЛУЧШЕ ПОМОГИ АНОНУ, А ЕСЛИ НЕ МОЖЕШЬ ПОМОЧЬ, ТО ИДИ НА ХУЙ ИЗ ТРЕДА СУКА!!!
ЭТОТ ТРЕД СОЗДАН ДЛЯ ПОДДЕРЖКИ, ВЗАИМОПОМОЩИ ДРУГ ДРУГА В ТЕХНИЧЕСКИХ ВОПРОСАХ, А НЕ ДЛЯ ТУПОГО ТРОЛЛИНГА, ИДИ В /b/ БЛЯДЬ!!!
Да.
>>614688
>...
Ещё раз прошу прощения, просто это тематический тред, сильно раздражает когда много пишут всякие клоуны не в тему, и засоряют тред всяким мусором, а он и так еле живой.
Всё таки я рассматриваю это место как площадку, где аноны могут обмениваться технической информацией, давать полезные советы, делиться опытом, ссылками на статьи и литературу, помогать друг другу.
На Ютубе есть некий Александр Григорин, продает свои курсы по программированию, подскажите, есть ли у него GitHub или типо того, просто хотелось бы посмотреть на его код-стайл или хотя бы уровень сложности кода, а то слова-то красивые подаёт, но смущает, что сидит на дваче, да и к тому же сидит на тупичке Гоблина и смотрит его до сих пор, да и прогоняет слишком популистские темы
Если у него норм курс, то уже давно должен на рутрекере лежать бесплатно, там и посмотри.
Меня больше ебет то, что он о себе говорит, какой-то он мутный и слишком выебистый, говорит, что участвовал в написании софта для китайских ледоколов и писал программы по типу CAD для графики, вот и интересует соответствует ли его гонор с его реальными заслугами
А за совет спасибо, поищу, только боюсь, что на рутрекеры выкладывают проги со всякими malware
Если сомневаешься в раздаче, скачай на линуксе или в виртуалку и глянь, что там. Хз, какой малварь может быть в раздаче с видеозаписями, максимум раржипег какой-нибудь, и то врядли.
ВМ это часть диска в любом случае, вирус может и дальше распространиться
У меня просто на Винде стала командная строка появляться внезапно, боюсь как бы какой-то вирус или программу шифровальщик, или ещё хуже программа вор не закачал, проверял Malware bytes, ничего не нашло, из-за чего причина, как думаете, анончики
Судя по всему люди разбили лбы себе из-за моих слов, прошу прощения, плохо разбираюсь
>У меня просто на Винде стала командная строка появляться внезапно, боюсь как бы какой-то вирус или программу шифровальщик
Шифровальщик маловероятно, ты как обычный пользователь скорее всего не подцепишь шифровальщика (а если подцепишь то он не станет работать), тем более если ты находишься в RU (как бы это печально не звучало, но все серьезные шифровальщики из России)..
Почитай ещё вот это будет полезно:
https://support.microsoft.com/ru-ru/topic/%D1%80%D0%B5%D0%BA%D0%BE%D0%BC%D0%B5%D0%BD%D0%B4%D0%B0%D1%86%D0%B8%D0%B8-%D0%BF%D0%BE-%D0%BF%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B5-%D0%B2%D0%B8%D1%80%D1%83%D1%81%D0%BE%D0%B2-enterprise-%D0%BA%D0%BE%D0%BC%D0%BF%D1%8C%D1%8E%D1%82%D0%B5%D1%80%D0%B0%D1%85-%D1%81-windows-%D0%B8%D0%BB%D0%B8-windows-server-kb822158-c067a732-f24a-9079-d240-3733e39b40bc
Хак. группировки которые зарабатывают на шифровальщиках, интересуют в основном крупные акулы бизнеса, их задача, это в первую очередь взломать корпоративную сеть, скомпрометировать контроллер домена, удалить бэкапы, "выпустить своего монстра" чтобы зашифровать сеть, и выставить ценник на миллионы долларов, а обычные юзеры из RU их не интересуют, так что на счёт шифровальщиков расслабься.
Там смищнее, они ищут партнеров, которые внедряют их малварь на найденные сочные цели за комисионные от выкупа, лол.
Да знаю, просто не написал об этом.
*смишнее
Спасибо за совет и ссылочку, собственно Defender я не выключал, он у меня всегда стоит по дефолту, просто скачал малварьбайтс и сканирую иногда систему, а картинка сразу навеяла воспоминания о байках Мурка, где он рассказывал как его вызвал фотограф, чтобы закинуть денег на биткоин кошелек, чтобы получить ключ для расшифровки своих файлов
Например?
По его фразам и приколам иногда прослеживается что-то битардское, но я думаю, что это отпечаток той интернет культуры, которая была в его молодости. Не обязательно, что он сейчас капчует.
Типо в середине видео останавливается, и спрашивает:"Хуй будешь?", или представляется в начале на Японском: "хай-ме-ма-ши-тэ, ва-ТА-ши НО на-МА-е ва Александр Григорин де-су." ?
>для китайских ледоколов
Не, ну, если он писал такой софт, чтобы взламывать в киберпространстве какие-нибудь "Орасаки" или "Дойче Накасоне", то это, конечно, серьёзнейший тип и ему стоит верить и ему и его скилам. Это однозначно!
кто то пилить софт десктопный под гном линупсовый?
есть что путевое почитать по vala и gnome sdk gobjects ?
1280x720, 0:20
Кто может подсказать, в чём сцуко проблема?
Почему такие охуевшие визуальные баги?
Линия должна по сути, просто связывать два прямоугольника, но она ведёт себя как ебанутая, когда начинаешь прямоугольники двигать.
Так, извините - я тредом ошибся
Угу, так и есть, он говорил вроде бы, что даже там на верфи был, не знаю, можно ли ему верить, так как никаких документов не показывал, а это настораживает
int len;
double vla[len]; //UB, понятно потому что len неопределено
printf("sizeof vla = %zu\n", sizeof vla);
int len = 0;
double vla[len]; //UB, хотя возможно есть расширение компилятора
printf("sizeof vla = %zu\n", sizeof vla);
int len = 100;
double vla[len]; //ну тут то все в порядке?
printf("sizeof vla = %zu\n", sizeof vla); //бабах - UB, evaluation of uninitialized vla
Еще красивое
int m = 10, n = 20;
double A[n][m];
int i = 0, j = 0;
printf("sizeof is %zu\n", sizeof A[++j][++i]);
printf("now j is %d, i is %d\n", j, i);
printf("sizeof is %zu\n", sizeof A[++j]);
printf("now j is %d\n", j); // what is printed here? 0, 1, or 2?
С напишет нуль, а вот что С++ не знаю, я из cpp функцию printf не вызывал (но думаю тоже самое).
И вообще, что за тупой вопрос, как там может быть 1 or 2 если там j со значением 0 ?
Анон, ты настоящий Джокер.
Объясни пожалуйста, почему префиксный инкремент ++j,
сработал на printf("sizeof is %zu\n", sizeof A[++j]);, с другой стороны мы знаем что А - это указатель, значит можем привести к виду *(A+j=j+1), получается сначала срабатывает доступ к элементу, но лишь потом инкрементируется j т.е. как две последовательные операции, именно поэтому j увеличивается на 1 только после явного указания A[++j], я правильно понял ?
Мне это будет сложно объяснить. Автор загадки пишет, что A[++j][++i] не срабатывает, потому что компилятор точно видит что там просто double (из double A[n][m];)
А sizeof A[++j] срабатывает, потому что компилятор видит тип VLA, double[*]
По видимому, фокус в том, что sizeof от VLA должен работать в рантайме, а не в компайл тайме...
640x360, 2:54
>что sizeof от VLA должен работать в рантайме
Лол, буквально недавно поднимал эту тему, про инициализацию таких массивов в автоматической памяти, и мне никто не смог дать нормального ответа, и тем более ничего не писали про VLA, но у меня ошибка в коде была в том что я ещё забывал правильно инициализировать массивы в стеке (и в куче), из-за чего он содержал изначально мусор и программа неправильно работала, а всего то нужно было его нулями затирать.... но это уже другая история.
Спасибо анон за VLA.
Если в куче, то вроде как можно просто calloc место malloc использовать.
А инициализация нулями в современных Сях пишется char arr[100] = {0}, но на VLA это почему то не работает.
там вроде у вэйланда косяки, поэтому его не торопятся добавлять
https://www.opennet.ru/opennews/art.shtml?num=57038
>сдл
> какаято нинужная проприетарная парша
открытая либа, повсеместный стандарт... а я смотрю ты в теме
https://habr.com/ru/post/707032/
> всё говно: sdl
это одна из самых быстрых кроссплатформенный и наиболее проработанных, которая используется везде от стима до UE
> даже круг нарисовать не умеет. Есть чё попроще? Для начинающего? Типа вот это фон, вот кружок нарисуй вот спиральку теперь очистки экран кроме фона. А не вызывай 20 функций для этого и мурыжь текстуры туда сюда обратно
а вот это, что ты описываешь, вместо мурыженья текстур - это как раз и есть говно и тормоза, сначала разберись в вопросе, а уже потом свое ценное мнение оставляй про скорость работы
для начинающих, кому скорость не нужна, а нужно просто рисование каких-то примитивов есть всякие либы надстройки, открываешь гугл и находишь любую понравившуюся
https://www.ferzkopp.net/Software/SDL2_gfx/Docs/html/index.html
только в современном мире в реальных приложения отрисовка на холсте старыми методами винды уже давно в прошлом, используют контекст рендера opengl, так и даже он уже последние года отсиживает и вытесняется вулканом с одной стороны и wgpu с другой
функций как нарисовать круг/спиральку на чистом SDL2 в гугле тоже вагон, просто копируй и используй, но новички видимо теперь даже в гугл не умеют
Так и нахуя нужен этот юзлесс понос, когда для задач языка в 146% случаев хватает консоли?
у вас там сегодня день открытых дверей или как?
человек спросил как создать surface для vulkan
ты что там на консоли собрался выводить, ascii-render ему предложишь как альтернативу?
Winapi в помощь. Берешь канвас и рисуешь кружочки, пишешь текст и так далее что угодно.
GTK на Си пишется
Рисовать кружочки - это на самом деле путь-ловушка. Поэтому на таких примитивах никто и не акцентируется. Тут лучше смотреть в сторону шейдеров.
Да, ядра локалхоста.
Ну нет не совсем ещё, я уважаю этот тред и он является для меня единственным и по настоящему ценным местом на дваче, ну ещё тред по ассемблеру, но его я пока что просто читаю.
ты же понимаешь, что это все очень относительно, ну мне не трудно, Васе будет трудно
Ну это первый попавшийся их гугла был. Он под юнити, но его можно адаптировать под что угодно, наверное.
http://anthonieportfolio.nl/portalshader.html
Можешь тупо на shadertoy поискать portal.
Блядский хлсл
Расскажите, существуют ли джуниоры Си девелоперы? Если да, то чем они занимаются? У меня вообще нет представления о том, что пишут на Си, только какие-то возможно устаревшие представления о каких-то заводах, микросхемах и т.д. Вообще, если кому не лень, поясните за Си в 2023 году, не конкретно в какой-то стране, а в целом, чем живёт.
любые вычислительные либы под любые задачи, хоть для верчения на серваках сайтов, что потом только дергается js или еще чем
пишут под кучу портативных устройств в куче компаний, эти ваши умные часы и микроволновки
пишут для дронов...
много всего короче на любой вкус и цвет
>Расскажите, существуют ли джуниоры Си девелоперы?
Ебать ну естественно! Они существуют потому что есть рынок и есть капитализм. Компания сама не заинтересована в обучении, учится - это твоя задача, а задача компании - делать деньги. Соответственно, недостаток опыта она всегда конвертирует в свою пользу. Компании выгодно найти дурачков, так называемых "джуниоров", которые будут пахать по 8 часов в сутки за 25 тысяч рублей в месяц. Тебя будут ебать по-всякому, продавливать на самую низкую зарплату, ниже дворника, при этом вешать обязанностей как на министра финансов. Короче, "джуниор" это синоним "дешёвого лоха".
А чё не так-то? Хочешь сказать джуниор это не "дешёвый дурачок"?
Ой млять, я опять невнимательно посмотрел, там ведь и C++ думал там всё на C++ написано.
Засиделся за компом...
Я немного объебался со скриншотами
1 скрин - это как у него было на Си.
2 и 3 - а вот так стало на Си++ (удобное использование и всякие типы и контрль компилятора в либе).
При этом код сдулся в 3 раза, что должно по идее лучше сказаться на качестве.
По бинарникам получаемым тоже вроде все хорошо, нет какого то лютого оверхеда.
Не, правда, я без троллинга, я сам дед 40 лет, но когда я беру условную ардуинку, мне хочется писать надежно, а не как диды на Си писали... Но я на заводах не работал.
>а не как диды на Си писали
То чувство, когда ты зумер который топит за Си (из-за того что был знаком с очень крутым инженером (больше 40 лет) который замотивировал серьезно изучить Си)) а тебе пишет дед про C++ называя дИдами тех кто пишет на Си. :)
> хочется писать надежно
На контроллерах это не про С++. Особенно когда while(1){} это UB.
Да и большого количества абстракций стараются избегать. Можно, конечно, писать на Си с классами, но от того же сишного кода это будет мало отличаться. Поэтому в критических к надежности системах лучше на крестах не писать, а на них и не пишут.
Но поиграться с пердуинками или с stm32 на крестаэ прикольно, ради этого хотел бы вкатиться в кресты.
>На контроллерах это не про С++.
> Поэтому в критических к надежности системах лучше на крестах не писать
Это очень устойчивый миф, который годами не могут развеять.
>. Особенно когда while(1){} это UB.
Страшилка уровня /pr.
while(true) { int const volatile x = 1; }
В Си тоже полно UB, это никого не останавливает.
>Да и большого количества абстракций стараются избегать.
В с++ много compile-time и zero-cost. Которые дают удобные и мощные абстракции на стороне программиста, которые превращаются в пару инструкций asm.
Нууу 3000 строк тоже можно сжать используя макросы.
Главное же - в данном сишном коде легко модифицировать одну конкретную функцию, буде это понадобится, добавив любые безумные отступления от шаблона.
>используя макросы.
Угу, сейчас бы макросы в критическом коде использовать, без контроля типов компилятором.
>в данном сишном коде легко модифицировать одну конкретную функцию
Может можно, а может нельзя, ведь 99% случаях придется перелопачивать и остальные функции, потому что они были созданы методом копипасты, спасибо отсутствию перегрузок, и какую-то пропустить. Ведь про _Generic никто не знает, в книгах дидов его не было.
> Это очень устойчивый миф, который годами не могут развеять
Ты тоже этого делать не собираешься, похоже. А я бы послушал. И я не пытаюсь доебаться ес что, просто все что я писал - было в основном под контроллеры, опыта в других областях почти нету. Но базовая программа на большом количестве контроллеров содержит бесконечный цикл. ОСРВ FreeRTOS буквально состоит из множества while(1){}, и как там что-то писать на крестах?
> В Си тоже полно UB, это никого не останавливает
Потому что о нём заранее знают, есть тот же embedded c coding standard. Писать надёжно в контексте контроллеров - это не про кресты.
> В с++ много compile-time и zero-cost. Которые дают удобные и мощные абстракции на стороне программиста, которые превращаются в пару инструкций asm
Здорово, только писать на Си с классами писать не всем удобно, да и хз как это вообще делать под некоторые контроллеры. Когда говоришь, что здорово писать на крестах под эмбедед, лучше уточни под какую конкретно железку ты пишешь.
Асло, вот тут чел интересно пишет про краткость кода https://250bpm.com/blog:4/ интересно сравнение без шизы и поливания говном одного языка, по сравнению с другим. Я сам пытаюсь вкатиться в кресты, но больно дохуя там надо знать. А ещё заметил, что почти любой вопрос по крестам скатывается в долгое обсуждение стандартов, которые подзаебывают, и учить их ебанешься кмк. Но это чисто субъективная херня.
Ситуация следующая - есть строка, допустим "hello", получается, что в памяти эта строка выглядит как набор ячеек памяти (массив) определённого размера. Допустим, если мы эту строку занесли на языке ассемблера nasm в переменную txt размером db (байт), то получается, что переменная txt это набор из идущих друг за другом ячеек размером в байт, а каждый символ в этой строке это определённый набор нулей и единиц каждый в своей ячейке, т.е. первая ячейка в этом массиве будет выглядеть так 0110 1000 (код "h" из таблицы ascii), вторая ячейка 0110 0101 (код "е" из таблицы ascii), и т.д., и до тех пор, пока строка не закончится, правильно понимаю? А если, допустим мы выделим под переменную txt размер типа данных dw (два байта), то ячейки памяти с этой строкой будут выглядеть так - 0000 0000 0110 1000 (код "h" из таблицы ascii), 0000 0000 0110 0101 (код "е" из таблицы ascii)? Правильно понимаю? И получается, что общий размер строки "hello", если под неё выделяются ячейки размером байт (т.е. на языке ассемблера инструкцией db), составляет 5 байт?
Размер строки 6 байт, так как в конце всегда 0.
Если выделишь 3 dw и скопируешь туда строку, то первое слово будет содержать 'e' : 'h'.
>Размер строки 6 байт, так как в конце всегда 0.
Не, это, если строка представляется на языке Си, но, если ты кодишь на ассемблере, то 0 указывать не обязательно.
>Если выделишь 3 dw и скопируешь туда строку, то первое слово будет содержать 'e' : 'h'.
Мне хочется узнать именно как на уровне нулей и единиц представлена строка.
>>619788
Прикол в том, что он показывает, что инструкция, которая копирует строка в регистр занимает 8 байт, т.е. в независимости от типа данных или длины строки, он пишет, что инструкция занимает 8 байт. Мб, какой-нибудь дизассемблер сможет показать сколько именно ячеек памяти занимает строка, и как вообще выглядит она на уровне нулей и единиц, но я чёт не знаю какой дизассемблер поставить в линукс, который сможет показать именно на уровне нулей и единиц.
>Мне хочется узнать именно как на уровне нулей и единиц представлена строка.
Я открою тебе секрет, малыш.
echo -n hello|xxd -b
00000000: 01101000 01100101 01101100 01101100 01101111 hello
Как это посмотреть на gdb? У него есть есть команды x/(набор параметров), но чёт они не выводят то что я хочу.
>>619835
Так перевести любую строку в двоичный вид и я смогу, даже в тетрадке, даже ручкой, даже гелевой.
>>619836 (Del)
>Нет такого
Да, ладно, мб неправильно выразился, мб память представлена не "ячейками", а сплошным массивом нулей (свободная память), либо сплошным массивом нулей и единиц (занятая).
>нулевые байты после каждого символа
И этих нулевых байтов будет один, если dw; три если, dd; семь, если dq?
>мб память представлена не "ячейками", а сплошным массивом нулей (свободная память), либо сплошным массивом нулей и единиц (занятая
Да, всё, можешь больше не отвечать! Я прозрел и теперь понимаю, как организована память в компьютере и что значат эти ваши db, dw, dd, dq. Спасибо анонам, которые попытались подвести меня до ответа.
>Ты тоже этого делать не собираешься, похоже. А я бы послушал.
Так полно конференций где серьезные дядьки это делают, скрины то с них, а они уже почти 10 лет этим занимаются, а я кто. Да и не хочу я прямо в Си треде таким заниматься, просто недоумеваю почему кто-то выбирает Си, как это происходит, какая у этого причина, ну кроме того что люди слышали что 10-20 лет назад можно было только на Си писать под микрухи.
>Но базовая программа на большом количестве контроллеров содержит бесконечный цикл. ОСРВ FreeRTOS буквально состоит из множества while(1){}, и как там что-то писать на крестах?
Ты наверное прикалываешься, потому что я в том же посте написал как пишется бесконечный цикл и даже скинул пункт стандарта, который объясняет почему. Но ты просто еще раз повторяешь что бесконечный цикл не написать.
> Писать надёжно в контексте контроллеров - это не про кресты.
Ну да, а си это пиздец как надежно. Я понимаю если бы речь шла про прости господи Раст, но говорить что Си++ менее надежен это мда.
Я не исключаю что нельзя пользоваться всеми фичами С++, и надо смотреть в ассемблерный выхлоп, и если у тебя там шаблон разворачивался в одну инструкцию, а после каких-то изменений стал разворачиваться в страницу кода, это проблема, и надо включать голову - но голову и в Си надо включать, у меня часто волосы дыбом от того какой код пишут и уверяют что он надежный.
>только писать на Си с классами писать не всем удобно
А примеры не про Си с классами, а про например constexpr вычисления времени компиляции. Про то что это будет не приседание с || и && с магическими битами, а вменяемый АПИ, когда ты явно говоришь что включаешь. Грубо говоря разница между пик1 и пик2. (Это не идентичный код, просто первый попавшийся с гитхаба).
>лучше уточни под какую конкретно железку ты пишешь.
Сейчас ни под какие не пишу, только пишу либу под llvm-mos чтобы собирать под C64/NES эмули.
Ради интереса могу посоветовать еще узнать как выглядит в памяти строка "helloµ死👋", и как это зависит от кодировки файла и кодировки терминала операционной системы.
Байты и биты объясняются в первых главах учебников по информатике, да думаю и учебников по Си.
Вот это интересно, анон, спасибо за совет - надо будет глянуть. UTF-8, пишут в педивикии, использует переменное кол-во байт, следовательно, я так понимаю строка в этой кодировке может быть не набором из однобайтных "ячеек", а смешанным набором из однобайтных и до 4-х байтных "ячеек". Только мне вот теперь стало интересно что за тип данных нужно указать в ассемблере, чтобы можно было работать с кодировкой UTF-8? Если указать dd, то это же может быть неэкономично?
https://ru.wikipedia.org/wiki/UTF-8
>UTF-8 (от англ. Unicode Transformation Format, 8-bit — «формат преобразования Юникода, 8-бит») — распространённый стандарт кодирования символов, позволяющий более компактно хранить и передавать символы Юникода, используя переменное количество байт (от 1 до 4), и обеспечивающий полную обратную совместимость с 7-битной кодировкой ASCII. Стандарт UTF-8 официально закреплён в документах RFC 3629 и ISO/IEC 10646 Annex D.
Анон, ты что-то путаешь.
ну да, на каждый символ от 1 до 4 байт, соответственно строка - байтовый массив и будет, а это кодировка - как извлечь конкретный символ
>>620191
Любая строка это массив байтов, просто зависит от того, где они и как будут обрабатываться.
Суть в том, что Юникод являющийся современным стандартом, включает в себя знаки почти всех письменных языков мира, более того, практически все (или боьшинство) языков можно закодировать при помощи двух байтов, в Шиндовс для этого существует псевдотип wchar_t но на самом деле он является макросом для short unsigned int (между ними нет отличий), в тоже время существуют различные инкарнации ANSI (KOI-8, CP-1251, 1252 (256 символов, 8 бит) ) из которых 0 до 127 - изначальные символы ASCII, которыми как рыз ты и пользуешься при вводе английского текста.
Как ты можешь догадаться, всё что нам нужно, это уметь преобразовывать "широкие" байты (wchar, или short unsigned int) в последовательность обычных байтов, и обратно для того что бы мы могли манипулировать ими.
Например ?
Нужно написать утилиту, которая будет запрашивать в консоли название файла на русских символах (или испанских, хоть японских) после чего программа должна будет прочитать, содержимое файла а потом например перевернуть данные и записать в другой файл, но суть в том что ты не можешь просто так работать с Юникодом как с обычным ANSI (ASCII), т.к. каждый символ на самом деле кодируется двумя байтами, и просто изменив последовательность, ты получишь ошибку.
Для того чтобы этого не возникло, существуют методы, которые позволяют преобразовывать кодировку из ANSI в Юникоде и наоборот из Юникода в Анси.
MultiByteToWideChar (преобразует ANSI в Юникод (двухбайтовую строку, т.е. каждый символ два байта)) и WideCharToMultiByte (преобразует Юникод в ANSI (мультибайтовую строку, т.е. в 8-битную последовательность байтов))
Вот пример такой программы (чисто для примера):
//gcc -g prog2.c -o prog2
#include <stdio.h>
#include <tchar.h>
#include <wchar.h>
#include <windows.h>
unsigned long get_string(
short unsigned int stn, //массив куда передастся мультибайтовая строка
const size_t BUFFER_SIZE, //размер буфера (256)
TCHAR messg); //сообщение для вывода в консоли
int ReadData(char read_data, short unsigned int file_name);
int WriteData(char write_data, short unsigned int file_name);
int ReverseStringW(short unsigned int rev_data);
int StringReverseA(char pMultiByteStr, unsigned long cchLength);
//объявим и инициализируем новую структуру
//в поле field структуры SaveStrings
//запишем в её поле field строку
typedef struct SaveStrings{
char field[1024];
}SaveStrings;
//ГЛАВНАЯ ВЕТКА ПРОГРАММЫ
int main(void){
SetConsoleOutputCP(CP_UTF8);
SetConsoleCP(CP_UTF8);
//массив в который будет записано название файла
short unsigned int wstr = (short unsigned int)calloc(255, sizeof(short unsigned int));
//char read_data[1024]={0};//массив в который запишутся данные из файла
SaveStrings saveobj = (SaveStrings)malloc(sizeof(struct SaveStrings));
memset(saveobj->field, 0, sizeof(saveobj->field));
//получим название файла, запишем имя в wstr
unsigned long readble = get_string(wstr, 255, "Название файла: ");
//объявим массив copy длиной wstr+2
short unsigned int file_name[255]={0};
//скопируем часть массива wstr, на два символа меньше
wmemcpy(file_name, wstr, (wcslen(wstr)-2));
//прочитаем данные из файла в буфер saveobj->field
//в виде обычного набора байтов в char-массиве (МультиБайтовая Строка)
ReadData(saveobj->field, file_name);
//Перевернем мультибайтовую строку.
StringReverseA(saveobj->field, strlen(saveobj->field));
//Запишем перевернутые данные в другой файл
WriteData(saveobj->field, L"reverse_output.txt");
}
int WriteData(char write_data, short unsigned int file_name){
//t - число прочитанных данных
unsigned long t;
//Дескриптор файла
//для записи данных
HANDLE hFile = CreateFileW(
file_name, // имя файла
GENERIC_WRITE, // режим доступа
0, // совместный доступ
NULL, // SD (дескр. защиты)
CREATE_ALWAYS, // как действовать (Открыть существующий)
FILE_ATTRIBUTE_NORMAL, // атрибуты файла
NULL); // дескр.шаблона файла
WriteFile(
hFile, // дескриптор файла
write_data, // буфер данных
strlen(write_data), // число байтов для записи
&t, // число записанных байтов
NULL ); // асинхронный буфер
return 1;
}
int ReadData(char read_data, short unsigned int file_name){
//n - буфер данных
//t - число прочитанных данных
unsigned long n, t;
//Дескриптор файла
//для чтения данных
HANDLE hFile = CreateFileW(
file_name, // имя файла
GENERIC_READ, // режим доступа
FILE_SHARE_READ, // совместный доступ [Разрешено Чтение]
NULL, // SD (дескр. защиты)
OPEN_EXISTING, // как действовать (Открыть существующий)
FILE_ATTRIBUTE_NORMAL, // атрибуты файла
NULL); // дескр.шаблона файла
if (INVALID_HANDLE_VALUE == hFile){
_tprintf(_TEXT("\nError: INVALID_HANDLE_VALUE\n"));
return 0; }
do{
ReadFile(
hFile, //дескриптор файла
read_data, //буфер данных
1024, //размер записыаемых данных
&t, //колличество прочитанных данных
NULL); //асинхронный буфер
}while(t);
//закроем дескриптор на чтение файла
CloseHandle(hFile);
return 1;
}
int StringReverseA(char pMultiByteStr, unsigned long cchLength)
{
short unsigned int pWideCharStr;
int LenOfWideCharStr;
int fok=0;
//вычисляем колличество символов, необхоимых
//для хранения широкосимвольной версии строки.
LenOfWideCharStr = MultiByteToWideChar(
CP_UTF8, 0, pMultiByteStr, cchLength, NULL, 0
);
pWideCharStr = (short unsigned int)calloc(LenOfWideCharStr, sizeof(short unsigned int));
if (pWideCharStr==NULL){
return fok; }
//преобразуем мультибайтовую строку в широкосимвольную
MultiByteToWideChar(
CP_UTF8, 0, pMultiByteStr, cchLength, pWideCharStr, LenOfWideCharStr
);
//Вызываем широкосимвольную версию этой функции
//для выполнения настоящей работы
fok = ReverseStringW(pWideCharStr);
if (fok){
//преобразуем широкосимвольную строку
//обратно в мультибайтовую, т.е. просто последовательность байт
WideCharToMultiByte(
CP_UTF8, 0, pWideCharStr, cchLength, pMultiByteStr,
(int)strlen(pMultiByteStr), NULL, NULL); }
}
//Метод переворачивает набор байтов, изменяя их последовательность.
//Алгоритм говно, но я решил не париться.
int ReverseStringW(short unsigned int rev_data){
short unsigned int rev_string[1024]={0};
wmemcpy(rev_string, rev_data, wcslen(rev_data));
wmemset(rev_data, 0, sizeof(short unsigned int));
int lnstr = wcslen(rev_string)-1;
for(int i=0; (lnstr-i)!=-1; i++){
rev_data=rev_string[lnstr-i];
}
return 1;
}
//Метод просит ввести строку в консоли
unsigned long get_string(short unsigned int stn, const size_t BUFFER_SIZE, TCHAR* messg)
{
unsigned long read;
HANDLE handle_in = GetStdHandle(STD_INPUT_HANDLE);
_tprintf(_TEXT("%s"), messg);
if (ReadConsoleW(handle_in, stn, BUFFER_SIZE, &read, NULL) == 0)
{
printf("\nError: %ld", GetLastError());
return 0;
}
return read;
}
Вот пример такой программы (чисто для примера):
//gcc -g prog2.c -o prog2
#include <stdio.h>
#include <tchar.h>
#include <wchar.h>
#include <windows.h>
unsigned long get_string(
short unsigned int stn, //массив куда передастся мультибайтовая строка
const size_t BUFFER_SIZE, //размер буфера (256)
TCHAR messg); //сообщение для вывода в консоли
int ReadData(char read_data, short unsigned int file_name);
int WriteData(char write_data, short unsigned int file_name);
int ReverseStringW(short unsigned int rev_data);
int StringReverseA(char pMultiByteStr, unsigned long cchLength);
//объявим и инициализируем новую структуру
//в поле field структуры SaveStrings
//запишем в её поле field строку
typedef struct SaveStrings{
char field[1024];
}SaveStrings;
//ГЛАВНАЯ ВЕТКА ПРОГРАММЫ
int main(void){
SetConsoleOutputCP(CP_UTF8);
SetConsoleCP(CP_UTF8);
//массив в который будет записано название файла
short unsigned int wstr = (short unsigned int)calloc(255, sizeof(short unsigned int));
//char read_data[1024]={0};//массив в который запишутся данные из файла
SaveStrings saveobj = (SaveStrings)malloc(sizeof(struct SaveStrings));
memset(saveobj->field, 0, sizeof(saveobj->field));
//получим название файла, запишем имя в wstr
unsigned long readble = get_string(wstr, 255, "Название файла: ");
//объявим массив copy длиной wstr+2
short unsigned int file_name[255]={0};
//скопируем часть массива wstr, на два символа меньше
wmemcpy(file_name, wstr, (wcslen(wstr)-2));
//прочитаем данные из файла в буфер saveobj->field
//в виде обычного набора байтов в char-массиве (МультиБайтовая Строка)
ReadData(saveobj->field, file_name);
//Перевернем мультибайтовую строку.
StringReverseA(saveobj->field, strlen(saveobj->field));
//Запишем перевернутые данные в другой файл
WriteData(saveobj->field, L"reverse_output.txt");
}
int WriteData(char write_data, short unsigned int file_name){
//t - число прочитанных данных
unsigned long t;
//Дескриптор файла
//для записи данных
HANDLE hFile = CreateFileW(
file_name, // имя файла
GENERIC_WRITE, // режим доступа
0, // совместный доступ
NULL, // SD (дескр. защиты)
CREATE_ALWAYS, // как действовать (Открыть существующий)
FILE_ATTRIBUTE_NORMAL, // атрибуты файла
NULL); // дескр.шаблона файла
WriteFile(
hFile, // дескриптор файла
write_data, // буфер данных
strlen(write_data), // число байтов для записи
&t, // число записанных байтов
NULL ); // асинхронный буфер
return 1;
}
int ReadData(char read_data, short unsigned int file_name){
//n - буфер данных
//t - число прочитанных данных
unsigned long n, t;
//Дескриптор файла
//для чтения данных
HANDLE hFile = CreateFileW(
file_name, // имя файла
GENERIC_READ, // режим доступа
FILE_SHARE_READ, // совместный доступ [Разрешено Чтение]
NULL, // SD (дескр. защиты)
OPEN_EXISTING, // как действовать (Открыть существующий)
FILE_ATTRIBUTE_NORMAL, // атрибуты файла
NULL); // дескр.шаблона файла
if (INVALID_HANDLE_VALUE == hFile){
_tprintf(_TEXT("\nError: INVALID_HANDLE_VALUE\n"));
return 0; }
do{
ReadFile(
hFile, //дескриптор файла
read_data, //буфер данных
1024, //размер записыаемых данных
&t, //колличество прочитанных данных
NULL); //асинхронный буфер
}while(t);
//закроем дескриптор на чтение файла
CloseHandle(hFile);
return 1;
}
int StringReverseA(char pMultiByteStr, unsigned long cchLength)
{
short unsigned int pWideCharStr;
int LenOfWideCharStr;
int fok=0;
//вычисляем колличество символов, необхоимых
//для хранения широкосимвольной версии строки.
LenOfWideCharStr = MultiByteToWideChar(
CP_UTF8, 0, pMultiByteStr, cchLength, NULL, 0
);
pWideCharStr = (short unsigned int)calloc(LenOfWideCharStr, sizeof(short unsigned int));
if (pWideCharStr==NULL){
return fok; }
//преобразуем мультибайтовую строку в широкосимвольную
MultiByteToWideChar(
CP_UTF8, 0, pMultiByteStr, cchLength, pWideCharStr, LenOfWideCharStr
);
//Вызываем широкосимвольную версию этой функции
//для выполнения настоящей работы
fok = ReverseStringW(pWideCharStr);
if (fok){
//преобразуем широкосимвольную строку
//обратно в мультибайтовую, т.е. просто последовательность байт
WideCharToMultiByte(
CP_UTF8, 0, pWideCharStr, cchLength, pMultiByteStr,
(int)strlen(pMultiByteStr), NULL, NULL); }
}
//Метод переворачивает набор байтов, изменяя их последовательность.
//Алгоритм говно, но я решил не париться.
int ReverseStringW(short unsigned int rev_data){
short unsigned int rev_string[1024]={0};
wmemcpy(rev_string, rev_data, wcslen(rev_data));
wmemset(rev_data, 0, sizeof(short unsigned int));
int lnstr = wcslen(rev_string)-1;
for(int i=0; (lnstr-i)!=-1; i++){
rev_data=rev_string[lnstr-i];
}
return 1;
}
//Метод просит ввести строку в консоли
unsigned long get_string(short unsigned int stn, const size_t BUFFER_SIZE, TCHAR* messg)
{
unsigned long read;
HANDLE handle_in = GetStdHandle(STD_INPUT_HANDLE);
_tprintf(_TEXT("%s"), messg);
if (ReadConsoleW(handle_in, stn, BUFFER_SIZE, &read, NULL) == 0)
{
printf("\nError: %ld", GetLastError());
return 0;
}
return read;
}
Двух байтовый юникод - это UCS-2 (UTF-16), UTF-8 совсем по другому работает, это последовательности от 1 до 4 байт, и таких преобразований ты не провернешь.
Алсо в юникоде вообще не любят когда их называют "символами" или "буквами", потому что там "глифы", потому что там есть комбинированные символы. Например, á может храниться как "◌́" + "a", то есть уже strlen() или strchr() нетривиальные, потому что они возвращают размер в байтах, а не в символах, вроде бы.
>Двух байтовый юникод - это UCS-2 (UTF-16), UTF-8 совсем по другому работает, это последовательности от 1 до 4 байт, и таких преобразований ты не провернешь.
Согласен, спасибо что поправил, речь шла именно про двухбайтовый Юникод (он же UTF-16) который используется в Шиндовс для кодировки "широких символов".
>>620330
> "◌́" + "a"
>>620330
> то есть уже strlen() или strchr() нетривиальные, потому что они возвращают размер в байтах, а не в символах, вроде бы.
Знаю, хотел написать пример широких символов (строки в Юникоде) и в ANSI в gdb но мне чёт лень...
Вместо strlen() есть wcslen() и другие аналогичные методы с приставкой W для обрадотки "широких байтов".
Дело не в wcslen, а в том, что "символ" даже в двухбайтной может занимать несколько двухбайтов. Например, состоять из 5, как на пике.
А хотя, ты же про UTF-8, про это я знаю, ещё в документации читал... но особо сильно не интересовался.
Нет, это везде. Посмотри на коды на картинке, они двухбайтовые. Глиф собирается из буквы a и значков.
Про книги не знаю, не читал, знаю только что есть C/C++/Java либа ICU. Она по идее идет с функциями преобразований какими-то и базами данных символов.
А UTF-8 больше на Huffman code из zip похож - там чем чаще символ, тем он короче, а длинные кодируются единичками в старших битах.
Я не на столько продвинуть как ты, анон. Поэтому элементарно не понимаю, как можно для, например моих микрух использовать С++. Да и во всех гайдах, по которым я учился, использовался Си. Хз короче, пытаюсь вкатиться по учебнику Праты потихоньку, но объем знаний слишком большой, а ведь помимо этого надо ещё и саму архитектуру конкретной микрух хорошо знать.
```
int main(void)
{
{
int x;
SetX(&x);
}
{
int y;
SetY(&y);
}
}
```
С этой опцией у переменных x и y будут одинаковые адреса.
Как называется эта опция?
И какую же опцию передать в GCC, чтобы указатели были одинаковыми?
На с++ сложно деньги зарабатывать? Вакансии вообще есть? Платят деньгами или ссаными тряпками?
Я думал это по умолчанию так, ведь ты новый скоуп открываешь. К локальной переменной же все равно нельзя обращаться после окончания ее лайфтайма, это UB. А опция наоборот существует чтобы отключать эту оптимизацию, для устаревших программ написаных кое-как.
Сложно. Тряпками. Вакансии и сам мог бы глянуть. С++ отдельный тред есть кстати.
си шарп дитя корпорастов
А где 1С?
выходные, праздники, отдыхаем
cmake делает по описанию makefile или .sln или что то еще платформенное. Потом оно собирается.
Без него ты должен каждый раз ручками где-то править аргументы компилятора - релизная или дебаг сборка, целевая платформа, и т.д.
Пишу под arduino, пытаюсь в C строки, потому что родной String выжирает очень много памяти.
Написал функцию, которая принимает сообщения от сервера и парсит.
>topic = "building_a/room_123/switch/light_left"
>payload = "on"
Оно разбивает на
>room = "room123"
>cmd = "switch"
>sw = "light_left"
И передаёт дальше.
Я всё правильно пишу? Так и надо?
Нет, все совсем не так, мне сейчас правда некогда пояснять, ну смотри ты начинаешь с копирования массива byte в массив char - зачем? Потом еще sprintf, а перед ним еще и strlen который пробежит всю строку. Потом ты еще раз копируешь все в массивы (хотя strcpy бы возможно соптимизировался быстрее). Не удивлюсь если ты еще и по значению копируешь массивы в process_msg.
Думаю C-way было бы просто один раз скопировать топик, заменяя / на \0 и передать указатели на первые буквы слов, и занимало бы это раз в 5 меньше кода.
А вообще, если ты пишешь только обработчик, который с этими строками ничего не делает, то наверное еще более Си-way было бы написать конечный автомат (возможно создать его генератором кода) который вообще ничего не копирует.
Ну типа смотрит сдедующий символ, если это / то переключается на следующий анализатор, если буква b, то ожидает следующую букву u, и так до _a, где он просто запишет в целую переменную результат - номер здания.
https://pastebin.com/9PYP3wSN
Пробовал создать заголовочный файл и подключить его в нужных .c файлах, объявив в нём указатель как extern esp_modem_dce_t dce; , а в .с файлах просто как esp_modem_dce_t *dce;
Проект сорался без ошибок, но в реале крашится.
Скорее всего я чего-то не понимаю, поэтому объяснил как мог. Сорян.
А ты его инициализируешь? Просто если у тебя esp_modem_dce_t *dce; то там тупо мусор.
ЕМНИП объявлен он должен быть везде, а определен только в одном .c файле.
>ты начинаешь с копирования массива byte в массив char - зачем
Мне потом надо проверить payload == "on" например. Я в strcmp не могу передать byte, ему надо char.
>Потом еще sprintf, а перед ним еще и strlen который пробежит всю строку.
sprintf для вывода текста в консоль для дебага.
А без strlen я не узнаю длину строки. Она не передаётся для topic.
>один раз скопировать топик, заменяя / на \0 и передать указатели на первые буквы слов
Вот это гениально. Я бы в жизни до такого не догадался.
Попробую завтра с этим поиграться.
Правда не факт, что MQTT либа, которая мой коллбек вызывает, переживёт то, что я ей строку в памяти поменял, которую она мне передала.
>>623755
>конечный автомат
Это какое-то нереальное кунгфу, о котором я пока ничего не знаю.
>Я в strcmp не могу передать byte, ему надо char
Ты бы хоть типа данных загуглил... Там тебя ждёт сюрприз.
byte это скорее всего unsigned char, то есть скорее всего можно передавать.
>sprintf для вывода текста в консоль для дебага.
>А без strlen я не узнаю длину строки. Она не передаётся для topic.
Я понимаю, но ты просто жаловался что ардуиновский String жрет, но не думаю что он жрет больше чем у тебя тут.
Алсо опять же не факт что надо копировать в sprintf для отладки, ты же можешь напечатать debug сначала одну строку, потом другую.
>Правда не факт, что MQTT либа, которая мой коллбек вызывает, переживёт то, что я ей строку в памяти поменял, которую она мне передала
Не переживет, потому что там const char. Поэтому я написал что ее один раз скопировать все же придется.
>конечный автомат
Ну это довольно простая концепция так то. Если ты в состоянии state1 и пришел нужный символ ch, то перейти в состояние state2, а если нет - то или ошибка, или что-то другое началось.
Он битовый чар ¯\_(ツ)_/¯
Не меньше чара занимает, да. Если хочешь битовый, надо ебаться самому (но я не помню где не надо, в Zig вроде бы)
Алсо он чар потому, что у каждого элемента массива булов все равно должен быть уникальный адрес для указателей, а дробные адреса не завезли.
> ардуиновский String жрет, но не думаю что он жрет больше чем у тебя тут
Он прям в разы должен меньше жрать. Потому что каждый String+String то ли новый String создавал, то ли менял размер буффера и в моих
>"MQTT recv(" + topic + "): " + payload;
несколько раз пересоздавался буффер внтури, фрагментируя память.
Но именно тут это херня. Посмотри пик 1. Именно этот код крашил мне микруху. Причём не каждый раз. Причём там всё зависело от таймингов. Если добавить где-нибудь delay(5) то крашить переставало, либо наоборот ещё чаще начинало.
Слишком много плюсов было.
А стало пик 2. Память выделяется 1 раз при запуске и дальше пишется в неё весь лог, смещая старый текст. Краши пропали. Хотя из-за таймингов не факт, может просто везёт.
>ты же можешь напечатать debug сначала одну строку
Там не только вывод в консоль, она там ещё в MQTT отправляет сообщения и для вебсервера их откладывает.
>ее один раз скопировать все же придется
Ну я в принципе своей конвертацией в char* это и делаю.
А вообще я понял, что я только в начале изучения всякого этого C образного. Там ещё столько всего есть оказывается.
компилятор gcc
Я про то, что можно сделать debug("topic="); debug(topic); debug("buffer="); debug(buffer);
Ну иногда не до красивостей.
Почему ты решил что "затем +2 байта"? Первый указатель растет на 2, второй - на 8. Ты пользуешься арифметикой указателей, увеличивая его на 1 "шаг типа".
оказывается у меня проблемы с переводом из 16 ричной в 10, вопрос исчерпан, всё верно получается...
А, да, я подумал но не написал. Там же круглые цифры, на 0 заканчиваются. Это 16, да.
Убери динамический массив, сволоч. Из-за таких как ты все!!!
Все новые кейворды в Си вводятся в виде _Name, чтобы у дидов которые надефайнили не отвалилось.
Остальные могут явно подключить #include <stdbool.h>
и писать
bool variable = true;
Теоретически лет через 10 когда все перейдут, можно переделать в кейворд, а потом через 20 лет переходного периода _Bool задепрекейтить.
https://en.wikipedia.org/wiki/C2x
Алсо int foo() теперь будет означать int foo(void).
А когда я делаю "char str[xxx]", я как должен понять, что памяти нет?
Тебе сегфолт прилетит.
Хоспаде, какие же кожаные мешки бесполезные.
Память оказывается в стеке выделяется. Я не знал.
Тебе написали, что для динамических массивов надо использовать malloc только на три абзаца.
Чтобы угорать с додика, пишущего под винду, бесконечно сраться по какому-нибудь UB, типа i++ и мечтать о перекате в С++.
Ну вообще то еще есть alloca. А еще есть VLA.
Джавист, 3 года опыта (банк), писал в основном на спринге (rest + бекенд для личных кабинетов)
Сейчас предлагают на работе новый проект: программировать под Java Card
Кто имел опыт? Или это болото и лучше туда не лезть?
> Сейчас предлагают на работе новый проект: программировать под Java Card
> Кто имел опыт? Или это болото и лучше туда не лезть?
Это охуенно. Как МК, только пишешь на урезанной яве. Никакой периферии, только апи. Тройной дэс, ух бля.
Извините, что немного не по теме Си
Если ты в JS, то ври конечно, а если в Си, то не ври. Тебя еще и служба безопасности проверит, это же будет оборонка или что то подобное.
Где истина? Кто прав из двух сторон?
>RGBTRIPLE (image)[width] = calloc(height, width sizeof(RGBTRIPLE));
Поясните, аноны, зачем выделять под массив, в котором width элементов, память под height width элементов? И нахуя там круглые скобки в названии массива? В чем отличие от RGBTRIPLE image [width]?
>Весь массив это просто указатель
В смысле нельзя ?
Тебе никто не запрещает сделать так в стеке.
Потому что [height][width] это не двумерный массив, а массив массивов (а значит, массив указателей), иными словами они могут вести в разные места, а не быть последовательно в памяти, и доступ там через лишний указатель.
В c++23 есть Multidimensional subscript operator array[height, width], но в Си такого нет, кажется, даже через расширения.
Поэтому и делают по старинке, 1 плоский массив и доступ через i + j * width.
Нихуясе прикол, я думал, что двумерный массив это и есть просто массив массивов. Понял, спасибо. Обращаться к i элементу первого массива, получается, тогда надо так: звездочка(m[0] + i звездочка sizeof(int))? Если массив из инт офк
Ну так ты посмотри исходники какого-нибудь кодека или ядра ос.
Попробуй парсер для .bmp написать и через условный OpenGL на экран картинку вывести. Вот и узнаешь зачем динамические массивы нужны.
>>631028
???
После выделения памяти под двумерный массив в куче через calloc/malloc, ты можешь к элементам массива через A[j] обращаться(если ты массив массивов создаешь). Если по каким-то причинам тебя не устраивает массив массивов, то можно двумерный массив в одномерный запихнуть, тогда и будешь с голыми указвтелями ебаться.
> A[j] [k]
Конечно же две скобки. Ебучая макака не может разметку для тематической доски сделать.
1920x1080, 0:03
Можете пожалуйста объяснить, какие опции передаются параметру -Wl,... через запятую, его использует линковщик на этапе сборки, и как я понимаю его также нужно использовать для того чтобы указать путь до импорта динамической библиотеки, помимо параметра -L.
-Wl,<options> Pass comma-separated <options> on to the linker.
Как вообще правильно слинковать свою программу с динамической библиотекой в Windows, используя gcc ?
1280x720, 1:22
-Wl это параметр для дополнительных опций линковщика, как например поиск нужной dll для работы программы.
Тогда возникает другой вопрос, как правильно указать в опции -Wl путь для поиска динамических библиотек ?
Ну посмотреть что там в файле, изучить формат.
У всех аудиоформатов (тут к гадалке не ходи) будет какой-то единый интерфейс, типа
время @ частота @ громкость
Ну и дальше понятно
Не напомните?
Ладно, я аутист немножко.
Зато зацените какой я ещё онлайн тул знаю.
https://pythontutor.com/visualize.html#mode=display
чо за хуйня? чем printf(...) не устраивает...
наплодили ебланов которые не понимают как работает память
Ето пример - демонстрация работы указателя на функцию.
Скачай интерпритатор или компилятор, на чем ты там кодишь, хотя судя по тому, что в треде про Си, то компилятор. Скачай MinGW, если на Винде, или gcc, если на Linux, там это через терминал можно сделать
Пиши код в SublimeTxT, там даже можно компилить код, если в PATH прописан путь до компилятора
ПС. Вы же в курсе, что на С можно ваять под разнообразные контроллеры/SoC? А не только под х86?
Если не можешь осилить текстовый редактор, программирование не осилишь тем более, это фильтр от даунов.
Как нахуй разница, если все на ассемблер переводится, а ассемблер на язык машинных команд?inb4: да знаю я, что есть разные версии ассемблера, не души, ты понял, что имел в виду
Помню приглашенный гость из Варгейминга, на писал который писал, на интервью АйТи борода советовал его
>Если не можешь осилить текстовый редактор
Ты совсем дурачок? Причем тут текстовый редактор, если мне нужно компилить код под определенный контроллер?
дрочу примеры из учебника
https://pythontutor.com/visualize.html#code=main%20%28%29%0A%7B%0Aint%20strlen%28%29,%20x%3B%0Achar%20a%5B10%5D%3B%0Astrcpy%28a,%22COMPUTER%22%29%3B%0Ax%20%3D%20scarp%28a,strlen%29%3B%0Aprintf%28%22%25d%5Cn%22,%20x%29%3B%0A%7D%0Aint%20scarp%28c,girl%29%0Achar%20c%3B%0Aint%20%28girl%29%28%20%29%3B%0A%7B%0Areturn%28%28*girl%29%28c%29%29%3B%0A%7D&cumulative=false&curInstr=8&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=c_gcc9.3.0&rawInputLstJSON=%5B%5D&textReferences=false
https://godbolt.org/z/cqj6P1cjE
Си, из книги 90х.
Это дрочево с указателем на функцию, можешь погонять по шагам в pythontutor.
Я, видимо, слишком тупой для такого, половину строк в твоем коде вообще не понимаю. Че такое, например, intstrlen()? Что возвращает strlen без параметров и почему ты хочешь этим назвать переменную?
Это функция "донор", "объявлять" её требуется, чтобы можно было заиметь на неё указатель. Именно её мы будем дергать путём подсовывания в другую функцию указателя на неё.
Mastering C Pointers, Traister
>Pointers to Functions
A C language function is not a variable, but you can declare pointers to functions that can be used in a m a n n e r that other pointers
are used, such as placing them in arrays, or passed to other func-
tions. One doesn't see a lot of use of pointers to functions, but this
technique can sometimes be used to advantage. One common
usage of pointers to a function is in purposely hiding the intent of a
program. Pointers to functions serve to hide the n a m e and source
code of that function. Muddying the waters is not a normal routine
in C programming, but with the security placed on software these
days, there is an element of misdirection that seems to be growing.
The following program demonstrates the basic technique of de-
claring a pointer to a function:
This process may look a little ridiculous, and maybe it is, but it
does effectively demonstrate a pointer to a function. In this case,
the function in question is strlen(), which returns the length of a
string argument. Notice that strlen() is declared as a p a r t of the
calling program. This is a necessity, even though the function is a
p a r t of the linked library code.
Within the calling program, another function is invoked.
ScarpO, arbitrarily named, passes two values. The first is the char
array, which now contains "COMPUTER". The second is the n a m e
of the strlenO function, proper. In this usage, s t r l e n without
parentheses is the address of the strlen() function.
Within scarp(), the address of a is given to c h a r ЗВЕЗДОЧКА c , and the
address of s t r l e n is passed on to a pointer to this function ar-
bitrarily named g i r l . Note the declaration of this entity within
the function. The expression:
i n t ( ЗВЕЗДОЧКА g i r 1 ) ( )
says that g i r l is a pointer to a function that returns an int value.
At this juncture, the expression (ЗВЕЗДОЧКА g i r 1 ) may be used exactly as
you would strlen(). In the function:
r e t u r n ( ( ЗВЕЗДОЧКА g i r l ) ( c ) ) ;
means exactly the same thing as:
r e t u r n ( 5 t r l e n ( c ) ) ;
ЗВЕЗДОЧКА ( g i r 1 ) ( ) points to the storage address set aside for strlenQ
when it is declared in the program
Это функция "донор", "объявлять" её требуется, чтобы можно было заиметь на неё указатель. Именно её мы будем дергать путём подсовывания в другую функцию указателя на неё.
Mastering C Pointers, Traister
>Pointers to Functions
A C language function is not a variable, but you can declare pointers to functions that can be used in a m a n n e r that other pointers
are used, such as placing them in arrays, or passed to other func-
tions. One doesn't see a lot of use of pointers to functions, but this
technique can sometimes be used to advantage. One common
usage of pointers to a function is in purposely hiding the intent of a
program. Pointers to functions serve to hide the n a m e and source
code of that function. Muddying the waters is not a normal routine
in C programming, but with the security placed on software these
days, there is an element of misdirection that seems to be growing.
The following program demonstrates the basic technique of de-
claring a pointer to a function:
This process may look a little ridiculous, and maybe it is, but it
does effectively demonstrate a pointer to a function. In this case,
the function in question is strlen(), which returns the length of a
string argument. Notice that strlen() is declared as a p a r t of the
calling program. This is a necessity, even though the function is a
p a r t of the linked library code.
Within the calling program, another function is invoked.
ScarpO, arbitrarily named, passes two values. The first is the char
array, which now contains "COMPUTER". The second is the n a m e
of the strlenO function, proper. In this usage, s t r l e n without
parentheses is the address of the strlen() function.
Within scarp(), the address of a is given to c h a r ЗВЕЗДОЧКА c , and the
address of s t r l e n is passed on to a pointer to this function ar-
bitrarily named g i r l . Note the declaration of this entity within
the function. The expression:
i n t ( ЗВЕЗДОЧКА g i r 1 ) ( )
says that g i r l is a pointer to a function that returns an int value.
At this juncture, the expression (ЗВЕЗДОЧКА g i r 1 ) may be used exactly as
you would strlen(). In the function:
r e t u r n ( ( ЗВЕЗДОЧКА g i r l ) ( c ) ) ;
means exactly the same thing as:
r e t u r n ( 5 t r l e n ( c ) ) ;
ЗВЕЗДОЧКА ( g i r 1 ) ( ) points to the storage address set aside for strlenQ
when it is declared in the program
Концепт проще синтаксиса, там львиная доля сложности это неудобоваримый синтаксис.
https://metanit.com/c/tutorial/5.11.php
Очень даже просто, если не лезть в дебри типа https://metanit.com/c/tutorial/5.12.php
Если честно вообще не понял тебя, мог бы хотя примерно вводные данные описать
В эклипсе особо и настраивать ниче не надо. Скачиваешь тулчейн ARM Cross GCC для компиляции, openOCD для отладки. При создании проекта в окошках подтягиваешь всё это дело и кодишь.
Это называется K&R синтакс, и его в ближайшие годы отменят.
Раньше компы были слабее поэтому позволялось вместо
int foo(int x, char☆ c) { ... }
Писать
int foo()
int x
char☆ c
{ ... }
Переписал твой пример по современному.
И не забывай переключить язык на C в годболте, если там C++ выставляется сам.
Не пон, но ведь в первом примере вызов функции с аргументами, а во втором вызов функции без аргументов. Это же не одинаковые записи.
Всм в стек-то может оно всё запишется при вызове, но функционал-то разный.
char☆ foo(int param) - функция
char☆ (☆ptr)(int param) - указатель на функцию
char☆ res = foo(param); - вызов функции
char☆ res = (☆ptr)(param); - вызов чере указатель.
Алсо, тайпдефы.
Я тебя не понял.
Есть вызов scarp с аргументами: 1) строка a, 2) адрес функции strlen (тут strlen не вызывается)
Внутри scarp вызывается по указателю переданная функция, в данном случае strlen, c аргументом c (куда была передана строка a)
(*girl)(c) === strlen(c)
А не вызывается он, потому что нет скобок
scarp(a, strlen)
Сравни с
scarp(a, strlen()) - вот это было бы без аргументов, но это ошибка компиляции, потому что strlen требует аргумент
some_other_func(s, strlen(s)) - тут бы ты взывал some_other_func(char* str, int len)
Если же ты про то, что в старой книге написано
main()
{
int strlen(), x;
}
То это не вызов функции, а ее объявление в стиле K&R
Иными словами,в той программе не делают #include, Но объявляют что функция strlen существует
Потом ее во время линковки прилепляют из стдлиб или где она там живет.
Сорри что многабукв.
Всё равно не пашет....
В отличие от pythontutor где на том же девятом GCC с теми же флагами всё работает.
>переписал
Блин, ты бы лучше ссылку кинул. Ладно, сейчас перепечатаю, посмотрю, взлетит ли.
В любом случае вопрос по Pythontutor остаётся.
https://pythontutor.com/visualize.html#code=main%20%28%29%0A%7B%0Aint%20strlen%28%29,%20x%3B%0Achar%20a%5B10%5D%3B%0Astrcpy%28a,%22COMPUTER%22%29%3B%0Ax%20%3D%20scarp%28a,strlen%29%3B%0Aprintf%28%22%25d%5Cn%22,%20x%29%3B%0A%7D%0Aint%20scarp%28c,girl%29%0Achar%20c%3B%0Aint%20%28girl%29%28%20%29%3B%0A%7B%0Areturn%28%28*girl%29%28c%29%29%3B%0A%7D&cumulative=false&curInstr=8&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=c_gcc9.3.0&rawInputLstJSON=%5B%5D&textReferences=false
там всё работает без лишних движений.
Этот пример тоже интересен, спасибо!
Но не очень понимаю, зачем тут тайпдефы - они ведь тут тупо код в полтора раза раздули, и всё.
>Это называется K&R синтакс, и его в ближайшие годы отменят.
c чего его должны отменить? новые стандарты по идее должны сохранять обратную совместимость
Поясняю - объявлять int strlen() не нужно сейчас, потому что ты его и так инклюдишь. А если объявляешь, теперь тип возвращаемого значения size_t, а не int, о чем компилятор ругается.
Чтобы не ломать глаза об ((*ptr)()) постоянно. Думаю во всяких WINAPI так сделано.
Ну вот так написано в статье и вики и ссылка на пропозалы WG14-N2432 и WG14-N2841
Remove K&R function definitions/declarations
А также foo(); будет теперь означать foo(void);
https://en.wikipedia.org/wiki/C2x
А прочитал я это в статье, которая может быть уже в чем то устарела
https://habr.com/ru/company/badoo/blog/503140/
> Чтобы не ломать глаза об ((*ptr)()) постоянно
Можно в идешке сахарку подкинуть и не ломать глаза. Какая-нибудь подсветка фиолетовым.
Это фантастика. Регекспом такое что ли искать? Да и код должен быть читаемым даже в блокноте.
Не пахало, т.к. я проебал звездочку одну у c.
Странно, что ты не заметил.
Вот исправленная версия, пашет как миленькая. https://godbolt.org/z/3v7qdYj34
Лишнее доказательство какой пиздец этот синтакс
Да я уже потом не просматривал внимательно, у меня сейчас работка кипит своя.
Указатель на указатель - это, например, массив массивов. Или последующий элемент в связном списке. В обоих случаях он может указывать никуда.
такое только в пердольных задачах очень нужно
Так стопэ ты сейчас про что?
Если про *void - то это просто тип any (любой). Например, malloc тебе возвращает память, а ты там уже можешь хоть структуру, хоть массив интов, хоть строку чаров разместить.
Если же про указатель на NULL, то это традиционно последний или пустой элемент. Например в связном списке. A -> B -> C -> NULL. У последнего элемента C нет следующего.
>>625427
Так, пажите.
Я пишу под ESP32, у меня там stack на 8кб, и heap на 300кб.
Если я буду делать malloc() для каждой динамической временной строки, у меня heap фрагментируется и всё перестанет работать.
А в stack место просто очистится после выхода из функции и всё.
Вот пикрелейтед.
Тут 2 строки создаётся, одна для передачи в функцию для отправки её по сети, другая для передачи в debug() который и в консоль напишет и сохранит для дебага.
Я правильно делаю, что тут не выделяю память для этих двух строк через malloc() в heap, а выделяю в stack?
>Я пишу под ESP32, у меня там stack на 8кб
>Если я буду делать malloc()
На микрухах надо просто заранее выделять массивы нужного размера. Статичные.
У меня появилась гениальная идея.
Что если я на старте сделаю malloc() в 2кб, а потом функцией str_write() напиример буду добавлять пришедшие char* в эту область памяти.
А функцией str_get() ставить в конец нуллбайт и возвращать указатель на нулевой символ.
Так я могу работать с строками вообще не занимая никакой лишней памяти.
Гениально?
Главное не делать паузы между вызовами, чтоб 2 разных кода в одну память не писали по очереди.
У меня появилась гениальная идея.
Пошел нахуй отсюда, пидарас, со своим говнобложеком. Кусок тупого макакоговна никому не интересен.
Книги Джеффри Рихтера лучшие в этой области, мне кажется он знает архитектуру Windows лучше чем сами создатели Windows.
Интересно, как ему разрешили ее издать. Это же явно реверсинг + слив коммерческой тайны.
>Интересно, как ему разрешили ее издать. Это же явно реверсинг + слив коммерческой тайны.
Я пока что не нашёл чего-то "закрытого" в его книгах, как раз таки всю эту информацию можно найти в документации Майков, просто автор преподносит её в очень информативном и приятном для познавания виде, совмещая этот процесс с практикой.
Да, на стеке идет то что явно в внутри функций.
Нет, он не в стеке и не в куче, он в статическом сегменте памяти.
Спасибо, попробую разобраться
>Ну хватит плез
Блядь, ты заебал со своим линуксом.
Чтобы ты понимал, не все пишут под linux, я в прошлом треде общался с тобой, и как выяснилось ты ни имел и не имеешь дела с этой платформой, но постоянно яростно её обсираешь, а потом выясняется что ты пишешь под linux код для каких-то микроконтроллеров. Перестань обсирать вещи, только потому что ты их не понимаешь, либо не имел с ними дело.
Без WinApi в среде Windows ты не напишешь ничего значимого и безопасного кроме "hello world" с использованием стандартных библиотек, функций и структур, и да, я говорю именно про современные операционные системы, а не про то что ты там мог писать в 90-х (в зависимости от твоего возраста).
Вообще для того чтобы что-то стоящее писать, нужно даже не сам Си знать, важнее знать архитектуру ОС под которую ты пишешь, её API и железо под которое ведется разработка (если нужно), а сам Си при желании меньше чем за неделю изучить, знание только одного Си не принесет вообще никакого профита, кроме самовнушения о том что ты познал системное программирование, даже нормальную консольную утилиту не напишешь, скорее кал который будет держаться на соплях и содержать в себе множество уязвимостей.
Люди не читают книги, а потом пишут всякую хуйню и костыльные библиотеки, а всё потому что лишний раз поленились заглянуть в документацию или литературу, и найти уже готовое решение.
>Без WinApi в среде Windows ты не напишешь ничего значимого и безопасного кроме "hello world"
Верно.
>и да, я говорю именно про современные операционные системы, а не про то что ты там мог писать в 90-х
Чего, простите, лол? Ты бредишь.
Я еще в 80х писал сначала на нормальном фиксированном компьютере с использованием железа естественно, там всё необходимое было из коробки, как аппаратура, так и программная поддержка. А потом в начале 90-х попробовал этот ПК-конструктор с Си и сразу же выяснил, что это тыква, в Си на ПК ничего нет, т.к. сама архитектура ПК - ни о чем, железо может быть какое угодно, а значит никакое. Там на голом Си никогда и нельзя было ничего написать кроме хеллоуворлда в калсольку, позорище которые было дичайшим зашкваром даже в 80-х, это даже не программирование вообще, а чистая алгоритмика в вакууме, теоретическая хуета.
720x720, 2:25
Прошу прощения за мат выше, на эмоции вынесло.
Нахуя меня репоаишь тогда? Тебя гринтекст так триггерит?
Пиши дальше под свою проприетарную парашу да насасывай корпам, нахуя сюда-то лезешь тварь.
На ебало тебе ссу, мразь.
Согласен, я бы тоже линуксоидов нахуй послал, но всё же линукс имеет применение в виде WSL, чтобы пердольные компиляторы запускать если вдруг понадобится, иногда случается.
Я понимаю, что 2023 синоним корпорабства, но всё же давайте не поддаваться на общие тренды когда они явно ведут в жопу. Имейте мужество твердо сказать "нет" линуксу, а уж про макос и напоминать стыдно.
А где ты увидел что то про линукс? Это тред чистого языка Си.
Можно, через union и цикл например (или это UB? не помню уже).
Да, какие проблемы?
Открываешь свою структуру в дебагере, смотришть оффсеты каждого поля, если они одинаковые пишешь цикл увеличивающий указатель на нужное значение, так чтобы он каждый раз указавал на следующее поле, и суммируешь значения по указателю.
А если неодинаковые, в структуру можно добавить массив с набором размеров, и по нему увеличивать указатель. Или держать отдельный массив, чтобы каждую структуру не раздувать одинаковыми данными.
Ах, да, если типы получаются разные, тогда в массиве надо еще хранить некие идентификаторы типов, и при суммировании проверять каждый тип и использовать соответствующий указатель.
Очень нравится, но ужасно сырой, месяц возился с релизной версией, банально не готово.
Сыглы, надо бы
Если по дедовски, то ncurses, PDcurses и вариации. Там есть всякие аддончики вроде st-menu.
Если посовременнее, то, видел, FTXUI используют.
Пишу под чип ESP32, написал макрос, который вставлен в функцию, которая отправляет ответ на запрос в вебсервер.
У меня сломалась математика.
>int records_count_##name
>int record_item_i
>records_count = 10 из макроса
Как 10-1=1061159396 рандомно?
Даже если я где-то насрал в память не по адресу, как это сломало математику?
И это не ошибка вывода в консоль, у меня ниже не срабатывает условие, которое видит, что record_item_i больше 10.
Лень разбираться, проверь snprintf, почитай что она принимает и возвращает. Может ли быть, что буферу не хватает одного символа на \0 и ты видишь мусор, который идет сразу за ней? Так же, ты просто прибавляешь возвращенное значение, но в случае ошибки она возвращает отрицательные. В общем, мое паучье чутье подсказывает что странно кодга в printf-функциях не видно где-то +1 для \0.
А чего не миникс? Там же ещё меньше.
>>643750
Мне помогли разобраться. Произошла интересная штука.
record_item_i была объявлена в loop() на стеке и потом передана в функцию, которая вызывается коллбеком много раз.
Но сам loop() выполняется и сразу выходит и переменная удаляется. И у меня в коллбеке остаётся ссылка на какую-то рандомную память на стеке.
Сделал static int record_item_i и всё заработало.
Такие дела.
Где почитать про используемые либы и подходы для concurrency/asynchronous programming? Задача максимально утилизировать ядро процессора.
Какие есть топовые современные веб-сервера для Си? Чтобы были вебсокеты и mqtt.
>Zed A. Shaw "Learn C the Hard Way"
Здесь https://www.iso-9899.info/wiki/Main_Page#Stuff_that_should_be_avoided советуют избегать эту книгу
Ну я просто представил себе наглядно как мои данные крадут через очередное UB переполнения буффера. Аж передернуло.
>Книга устарела.
В книге дают основы, я параллельно вместе с книгой использую техническую документацию Microsoft, а вообще я смотрю информацию в нескольких книгах, мне ещё нравится "Внутреннее устройство Windows" Русиновича (7-е издание).
>>647027
>Уже наворотили разных api.
Что значит разных, я говорю конкретно про WinAPI.
Ты походу где-то вычитаешь указатель из целого числа, из-за чего такой результат.
Да, мне один знакомый советовал когда-то эту книгу, но я пока что без неё обхожусь, но спасибо за ссылку и совет.
А книга и вправду хорошая, зря я её не читал раньше.
Не пиши код с уб и контролируй буфер. Ты специально чтоли буфер переполняешь, когда код пишешь?
Где смотрите вакансии? Как искать на HH? По языку искать невозможно, потому что однобуквенное название. Какая вообще работа есть для программиста на Си, что пишут на Си в РФ?
>однобуквенное название
А ты ищи по двум буквам, на русском (Си).
https://hh.ru/search/vacancy?text=%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%81%D1%82+C%D0%B8&salary=&area=1&ored_clusters=true
Либо системный инженегр/программист.
Ещё есть всякие телеграмм каналы, либо через знакомых, общение в чатах с теми кто уже работает в каких-то компаниях.
Но как ты понимаешь, одного только Си недостаточно.
У вас книжку эту открывает или только обложку?
Норм открывается.
для написания программ под линукс разве си не достаточно? может раст начать изучать, но на него нет работы
> си не достаточно
Я к тому что ты как минимум должен понимать, архитектуру операционных систем, устройство памяти, как между собой работают пользовательский режим и режим ядра, как их используют потоки, объекты ядра, службы (демоны в linux) и прочие базовые вещи, ну и конечно же уметь работать с отладчиками, и иметь некоторые навыки программирования на ассемблере, опять же для отладки, поиска проблем используют дизассемблирование, реверс-инжиниринг, либо же иногда для оптимизации кода, его скорости используют ассемблерные вставки, особенно при программировании ядра (написании драйверов).
Да и ты сам можешь открыть любую вакансию, посмотреть какие там требования, ещё есть всякие роадмапы.
Знание одного только языка программирования в любой сфере недостаточно, это касается не только Си.
Да не за что анончик.
Вообщем есть какой-то организованный подход к микроконтроллерам, встраиваемым системам и прочему?
Вроде как первые 44 байта должен занимать заголовок .wav файла.
Мне надо как-то распарсить эти 44 байта, чтобы заполнить структуру на пике 3.
Как это сделать?
Обрезанный массив залил на пастбин: https://pastebin.com/vcGddRTW
Тебе обязательно всю структуру забивать заголовком? Возьми только нужные тебе значения по индексам и всё.
Давно работал с вав, но когда работал (выводил выборки на ЦАП) брал из заголовка только размер и частоту выборки, насколько я помню.
В чем суть вопроса? Можешь просто ручками читать следующие N байт и присваивать.
header.chunkID[0] = bytes[0];
header.chunkID[1] = bytes[1];
header.chunkID[2] = bytes[2];
header.chunkID[3] = bytes[3];
header.ChunkSize = bytes[4] + (bytes[5] << 8) + (bytes[6] << 16) + (bytes[7] << 24);
Понятно что это говнокод и все это можно автоматизировать/украсить написав красиывые функции которые будут увеличивать указатель текущей позиции, как будто из файла читаешь: header.ChunkSize = readNextInt();
Можно наверное и просто memcpy сделать, но надо чтобы струтура точно совпадала, без всяких паддингов между элементами. Например в gcc это включается __attribute__((packed))
Есть готовые либы (не уверен что именно для Си, но для С++ и раста точно есть), которые умеют читать структуры по их описанию. Но для тебя это будет оверкилл.
Просто memcpy? Или сразу в структуру читать, там же всё ровно, без какой-то дополнительной хуйни.
Пробовал гуглить даже как C. Filthy Stories, типо filthy имеет два перевода - откровенный/грязный, но книгу так и не нашел
Выучил самые основы языка Си, делаю задачи на codewars, дошел до 7 уровня, начал сегодня. Пока интересна книга Андре Ламот Программирование игр под Windows, хочу учить ассемблер
Как мне повысить свои навыки в Си, чтобы не быть обезьяной с гранатой?
Да ты зачем это делаешь, не писал же, что спец
Просто хочу понять как повысить навыки, что почитать
Ну, это понятно, просто интересно, никаких поисков не производил, а какой язык безопасный? Только какой-нибудь высокоуровневый по типу Java, Kotlin или Python?
Просто ещё читал какую-то статью и там писали, что раньше Си был совершенно другим, был ближе к языку Ассемблера, к машинным командам, а начиная с какого-то стандарта стал считай, что высокоуровневым и медленным
Помню, когда на первом курсе учился был удивлен, что в Си раньше не было цикла for, только while, поэтому может и в правду быстрый был только старый Си, а нынче и Питон Си обгонет
Это правда?
это как язык со сборщиком мусора, но без него
без знания Сишки всё равно не поймёшь его преимущества
Сап, аноны, тупой как пробка.
Если запросил памяти из кучи и забыл ее освободить до какой поры она будет недоступна? До тех пор процесс, в котором был запрошен этот самый кусок памяти в куче, не завершится или пока ты не перезагрузишь ПК, чтобы RAM очистилась?
Ну, есть знание самых основ Си, может что и пойму
>смысла раста чтонибудь переписать, ничего своего не сделали.
>а на си держится весь костяк.
Бессмысленный набор слов.
Зависит от операционной системы.
Операционная система сама выделяет память под программу, если разраб криворукий, то зависнет только программа, а не вся ОС
Ну, я плюс-минс понимаю, что выделения памяти через API происходит
Извини, не совсем тебя понял
Имел в виду, вот условно я выделил 100 Мегабайт памяти для своего процесса, пусть это будет чисто .exe, и забыл освободить, что будет дальше? Память сама освободится после завершения процесса или придется перегрузить ПК, чтобы состояние RAM обнулилось
Тебе уже два раза ответили.
Спасибо анончик
В зависимости от ОС, но распишу подробнее.
Всякие Линуксы, винды и маки и прочие десктопные ОС родом с 90-х и даже 80-х годов очистят эту память как только закончится твой процесс, а может даже раньше.
А вот если у тебя уже более древняя ОС или ОС для всяких микроконтроллеров/платок, то там уже смотреть надо
Ребут устройства практически точно освободит тебе память, если только какой-нибудь шиз не придумает при ребуте восстанавливать состояние системы до ее ухода.
Спасибо >>662025
А вот, если в какой-нибудь функции будет выделена память?
Например так:
#include <stdlib.h>
void foo { void* p = malloc(100000); }
int main(){
foo();
return 0;
}
Вроде как, указатель на область памяти размером 100к байт будет занят, и освободится в описанных тобой условиях
Но есть ли вероятность, что память для p будет освобождена при завершении работы функции? Или условно какой-нибудь оптимизирующий компилятор, где увидит, что указатель не глобальный, не static, не external и сам вызовет вызов функции free()? И если такой есть, так будет освобождаться память под матрицы и тензоры всякие?
при завершении работы функции foo*
Если компилятор увидит, что p не используется, он само выделение памяти выкинет.
Дак мне и надо протестировать Си код. Если вы знаете как это сделать без использования либы из плюсов , то прошу , поделитесь!
C++ тред ниже.
Ну, хз, вроде стандартный ввод в C это stdin, как тебе выше ответили, для ввода данных с клавиатуры используется scanf(), ну, или на крайняк попробуй функцию fscanf()
Википедия
создаем две переменные - c и pred, даем последнему значение 0.
пока си получает значение не равное eof выполняем{
если си == пробел
если пред == 0
достаем значение си, а пред делаем равным 1
если си не равен пробелу
достаем значение си и делаем пред равным нулю
}
но надо же посчитать подряд стоящие пробелы и если их несколько заменить на один, какого хуя во вложенном ифе идет подсчет только первого? как заменяются несколько пробелов на один? как вообще комп понимает что пробел не один подряд? разве не должен быть счетчик считающий все пробелы и потом каким то хуем заменяющий все n-ые пробелы одним?
в общем я ничего не понимаю, кусок кода будто бы убрали отсюда, но это ведь работает!
это код с книги Кернигана и Ричи "Язык программирования С", если что.
буду сильно благодарен за объяснение.
фикс - это решение какого-то чела с какого-то сайта на задание из этой книги
Если был введен пробел{
Если пробела был до этого не было{
Печатаем пробел
Запоминаем, что пробел был pred = 1
Если дальше будет пробел, то пробел
напечатан не будет
}
}
Если с клавиатуры ввели не пробел, то{
Печатаем символ
Обнуляем переменную, которая
отвечала за то -- был ли введён пробел
}
Совет, если не понимаешь как работает часть программа, то сделай блок-схему и сделай пару итераций
Тебе не нужно считать пробелы. Тебе нужен только факт - был предыдущий пробелом, или не был, когда тебе встретился пробел.
Все остальное сводится к этим случаям.
Самый важный совет: называй счетчики c или n. И вообще, все локальное обзывай одной-двумя буквами.
дедушка
И в результате эта функция
без оптимизации напечатает null или умрет
а с оптимизацией напечатает не null.
Как же охуенно.
Ебать, это чё за компилятор такой, что вызовы функций сам регулирует? Или я отстал от жизни, какие это хоть флаги примерно?
>>665634
Всм, причём тут оптимизация? Ты просто выделяшь в heap память, но при этом теряешь указатель, и логично, что у тебя будет или нихуя не выделенно (null) или выделена память, напечатан на неё указатель и сразу проёбан
> Ебать, это чё за компилятор такой, что вызовы функций сам регулирует? Или я отстал от жизни, какие это хоть флаги примерно?
Банальный clang -O. Еще может malloc + memset заменить на calloc, а printf на puts.
> Всм, причём тут оптимизация?
При том, что она выкинет весь цикл.
Мдэ, нихуя себе работник
Ошибка в функции, код которой по ссылке: https://pastebin.com/2f6xKhTu
Ок, проверку не пустой ли массив, если я правильно понял
> && name->host[0]
можно пофиксить как:
> && (name->host[0] != '\0')
А что разработчики пытались проверить с помощью:
>name->host
и как это фиксить???
Есть ещё вариант подавить проверку -Waddress, но для GCC и мэйк-хунйк файлов я не знаю как это сделать. Но тогда есть вероятность ошибки.
Я бы добавил проверку name на NULL в самое начало условия, а всякие name->host, name->service удалил нахрен ибо эти поля всегда не NULL.
> name->host проверка на NULL
Каким образом? Всё крашнется, если name==NULL.
host - массив чаров в структуре, он не может быть NU
Что за вкладка кастомайзед?
Короче, убрал
>name->host && name->host[0]
Заменив на
>(strlen(name->host) > 0)
Запустил, вроде работает в моём случае.
И накатал баг-репорт. А там пусть фиксят как хотят.
В терминале же
> Короче, убрал
Закон сохранения говнокода as is.
Я же объяснил как писать
return(
(name && name->host[0] && !strcasecmp(name->host, "_services"))
&& (name->service[0] && !strcasecmp(name->service, "_dns-sd"))
&& (name->proto[0] && !strcasecmp(name->proto, "_udp"))
&& (name->domain[0] && !strcasecmp(name->domain, MDNS_DEFAULT_DOMAIN))
&& type == MDNS_TYPE_PTR
);
Есть ли тут люди, которые проходили курс по программированию у Александра Григорина? Посоветовать можете?
Сложно сказать, как по мне Си для алгоритмов не так плох, разве что в нем нет изобилия синтаксического сахара как в условном Пайтоне
Привет Си аноны посоветуйте материалы по программированию unix
Роберт Лав - Системное программирование (2014)
Pthread это и есть айди потока. Футкция птреад_селф.
А вообще можно сделать стракт {птреад, лонг айди} и передавать в функцию этого же треда и брать готовый айди, если тебе таое значение нужно, а не тид.
Да , я знаю. Просто задание звучит "Реализовать свою функцию". А как получить переданную струтуру ? Я так и делаю , просто функция гет тид, сигнатуру которой нельзя менять, вызывается уже внутри функции в которую передана структура через pthread_create.
Покопай в стоорону Anonymous Pro и Fira Code
Как переключать xcb окно из оконного в фулскрин и обратно?
https://pastebin.com/deDHSaKb
pwd: 2ch
Нет так врятли сработает. Оно ждкт указатель, тоесть это то что тр должно существовать вне функции в момент ее вызова.
Да и какой в этом смысл?
Компрессоры декомпрессоры уже гаписаны подо все. Бкри злиб зстд и дальше от них более профилтные баису всякие
Я не нашёл рабочей реализации LZSS, которая бы мне подошла.
>Да и какой в этом смысл?
Функции захардкожены автором с большой вложенностью.
Переписывать их вообще не стоит...
Да и удобнее просто передать значения, без выделения памяти для переменной.
Думал, что есть какой-нибудь ХАК, чтобы наебать компилятор. Хотя бы для случая, когда требуется просто чтения и функция не будет писать по адресу.
Привет. Книга называется "Методы сжатия данных. Устройство архиваторов, сжатие изображений и видео" Д.Ватолин, А.Ратушняк, М.Смирнов, В.Юкин. 2003 год
>>Чому никто не перекатывает?
Кто, я?!
Возьми да перекати
Или как с опенсорсом? пиздеть горазды, а как взять да исправить/сделать, так всё?
>Или как с опенсорсом? пиздеть горазды, а как взять да исправить/сделать, так всё?
Чёт какие-то ёбики заполонили этот тред.
Причина тряски?
Это копия, сохраненная 23 мая 2023 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.