Это копия, сохраненная 2 марта 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 помогает читать сложные сишные декларации.
Этот тред копия 01/08/19 Чтв 23:34:41 №1446278 с вебархива №47
Прошлые треды:
предыдущий тонет тут: https://2ch.hk/pr/res/2493863.html (М)
https://arhivach.ng/
да, ето Я, слушаю
И вакух нихуя нет, чуть-чуть ебли с линуксом в госпарашах, чуть-чуть микроконтроллеров. Нахуй так жить.
Ну наконец-то тред в перечне появился!
https://pastebin.com/nX3vEx2X
считает то норм, но время работы рассчитывается пиздец странно - по смыслу это время работы самого длительного процесса, но почему то на 1 процессе оно быстрее чем на 4, а на 4 быстрее чем на 16 потому что говнокод
сможешь помочь подправить?
По идее нужно было прост написать параллельную MPI-программу для интегрирования методом Монте-Карло,
которая принимает аргументом точность и генерирует точки до тех
пор, пока численный ответ не приблизится к аналитическому.
Если бы не задание, тут и параллелить не было бы смысла. Кажется что накладных расходов на организацию параллелизма больше чем выгоды но скорее всего это потому что говнокод
Как язык с ГЦ пересекается с областью применения Си?
450x360, 1:24
>лыхитимный
>нелыхитымный
ебонашки что творите то блять вас сдесь полинвалида вы чё делите то блять конченые я хуею с вас прост
>Битовый сдвиг вправо для знаковых целых implementation defined.
Странно, в крестах в стандарте закреплено что для знаковых арифметический, для без - логический.
Начиная с C++20
> потому что битовое представление знака ID.
C99 6.2.6.2
the sign bit is one, the value shall be modified in one of the following ways:
— the corresponding value with sign bit 0 is negated (sign and magnitude);
— the sign bit has the value −(2N) (two’s complement);
— the sign bit has the value −(2N − 1) (one’s complement).
Which of these applies is implementation-defined, as is whether the value with sign bit 1 and all value bits zero (for the first two), or with sign bit and all value bits 1 (for one’s complement), is a trap representation or a normal value. In the case of sign and magnitude and one’s complement, if this representation is a normal value it is called a negative zero.
fflush(), если всё ок вернёт 0. Если нет, то он вернёт константу EOF и запишет в специальную глобальную переменную errno код ошибки. Коды ошибок у fflush() в общем те же, что и у системного вызова write(). Ну там уж гугли, какие они бывают. Короче далее проверяешь, что errno равен такому-то коду и делаешь уже то, что нужно в случае ошибки
fflush вернет мне ошибку, если какой-то из предыдущих fprintf не смог записать все байты?
Это просто отладочная какая то штука или через нее реально драйвера для нажатий на клавишы пишут?
Это, дети, сишкоблядь. Посмотрине на него внимательно. Посмотрите. Видите, как трясутся руки у полудохлого пердеда? Какие мозоли натёрты на кончиках стариковских пальцев? Видите, как согнута за бесконечными отловами use-after-free и stack overflow его тощая сутулая спина? Что шамкает этот старый хуеплёт? Что он пытается пробулькать своей омерзительной дырой на жопной роже?
--- Пфркхтпф сишка тру, - пёрнул старый хуесос, - Пфсишка пф лучший езык.
Видите, дети, как это омерзительно? Как мерзко выглядит этот выкинутый на свалку IT бывший специалист? Видите, как вываливается его геморроидальная кишка и на пол капают гнойные капельки ANSI C? Видите, как канатом вываливается пучок template-глистов? Как из поганой пасти старпёра вместе с кровавой блевотой вываливаются сегфолты и статичкеские типы? Видно ли вам, дети, как дурнопахнущие шаблоны кровавыми коростами отваливаются от костлявой жопы сишкоблядка, исполосованной пролежнями и целлюлитом?
Сишковыблядок - не человек. Это ебучий якорь мира IT, это сраная кодла говняных мух, которые только и умеют, что жрать говно и паразитировать на нём. Эти ебучие гигабайты сраного сишного кода, который надо обмазывать сотней анализаторов, чтобы отловить очередной глюк, высранный пиздорылой полудохлой шлюхой программистского сообщества. Сишкоблядство настолько глубого въедается в подкорку межушной пустоты дегенерата, что я могу определить сишкоблядь одним только взглядом. Они всегда нищие, потому что за патчики в швабодное ПО никто не платит, а современное ПО на Сишке это ебаное легаси, которое продаётся только по большим празникам. У них вседа круги под мутными глазёнками, потому что всю ночь они отлавливали место, где обращение к элементу массива крашится из-за того, что мудила не выделил в нужном месте память. У них всегда вздыбленные на жопе обдроченные брюки, и вовсе не от того, что дед опять обосрался, а из-за огромной геморроидальной грозди. И штаны обтруханы не из-за дрочева на баб, а из-за дрочки на славные 80-е, с их ебучими бобинами, перфокартами и иконкой сишкобляди - дискеточками.
Я презираю сишкоблядь. Если ты сишкоблядь, то пизданись своей закостенелой в непоколебимом апломбе старого дегенерата бошкой и освободи мир от своего присутствия. Никогда не садись рядом с нормальными людьми и не заговаривай с ними - ты сишкоблядь, недочеловек. кусок старого гнилого мяса. Иди на хуй. Вы превратили софт в ебаную кучу говна, которую проще переписать, чем доработать ваши высеры. Вы умудрились принести в 21-ый век то, что должно было загнуться в начале 90-х. Вы умудряетесь дышать, когда вам бы пора уже и к земельке привыкать.
День, когда сдохнет последний кодосёр на Сишке, станет праздником человечества.
Это, дети, сишкоблядь. Посмотрине на него внимательно. Посмотрите. Видите, как трясутся руки у полудохлого пердеда? Какие мозоли натёрты на кончиках стариковских пальцев? Видите, как согнута за бесконечными отловами use-after-free и stack overflow его тощая сутулая спина? Что шамкает этот старый хуеплёт? Что он пытается пробулькать своей омерзительной дырой на жопной роже?
--- Пфркхтпф сишка тру, - пёрнул старый хуесос, - Пфсишка пф лучший езык.
Видите, дети, как это омерзительно? Как мерзко выглядит этот выкинутый на свалку IT бывший специалист? Видите, как вываливается его геморроидальная кишка и на пол капают гнойные капельки ANSI C? Видите, как канатом вываливается пучок template-глистов? Как из поганой пасти старпёра вместе с кровавой блевотой вываливаются сегфолты и статичкеские типы? Видно ли вам, дети, как дурнопахнущие шаблоны кровавыми коростами отваливаются от костлявой жопы сишкоблядка, исполосованной пролежнями и целлюлитом?
Сишковыблядок - не человек. Это ебучий якорь мира IT, это сраная кодла говняных мух, которые только и умеют, что жрать говно и паразитировать на нём. Эти ебучие гигабайты сраного сишного кода, который надо обмазывать сотней анализаторов, чтобы отловить очередной глюк, высранный пиздорылой полудохлой шлюхой программистского сообщества. Сишкоблядство настолько глубого въедается в подкорку межушной пустоты дегенерата, что я могу определить сишкоблядь одним только взглядом. Они всегда нищие, потому что за патчики в швабодное ПО никто не платит, а современное ПО на Сишке это ебаное легаси, которое продаётся только по большим празникам. У них вседа круги под мутными глазёнками, потому что всю ночь они отлавливали место, где обращение к элементу массива крашится из-за того, что мудила не выделил в нужном месте память. У них всегда вздыбленные на жопе обдроченные брюки, и вовсе не от того, что дед опять обосрался, а из-за огромной геморроидальной грозди. И штаны обтруханы не из-за дрочева на баб, а из-за дрочки на славные 80-е, с их ебучими бобинами, перфокартами и иконкой сишкобляди - дискеточками.
Я презираю сишкоблядь. Если ты сишкоблядь, то пизданись своей закостенелой в непоколебимом апломбе старого дегенерата бошкой и освободи мир от своего присутствия. Никогда не садись рядом с нормальными людьми и не заговаривай с ними - ты сишкоблядь, недочеловек. кусок старого гнилого мяса. Иди на хуй. Вы превратили софт в ебаную кучу говна, которую проще переписать, чем доработать ваши высеры. Вы умудрились принести в 21-ый век то, что должно было загнуться в начале 90-х. Вы умудряетесь дышать, когда вам бы пора уже и к земельке привыкать.
День, когда сдохнет последний кодосёр на Сишке, станет праздником человечества.
Опытные господа, свангуйте что может быть не так.
Мне надо реализовать возможность "дельты" для параметра (сумма или разность с текущим измеренным значением) в макросе (так обзывается оболочка, в которой исполняется пользовательский код на Си).
Измеренное значение отображается в дисплее с типом DWord и форматом Float.
Код:
float tmp_val = 0;
int delta = 0;
DWORD temp_value;
// в промежуточную переменную типа Float (tmp_val) заносим сумму или разность считанного значения типа DWord (temp_value) и дельты delta типа Int (в зависимости от знака дельты)
// Здесь же преобразуем DWord (temp_value) в Float
tmp_val = (delta >= 0) ? (DWord_2_Float(temp_value) + delta) : (DWord_2_Float(temp_value) - (delta -1));
// заносим значение промежуточной переменной tmp_val в регистр, например, PSW300 (+ 301) - который и отображается в дисплее с типом DWord и форматом Float
(float)(PSW+300) = tmp_val;
, где:
delta - переменная типа Int, которая хранит собственно дельту;
tmp_val - переменная типа float, которая хранит промежуточное значение для вычислений;
temp_value - переменная типа DWord, которая хранит считанный с преобразователя параметр;
С положительной дельтой всё в порядке, а если дельта имеет знак минус - происходит переполнение что ли: на дисплее отображается 6.86+05. Типа того.
Проверял код в эмуляторе Си - всё впорядке: https://onlinegdb.com/UPxuD_VG8
В чём проблема?
Предположил, что по каким-то причинам косяк в арифметических действиях между целочисленными и вещественными типами (Inи Float).
Пробовал привести типы к одному, явно и не явно:
(float)delta;
float tmp_delta = delta;
Даже так попробовал:
tmp_val = (delta >= 0) ? (DWord_2_Float(temp_value) + delta) : (DWord_2_Float(temp_value) - (delta -1.0));
По идее, компилятор должен автоматом привести к типу Float.
Пробовал и замену суммы, на разность (для того и умножал на -1) - не помогает.
Типа,
10 - 3 = 7;
10 + (-3) = 7;
10 - (-3 * -1) = 7;
Что может быть не так? Почему с положительной дельтой всё нормально, а с отрицательной проиходит непонятная хрень?
Поддержка молчит.
Опытные господа, свангуйте что может быть не так.
Мне надо реализовать возможность "дельты" для параметра (сумма или разность с текущим измеренным значением) в макросе (так обзывается оболочка, в которой исполняется пользовательский код на Си).
Измеренное значение отображается в дисплее с типом DWord и форматом Float.
Код:
float tmp_val = 0;
int delta = 0;
DWORD temp_value;
// в промежуточную переменную типа Float (tmp_val) заносим сумму или разность считанного значения типа DWord (temp_value) и дельты delta типа Int (в зависимости от знака дельты)
// Здесь же преобразуем DWord (temp_value) в Float
tmp_val = (delta >= 0) ? (DWord_2_Float(temp_value) + delta) : (DWord_2_Float(temp_value) - (delta -1));
// заносим значение промежуточной переменной tmp_val в регистр, например, PSW300 (+ 301) - который и отображается в дисплее с типом DWord и форматом Float
(float)(PSW+300) = tmp_val;
, где:
delta - переменная типа Int, которая хранит собственно дельту;
tmp_val - переменная типа float, которая хранит промежуточное значение для вычислений;
temp_value - переменная типа DWord, которая хранит считанный с преобразователя параметр;
С положительной дельтой всё в порядке, а если дельта имеет знак минус - происходит переполнение что ли: на дисплее отображается 6.86+05. Типа того.
Проверял код в эмуляторе Си - всё впорядке: https://onlinegdb.com/UPxuD_VG8
В чём проблема?
Предположил, что по каким-то причинам косяк в арифметических действиях между целочисленными и вещественными типами (Inи Float).
Пробовал привести типы к одному, явно и не явно:
(float)delta;
float tmp_delta = delta;
Даже так попробовал:
tmp_val = (delta >= 0) ? (DWord_2_Float(temp_value) + delta) : (DWord_2_Float(temp_value) - (delta -1.0));
По идее, компилятор должен автоматом привести к типу Float.
Пробовал и замену суммы, на разность (для того и умножал на -1) - не помогает.
Типа,
10 - 3 = 7;
10 + (-3) = 7;
10 - (-3 * -1) = 7;
Что может быть не так? Почему с положительной дельтой всё нормально, а с отрицательной проиходит непонятная хрень?
Поддержка молчит.
Аппаратчик, я узнал тебя по говнокоду. Почему ты пытаешься программировать - кабаныч не выделил вакуху разраба? А уборщица у вас отдельная есть?
Ну дя, вапроси?
>/dev/input/event* ?
https://www.kernel.org/doc/Documentation/input/input.rst}
>>504758 (Del)
Хуле там гуглить, если всё есть в документации ядра?
Изменить указатель находящийся по этому адресу, например из другой функции.
Много - не мало. Всегда сможешь релизную сборку сделать с -DNDEBUG
играюсь тут со скриптами из репозитория bcc, конкретно остановился на этом
https://github.com/iovisor/bcc/blob/master/tools/profile_example.txt
хотел собрать стэк работы ldap-сервера построить flamegraph и все-таке. но незадача - у меня вместо сигнатур функций [unknown] везде
https://pst.klgrth.io/paste/5dywb
кто может без окунания в говно пояснить поподробнее, что сделать чтобы их увидеть? я вроде попытался поставить пакеты debuginfo (конкретно 389-ds-base-debuginfo и 389-ds-base-lib-debuginfo), но ничего не завелось.
Надо смотреть как собран этот ldap-сервер. У тебя по ссылке написано что оно не будет работать если программулина собрана с -fomit-frame-pointers, что очень вероятно, так как GCC включает эту опцию на O1 и выше.
Ух блять епта, плохие новости. Но спасибо, я что-то проглядел.
Постараюсь узнать ещё у разрабов в рассылке что-нить.
Рапортую.
Дело было в приведении типов: элемент Ввод данных для переменной дельты имеет тип Word и формат Dec. Переменная, хранящая дельту, имеет тип Int. Решилось всё с помощью преобразования Word_2_Int16(x). Далее тип Float и Int можно нормально складывать и вычитать.
а на каком уровне разобраться?
в 2022 мыслим только клиповым мышлением, так что для старта могу посоветовать видосик
https://www.youtube.com/watch?v=x1npPrzyKfs
а там куда нелегкая кривая теребения ядра заведет. хороших книжек по ядру (актуальных) вообще мало, так что попробуй оф. документацию
https://docs.kernel.org/admin-guide/cgroup-v2.html?highlight=cgroup
и мне надо чтобы при нажатии кнопки запускался цикл, который смотрит текущее время на компе и сравнивает его с тем временем которое я указал как время когда меня надо будить. как доставать время из компа и преобразовывать его в строку я нагуглил. написать цикл который каждую секунду будет сравнивать строчку получившуюся из времени и строчку из спинбокса пикрил я скорее всего тоже смогу. я так же нагуглил как вписывать данные в формы, поэтому мой будильничек уже умеет проигрывать любой файл который я выбираю.
но я не понимаю как доставать время из спинбокса и я не могу нагуглить ни на стеке ни где-то ещё как это делается на крестах. пожалуйста подскажите кто знает как доставать данные из формочек этих.
и ещё - вот на скриншоте то что у меня сейчас есть. почему тут несколько файлов? если я объявляю переменную в main.cpp то я не могу использовать её в mainwindow.cpp но если я объявляю её и там и там то программа не компилится потому что надо объявлять в каком-то одном файле. можно ли как-то объявить переменную в одном файле а использовать во всех?
> Можно, ебани в хедер
ты имеешь в виду mainwindow.h? программа больше не компилируется, пишет :multiple definition of `fileName'; mainwindow.h:11: first defined here
больше я её нигде не объявлял, это единственное не закомментированное объявление. я не понимаю что ему от меня надо.
в универе дали задание написать алгоритм Ли, на языке С.
не программистская специальность, теории графов у нас не было, но там ничего сложного.
написал очередь для алгоритма, написал список смежности, и тут я проснулся в подливе и тут у меня возник вопрос: а этот алгоритм на списке можно вообще реализовать? все реализации которые я видел были на С++ матрицах смежности.
из литературы я изучал В.В. Прут "Алгоритмы на языке С" издательство МФТИ, там тоже всё на матрицах
двачик, я уже ёбнулся с этими структурами. хелп ми ор килл ми
Если сам не осиливаешь, то спиши у другого
Не думаю что тут кто то за тебя будет Лабы делать
это не лаба. в универе вообще ничего про это не было и не будет ни у кого на моей специальности.
мне и не нужно чтобы кто то что то за меня писал. мне просто нужны ответы на вопросы, по тому что я не понимаю некоторые моменты.
и что значит (void *) ptr
нахуй это вообще нужно?
Да. Было бы желание, ибо сейчас байтоёбов с универа нихуя не выходит - все на вебе, мобилках.
Желательно чтобы у тебя было хотя бы несколько коммитов в опен-сорсные проекты, совсем будет заебись если умудришься что-нибудь в ядро запихать там есть мелкий задачки вроде исправления опечаток: это всё покажет что ты умеешь следовать описанным в проекте процессам, понимаешь что такое ревью кода, ну и вообще вменяемый человек.
Ну и стоит сказать, что скорее всего твоя байтоебля будет связана с линуксом, причем вероятнее всего не на ПК, а на всякой встраиваемой хуете.
мимо байтоёб
Будешь пердолить Linux на ARM и RISC-V в госпараше за пайку Не вкатишься. Вакух для джунов на C/C++ нет.
Кто пробовал собрать gcc из исходников? Я вроде добился на ubuntu сделал ./configure потом make без ошибок. Вот только не понял make install надо делать? В оф. документации вообще не говорится что это надо делать. Где теперь новые бинарники? Как запустить?
Самый простой способ собрать GCC - использовать ABE от Linaro.
Второй самый простой - скачать пакет ubuntu и пересобрать его примерно так:
apt source gcc
sudo apt build-dep gcc
cd gcc-<версия>
sudo debuild -b -uc -us
Вот только нахуй оно тебе нужно? Сборок под все существующие платформы сколько угодно.
Я хочу отдебажить сам gcc. Я кажется нашёл что он пропускает warning с неинициализированным указателем в определённых условиях, хочу разобраться почему он так делает, ну и если я прав что это ошибка, то попробую сделать контрибьют. Хорошая строчка будет в резюме - типа я сам компилятор правил и почти весь прочитал.
Дело хорошее, успеха тебе.
Тогда лучше всего собирать его с префиктом вроде /opt/gcc чтобы make install устанавливал его туда. В противном случае ты рискуешь переписать файлы системного gcc, что ни к чему хорошему не приведёт.
А еще я бы рекомендовал тебе всё это делать в chroot, чтобы не попортить систему. В этом случае даже если ёбнешь что, то перегенеришь chroot и всего делов.
Про chroot рекомендую почитать тут: https://wiki.debian.org/Schroot
. не имеешь дело с легаси кодовой базой;
. не разрабатываешь под платформу, на которой нет компилятора C++;
. не пишешь что-то настолько маленькое, чтоб удобствам C++ негде было проявиться?
Я прекрасно понимаю, почему с него полезно начинать. Приучаешь себя взвешивать цену каждого действия, и вообще простота для вката, годный учебник K&R, ничего лишнего, все только самое важное. Сам Сишечку люблю и обожаю. Но сейчас даже с точки зрения микрооптимизаций мне C++ кажется лучшим языком. На C может быть лень прибегать к нечитаемому байтоебству, и ты предпочтешь какое-то компромиссное решение. А на крестах ты один раз сделаешь какой-нибудь zero-overhead прокси-класс на темплейтах, и всегда простым синтаксисом будешь дергать его, получая идеальный перфоманс без компромиссов.
Алсо, слышал (и сам замечал), что на крестах бинарники получаются тяжелее из-за библиотек. Но разве под resource critical задачи не существует инструментов, которые выковыривают код неиспользуемых символов? Или на уровне .o файлов это какой-то неавтоматизируемый анализ с точки зрения математики? Я тупой, объясните.
А еще тут в каком-то из тредов кидали ссылку на cmustdie, где рассказывается, какие разработчики GCC конченные пидарасы, хуесосы и нехорошие люди. Стандарт стандартом, но разве это мешает запилить некий Gigachad C Compiler, который будет соответствовать всем канонам труъшности и гарантированно поддерживать всякие Кармаковские трюки as expected? Или gcc/clang так умеет, если прям все-все-все -fno-strict-aliasing проставить?
Ну а то, что он позволяеят делать что хочешь с указателями и не заставляет кастовать, как кресты, это мне как раз нравится, и тут анало-говнет, ящитаю.
всё получилось, последняя версия gcc находит ошибку.
>что на крестах бинарники получаются тяжелее из-за библиотек. Но разве под resource critical задачи не существует инструментов, которые выковыривают код неиспользуемых символов?
когда нет ресурсов пишут свои библиотеки.
можно ещё юзать прогу strip.
strip это отдельная утилита, но есть ещё:
‘install-strip’
Like install, but strip the executable files while installing them. In simple cases, this target can use the install target in a simple way:
install-strip:
$(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' \
install
But if the package installs scripts as well as real executables, the install-strip target can’t just refer to the install target; it has to strip the executables but not the scripts.
install-strip should not strip the executables in the build directory which are being copied for installation. It should only strip the copies that are installed.
Normally we do not recommend stripping an executable unless you are sure the program has no bugs. However, it can be reasonable to install a stripped executable for actual execution while saving the unstripped executable elsewhere in case there is a bug.
это опции сборки gcc , описаны на странице https://www.gnu.org/software/make/manual/html_node/Standard-Targets.html
лень проверять сколько сэкономят, пока мне это не надо.
ключ -Werror превращает предупреждения в ошибки. Я хочу писать идеальный код :-)
Как вкатиться в этот опенсорц? Что надо знать?
Дальше создания профиля на гитхабе и ввкладывания туда своего мини проекта не заходил.
Открывай тикеты и пиши багрепорты. Багов в софтах всегда хватает. Владеть схх не обязательно.
Там с выходом новой убунты 22.04 все проги видеозахвата сломались. Попробуй починить.
Чекай возвращаемые значения fwrite. Чекай errno. Если всё ок - fwrite возвращает колво записанных байт, а errno == 0
Убунта не причём, это всё вейланд. На иксы переходи и радуйся жизни
Ладно, паю годноту. Достаточно проверить перед закрытием ferror, потом проверить fflush.
Попробуй написать компилятор
int myNum;
int myNum;
int * myNum;
Первое нелогично из за возможности объявить несколько таких переменных через запятую, и в каждой будет нужна звездочка. Тут же написано будто звездочка принадлежит слову типа, а значит остальные такие переменные должны быть без звездочек.
Изначально писал в первом стиле, правда хуй знает почему. Сначала подумал потому что так писали в K&R, но сейчас проверил второе издание и там второй вариант используется.
Но потом почитал умных книжек, набил шишек и перешел на второй вариант. Он верен хотя бы потому, что указатель - это не совсем тип данных, поэтому хули ему делать рядом со словом типа?
Даже диды пишу во втором стиле:
https://www.kernel.org/doc/Documentation/process/coding-style.rst
https://man.openbsd.org/style
http://doc.cat-v.org/bell_labs/pikestyle
Я тупенький, если не могу это сделать? Мне как дальше то...
Бекендер-зумерок на связи.
Хочу вот долгое время изучить как устроены все мои приложухи на более низких слоях абстрации, поэтому захотел изучить C, но т.к я за практикоориентированное обучение, то могут ли мне мудрецы подсказать маст-хев проекты которые нужно реализовать.
Пока что в списке только два - HTTP сервер( не дорос до него чутка) и своя оболочка типо баша, но облегчённая(прямо сейчас делаю)
Прогу консольную, которая извлекает все mp3 из произвольного незашифрованного несжатого архива. Если есть теги, то извлекает mp3 с тегами, если тегов нет, то извлекает mp3 без тегов. Понимает любые варианты mp3. Память использовать по минимуму, в идеале 64 килобайт.
То же самое для всевозможных вариантов jpg.
То же самое для всевозможных вариантов dds.
Прогу, которая извлекает всю графику из pdf в исходном качестве. Тут пригодятся наработки с jpg, а также библиотеки zlib и stb_image_write.
Консольный калькулятор с блекджеком и шлюхами. Чем больше умеет тем лучше.
Простую игру на винапи. Змейку например.
Где находятся эти сорсы, которые он прикладывает?
У меня на убунту check 10 версии так подгружается через -lcheck, а мне нужно чтобы подгружался 11. Как обновить?
struct FixedGridCell fixedGrid;
struct FixedGridCell fixedGridArray[1];
Мне нужно из C модуля в мою смузипарашу вытащить хороший указатель на один экземпляр моей структуры, чтобы потом копирнуть её в нативный буфер для ГПУ
>>1008826 (OP)
Без понятия как нормально сформулировать проблему, поэтому пишу сюда
https://pastebin.com/hmT1ZJD2
почему данный кусок поделки на C ничего не выводит, хотя очевидно что при табуляции X принимает значение 0? по наблюдениям при табуляции получается не точное число, а что-то стремящееся к данному числу. пытался в костыль с округлением, не помогло. При этом если заменить 1./10 на 1./2, то оно выполняется
}
Спасибо.
А есть более элегантные способы решения, чем домножение до целого числа? первое что в голову пришло
дело не в умножении, а в том что ты можешь только сравнить больше или меньше число, но не использовать сравнение на равно.
x>0 или x<0 работать будет. сравнение на равенство может производится через так называемый epsilon, достаточно малое значение которое определяет разницу между величинами.
x-a < EPSILON.
Другой вопрос, чего ты решил использовать дубл, не понятно
Да, благодарю за пояснение. Эпсилон решает эту проблему.
https://pastebin.com/yptgdPJu
Насчет double, его применение действительно не обосновано, этот код - тестовый стенд для наиболее простого воспроизведения проблемы, изначально возникшей при табулировании системы уравнений с шагом 0.1, офк там сравнивались переменные с плавающей точкой и в итоге число "на стыке" двух множеств попадало не на ту "ветвь". Как-то так
Во втором соучае не надо писать &
K&R
typedef struct tNode {
...
} Node;
kernel style
typedef struct node_t {
...
} Node;
Чел с ютуба
typedef struct Node {
...
} tNode;
Это кажется запрещено мисрой.
Так, стоп. А если я вообще ничего не пишу после скобок, если использую typedef?
Для чего там вообще разные имена? Путаница какая-то получается.
Typedef struct почти никогда не нужен и часто вреден (плодит сущности, скрывает инфу о сложности объеета).
https://pastebin.com/4pmN1LCd
Компилируется, но вылетает при запуске.
На ideone код работает, но переменная получается неинициализирована из за того, что её функция не вызывается. Только не понятно, зачем так делать, зачем вызывать только маленькую функцию напрямую. Ну и static на функции не имеет смысла.
Взять указатель натурально нулевой ячейки памяти, прочесть следующие 100500 байт, оступить на 100500 байт, прочесть следуюшие 100500 и так пока все 16 гиг оперативы не будут пройдены?
Гугли виртуальную память
Сравнивать можно, только надо обязательно указывать точность. Вместо if (a < b) будет if (b - a <= 0.001) например.
< или > можно же делать, если с пониманием
>>2523473
East Germany
не ахуел?
Самый популярный коньпилятор под юниксы, множество архитектур и расширений в нем. В последнее время появилась альтернатива: clang.
Я именно диалект GNU C имел ввиду, а не GNU compiler collection.
>расширений в нем
Вот это уже ближе к теме.
Хуита какая-то. Это ведь все на стеке остается, куда ты пытаешься сослаться. Может структуру какую заебашить? И держать там стейт и указатель на функцию. Правда не понятно нахуя оно тогда надо.
>единственному идеальному и всесторонне годному средству программирования как на системном, так и на прикладном уровне
Ты это про С++ штоль? Ничего против С не имею, хороший язык который, однако, уже неактуален в силу наличия крестов. Они удобнее ну практически во всём, особенно когда речь идёт о жирном прикладном софте или геймдеве.
if (abs(b-a) . . .)
Дай угадаю. Ты вчера начал учить кресты? Или через 10 лет разработки веб-параш на питухоне решил пойти посмотреть что там за C++ такой?
спасибо, в целом я сам плюс минус разобрался, но с ссылками этими стало чуть понятнее. эти источники мне гугл не выдавал, может искал не правильно, не знаю.
Тоже считаю что он прав.
Не надо воспринимать плюсы как современное говно, в которое неклторыеиуебки хотят его превратить. Плюсы вполне себе эволюция си, пиши на в ортодоксальном стиле и в хуй не дуй. Подводных нет - одни профиты.
Сразу видно вебпарашного раба, поди еще эплолох латентный.
>>524511 (Del)
Сразу триггернулись. Вы вообще к чему-то помимо шаражных ардуинок касались? В реальном мире большинство работы это крупная работа. Работа требующая четкой структуризации и документации. Кресты вообще ничего не навязывают и позволяют пользоваться языком как хочешь, что открывает им двери в разработку больших проектов. Сишечка так не может.
>>524388
>Не надо воспринимать плюсы как современное говно, в которое неклторыеиуебки хотят его превратить.
Не надо вообще его никак воспринимать. Он максимально гибкий. Может быть современным ЯП, где ты никогда не прикоснешься к памяти напрямую, а может быть и старомодным задротством с дотошным менеджментом памяти. Каждому своё.
>Но как видишь, живее всех живых
Как я вижу, си мертвее мертвого. Даже на всяких ардуинах питоны накатывают, а уж про нормальные программы для компьютера и речи быть не может, си просто негоден совершенно.
Си как язык/компилятор - абсолютно мертв. Жива только сишная парадигма программирования за счет поддержки кестами, которые и есть живой язык. Так что этот тред по факту тред крестов с сишной парадигмой, а тред крестов это тоже тред крестов, но про более новые парадигмы.
Мне твое мнение о ардуинках конечно очень интересно, но попробуй на том же хх ру посмотреть, актуальны ли си ещё или нет, ищут ли работадатели новых людей чтобы писать сишный код или нет
Спизданул ты, а искать пруфы мне? Чтож, слив засчитан, факт мёртвости си подтвержден.
А можешь показать что не так со структуризацией и документацией в чистом C?
Конкретно с этим я проблем не замечал в проектах на C.
Язык не обеспечивает этого, всё переложено под ответственность программиста, требуя от него высокой квалификации и дисциплины.
Другие же языки наоборот, рассчитаны на безграмотных дебилов, и жестко форсят "правильный стиль" своим синтаксисом. Первой ласточкой был паскаль, ну а современные языки лишь последователи этого подхода.
общие хэдер для ассемблера и интерпретатора:
https://pastebin.com/ayWE4WpU
ассемблер:
https://pastebin.com/Mnq2hMRk
работа с лейблами:
https://pastebin.com/jYYqna0R
https://pastebin.com/mk0AbiE8
интерпретатор:
https://pastebin.com/NJ3LeN1Z
Пример программы (тестировал, работает, печатает "ABCDEFGHIJ"):
mov r0 10
mov r1 65
.l0
mov m0 r1
write m0
add r1 1
sub r0 1
jmpif .l0 r0
Вам осталось сделать компилятор сишечки под это говно, и можно жить.
если я делаю вот так
int a[100000];
это значит что уже все элементы массива а это нули?
то есть ssd
Если ты объявил ее как глобальную переменную, то занулится
Если в мжйне, то может быть занулится ,может быть нет
Проиграл
а на байтоёбский паёк вкатуну возможно будет выжить? или системное программирование как вторая работа годится только
>oualline.com/books.free/style/index.html
Ссылка битая и по ней не гуглится название книги. Что там за книга была?
https://pastebin.com/Ph61AtVj
На JavaScript аналогом будет
function summ(x) { return function(y) { return x + y; }; }
#define TAG_OPTION_NODE 1
union OPTION {
struct { int tag; } TAG;
struct { int tag; } NONE;
struct { int tag; int value; } NODE;
};
Сейчас думаю над ADT и паттерн матчингом в Си.
А зачем? Не проще ли написать интерпретатор языка который будет все это лаконично поддерживать? Oh wait...
Спасибо
Как гуглить инфу (статьи, книги) по Си? Как гуглить вакансии? Дело в том, что из за короткого названия почти всегда показывает результаты по C++.
И еще вопрос проистекающий из предыдущего. Хотел нагуглить вакансии и статьи, чтобы понять что обычно пишут на Си за деньги и какие требования. Из релевантного что попалось в основном embedded. Для C++ вакансии поинтересней, но он большой и сложный, не хочется соваться.
Получается, что на Си за деньги можно писать только под мелкие железяки? На удаленку надежды тоже нет?
>Как гуглить инфу (статьи, книги) по Си
Форум RSDN.ru там есть поиск.
>Как гуглить вакансии
Мы не нужны в этой стране.
>что обычно пишут на Си за деньги и какие требования
Ну скажем, внутри автобуса ЛиАЗ крутится FreeRTOS, а мосты в Санкт-петербурге разводят с помощьюQNX, под них и пишут.
>Для C++ вакансии поинтересней
"Доширак, велосипед, зеркалка и интересные проекты на C++", ага.
>Получается, что на Си за деньги можно писать только под мелкие железяки
Так и есть, даже форумы живы: arduino.ru и electronix.ru активны весьма. Но вакансий там нет (объявления от Kraftway и НИИСИ не считаем).
Много ли зарабатывают люди, которые собирают пакеты для дистрибутивов? А те, кто делает драйвера для ядра Linux?
>Форум RSDN.ru там есть поиск.
Это троллинг тупостью? Еще бы посоветовал фидонет.
>Мы не нужны в этой стране.
Я спросил как гуглить вакансии, а не поучений в какой стране жить.
>Ну скажем, внутри автобуса ЛиАЗ крутится FreeRTOS, а мосты в Санкт-петербурге разводят с помощьюQNX, под них и пишут.
Это снова троллинг тупостью? Сейчас не советское время чтобы рассматривать такое в качестве работы. И сколько же таких вакансий в процентах?
>"Доширак, велосипед, зеркалка и интересные проекты на C++", ага.
Теперь точно ясно, что твоя цель только повыпендриваться.
>Так и есть, даже форумы живы: arduino.ru и electronix.ru активны весьма.
Нет, не так. Есть много вакансий где надо писать что-то под линукс. Ты кроме того, что тролль, еще похоже не в теме. И ты не ответил на главный вопрос, как гуглить любую инфу по Си, если название языка состоит всего из 1 буквы и по этой причине результаты запросов или по C++ или вообще нерелевантны.
> Как гуглить вакансии?
Попробуй загулять компании из интересующих тебя областей (например исходя из того, что ты сам хотел бы делать). Если контора приличная, то на сайте будет список вакансий и там наверняка будет что-то связанное с C/C++.
Танцующим.
он же написан на асме и читает слова за пределом массива )
Если гуглишь на русском, то прямо так и пиши "Си", на англе иногда помогает "pure C".
Хз, что ты там под линух на сях собрался делать, но даже в моей госпараше уже давно укатились на Qt.
Не пользуйся гуглом, он совсем скурвился просто, раз такое не ищет. У меня такая проблема не только с Си, но и с другими областями, например если писать вопросы по D&D 3.5, он перекидывает на D&D 5, а еще он часто подменяет даже слова в кавычках, искал something "once", а он подсвечивает что нашел something "many", не шучу, буквально такая замена была.
(Эх, скорей бы Zig стал production ready, вот он из трех букв и легко ищется)
я и сам не знал, а Кнут уже 40 лет знал.
Это Си детка
зачем так? такое ощущение, что они на похуях делали этот язык
>2022 год
>зумеры открывают для себя, что Си - это высокоуровневый переносной ассемблер с мощной системой арифметики указателей.
> такое ощущение, что они на похуях делали этот язык
Ты себе не представляешь насколько на похуях его делали.
Например можно было объявить функцию так
foo(a, b) { return a + b; } Потому что похуй )) Если вернул значит это аккумулятор, а значит инт ))
С другой стороны а ты видел госдолг другие языки, че там? Алгол, Фортран, Кобол
Ладно, главное, чтобы хватало.
А мы, никудышные, после работы в А офисе, поедем в рестик, а после всю ночь трахать красивых женщин. Куда уж нам до вас, идейных...
Если для тебя 410 нормальная зарплата, чел... идейные столько тратят в месяц только на своих котов.
на С- пишут прошивки для всех устройств, ядра ОС, драйвера и вообще всё. Я только на Си научился понимать и писать программы, остальные языки слабые, по сравнению с Си. Потому что- позволяют писать программы, самым простым и единственным способом.
>>529798
но си ведь прародитель почти всех популярных языков, хотя бы за это он заслуживает уважения
на самом деле си - это старый, трудный в общении дед, который временами творит и несет полную дичь, но если бы, когда-то этот дед не ебашил, мы бы сейчас находились бы в анальном рабстве у какого-нибудь предка кобола, а также корпораций с их лицензионной политикой
при таком положении дел, вся индустрия застряла бы в начале 00-х, и размер ваших зарплат был бы там же
и далеко не факт, что кобол всех бы заебал, и люди просто ушли бы в паскаль/аду, если посмотреть как форсится ООП при всех его недостатках, то запросто можно представить ситуацию, когда на первом месте у всех стояла бы идея близости к естественному языку
поэтому проявите уважения к деду, напишите на досуге хотя бы пару строчек на нем, он же ведь за вас воевал...
кста, здесь прикольно показаны его дети https://www.youtube.com/watch?v=lDjZA0wodGQ
На 159 уже проееб
Просто фокус, подобрали такие что
48*3+a+b+c=100a+10b+c
a=1 иначе улетим в 200
144+1-100+b+c=10b+c
45=9b, т.е. вторая цифра 5
c сокращается, значит последняя цифра может быть любой
а нахуй нужен педантик?
так ну убунте для чека нужно больше флагов -lm -lpthread -lrt -lsubunit
Ну это реализация стандартной библиотеки C и posix библиотеки C с дополнениями. Например функция argp_parse есть в GNU C, которая не входит в posix.
Скорее всего просто переименовали GNU C Compiler в GNU Compiler Collection.
Что же касается расширений, то вот например https://www.kernel.org/doc/htmldocs/kernel-hacking/conventions-gnu-extns.html
Если у тебя будет простой компилятор соблюдающий стандарт Си, то без этих расширений ты ядро линуха все равно не соберешь.
>Я именно диалект GNU C имел ввиду
Так пойди почитай доки
Предисловие
Это справочное руководство по языку программирования C в его реализации. сборником компиляторов GNU (GCC). В частности, это руководство направлено на документ:
Стандарт ANSI C 1989 года, широко известный как «C89».
Стандарт ISO C 1999 года, широко известный как «C99», в той мере, в какой C99 реализуется GCC.
Текущее состояние расширений GNU для стандартного C
В данном руководстве C89 описывается как базовый. Возможности C99 и расширения GNU явно помечены как таковые.
По умолчанию GCC компилирует код как C89 плюс специальные расширения GNU. Много C99 поддерживается; как только будет доступна полная поддержка, компиляция по умолчанию диалект будет C99 плюс расширения, специфичные для GNU. (Некоторые из Расширения GNU для C89 стали стандартными, иногда слегка измененными. особенности языка в C99.)
Язык C включает набор директив препроцессора, которые используются для такие вещи, как замена текста макроса, условная компиляция и файл включение. Хотя обычно описывается в руководстве по языку C, GNU C препроцессор был тщательно задокументирован в The C Preprocessor , отдельное руководство по предварительной обработке для C, C++ и Objective-C. программы, так что это не включено здесь.
https://www.gnu.org/software/gnu-c-manual/gnu-c-manual.html#Preface
Недавно получил предложение на стажировку(Embedded C)
Может ли кто-то посоветовать книжек для дальнейшего развития( читал только Стивена Прата да практиковался на hackerrank)
Да и есть ли какие-то годные материалы, чтобы с виндузятника перейти на Линукс, как этого будет требовать работа?
очень тупо, в Си все входные и выходные данные нужно паковать в структуры
struct N {
// тип
// переменная
}
и обработчики данных типа
N add(N1,N2) которые уже будут раскидывать по другим обработчикам в зависимости от типа- addInt(N1,N2)
addString(N1,N2) addIntArray(N1,N2) и т.п
к тому же, в таком случае можно задать неявные поведения при нарушениях граничных условий, например занулять больший массив или уменьшать его размер.
Вообще, все входные данные программы- нужно всегда держать под контролем, нарушения типов не должно происходить в принципе, это профанация, когда разные типы сочетаются, всего лишь потому что операторы это позволяют.
https://pastebin.com/LDHHLpb5
Подумай над задачей и напиши алгоритм на листочке, проверь что понял условия и как ее решать. Потом запрограммируй его на C. Не учат что ли?
Нет. Я не понимаю, как делать. И нас по сути не учат, почти все заставляют искать самим.
Обрати внимание на тип переменной p, как ты аллоцируешь под это память и условие твоей задачи (хранить в памяти массив строк). Что с этим всем не так?
Я не понимаю, как это работать должно. Вот создали массив, как дальше внутри каждого элемента массив создать?
Точно так же, как и первый (через malloc). Будут отличаться только типами (char и char*) соответственно.
char\\ и char*
насколько я понял твое задание, у тебя должен быть массив массивов.
Алсо, анон, я только когда в кровать лег, то понял, что в функции AbuInit обосрался. Исправь
>char buff[sizeof(int)];
и
>fgets(buff, BUFF_LEN, stdin);
НА
>char buff[32];
и
>fgets(buff, 32, stdin);
Не обязательно 32, можно и любое другое число, но не меньшее, чем потенциально может ввести пользователь. Я сам не прогер и сишку только в универе щупал 5-7 лет назад, плюс прибухнул чутка и подумал, что выделяю байты через char. Так-то оно верно, если у тебя на машине char в 1 байт, но atoi() оперирует символами, а не байтами, поэтому 4 символа под количество строк - это мало, и если ввести больше, то получишь сегфолт.
Какой конкретно эмбедед?
У тебя там микроконтроллеры или что-то, на что линух можно поставить?
Спасибо
О вот это уже понятно.
Примерно все будешь понимать в процессе работы с микрухой. Для начала тебе нужен даташит на твой контроллер, открываешь его и читаешь для начала про тактирование и как его правильно настроить - это ты будешь делать в каждом проекте в самом начале. Дальше, в зависимости от задачи, смотришь какую периферию ты будешь использовать и читаешь в даташите про настройку периферии, параллельно смотришь как она вообще работает, если до этого не знал.
Из книжек могу вот эту посоветовать, для понимания архитектурных особенностей очень полезна. Там много полезной инфы, даже если у тебя не М3.
Ну и когда будешь чувствовать себя нормально среди всей этой инфы можно начать вкатываться в RTOS. Есть хендбук по FreeRTOS'y например.
Забыл добавить. К каждому контроллеру обычно есть короткая выдержка из тестовых примеров разных проектов от оф разраба. Обычно называется что-то типа Quick Start Guide. Его читаешь вместе с даташитом.
>Без понятия
Почему не поинтересовался? Лучше задавать вопросы, чтобы не попасть на кидалово. Возможно у них корыстный интерес попользоваться тобой. А может просто спрос на такие вакансии низкий.
я тупой, киньте пжлста понятный пример как сдлеать кольцевой буфер не с динамической памятью.
заранее спс
Я отсюда брал когда-то.
https://habr.com/ru/company/otus/blog/557310/
Просто заранее проинициализируй его нужным размером.
Ввести строку. Вывести пословно в порядке убывания длин слов.
Использовать указатели и Разрешены к использованию следующие функции: printf, scanf, getchar (считывание символа с клавиатуры), gets, fgets.
И функции нельзя? Чисто портянку ебануть?
Честно говоря, почему то не задумывался об этом, так как был очень рад самому факту получения работы.
Ну в Украине не особо много вакансий embedded, да я и сам почти не встречал тех, кто этим занимается/хотел бы заняться
Спасибо за минигайд
Книги по ассемблеру x86, x86-64, изучение разных режимов памяти в языке ассемблера, книга по С от Дениса Ритчи, книга по С++ и опп от Страуструпа, книга по схематехнике. Книга по устройству осей от таннебаума, книга по сетям от таннебаума...
И вот изучаю, изучаю, уже по сути в общих чертах весь компьютерх насквозь вижу начиная от маленьких транизисторов на кристалле процессора и прошивки и заканчивая, файловыми системами, драйверами ядрами. Понимаю что приблизтельно в нём происходит на любом этапе загрузки и работы, НО.
А что делать? Вот я уже чувствую в себе силы написать реальную рабочуюТМ фичу. Но что писать? Была идея написать программу которая бы восстанвливала файлы стёртые быстрым форматированием или даже целые тома и системы выпиленые очисткой таблицей разделов, но все эти программы уже запилены и запилены лучше меня, на велосипед время тратить не охота.
Что пилить то? Тупо понимаю что если я в области систем что не возьмусь пилить оно уже всё запилено.
Может быть какой-нибудь инструмент написать для упрощёного редактирования реестра винды? Или написать программу по выводу температур с датчиков компьютера? Да всё это уже давно есть.А ну что писать, ну подкиньте идею, что можно под винду написать такое системное, какой-нибудь фильтр может в какой-нибудь стечок драйверов, может быть программу упрощающую какой-нибудь менеджмент...
Хотел тебе предложить херню связанную с линуксом, там очень много работы, но ты с ним не знаком.
>написать программу по выводу температур с датчиков компьютера
Попробуй эту идею развить. Серверное приложение считывает данные о состоянии ОС и отсылает данные в пакетах через сокеты клиенту. Клиент может быть любым: ГУИ-приложение, консольное приложение, веб-приложение. Эдакая телеметрия.
У студентов зачеты начались или все в госуху вкатились дроны программировать?
Напиши программу умеющую пищать динамиком материнки разную музыку. Чтобы именно динамиком, а не звуковой картой, чтобы ни в каких случаях звук не перенаправлялся на звуковую карту, иа играл именно аппаратный динамик воткнутый в материнскую плату.
Подобное кстати вроде есть в powershell но там всё на уровне функицй-заглушок, оно есть, но не работает так как пока ещё не реализовано.
Пытаюсь сделать маленькую роп цепочку, но у меня почему-то все как-то странно работает. Даже хз, есть ли смысл спрашивать.
>Аноны, а тут есть безопасники
Взлымвал соседский вай фай через кали линукс. Задавай вопросы.
задаешь статический массив char arr[1024][1024]; считываешь в цикле каждое слово в новый ряд массива. Потом пишешь свой strlen (функция измеряющая длину строки), который будет измерять длину каждого слова. Создаешь второй второй массив. Пробегаешься по исходному массиву со стрленом и самое длинное слово записываешь в первый ряд второго массива и так далее пока всё не запишется во второй массив в нужном порядке. Выводишь второй массив.
>Да всё это уже давно есть.
напиши программу, которая из любой программы создает портабле екзешник который можно запустить с флешки на любом компе без установки ОС, прямо флеш вставляешь вылезает меню с прогами в биосе, и запускаешь.
решил вспомнить си, написал такое на пикриле. Кто-то видит ошибку?
Что делает эта программа, пиши программы которые делают полезное, или не пиши вообще ничего.
Нахуй ты указатели тянешь в это, какую задачу этим решаешь?
Такое вообще реально написать? Программы винды же используют библотечные функции самой винды, из под биоса ты хуй их запустишь, только если какую-нибудь загрзочную версию винды прилепить к ним.
Ну линукс более модульно независимая ось, на винде такое врядли получится провернуть.
Решает лабу анониму с двощей че доебался.
Шаг первый: пишешь свой яп
Шаг два: думаешь чего бы такого на нем написать
Шаг три: переход к первому шагу, но пишешь это уже на новом языке
@
статически линкуем wine и его зависимости
@
получаем обычный live-образ дистрибутива.
>реально написать?
реально, но не для средних умов. А api винды что использует? Нихуя не использует, если экстрактировать оконное и юзер api, можно в мегабайт всё уместить. ОС Шиндовс- на 90% состоит из кучи говна и палочек, а также кучи драйверов к разному барахлу.
Линупс точно такое же дерьмо.
я давно умею, потому-что я пол-книги Прата с++ прочёл.
Ядро винды сильно завязано на этом говне и палчках и часто если их не будет то оно просто работать не будет. Тот же гуй намертво ввареный в ядро, на лине его можно без задней мысли выпилить
только я не понял че он приебался к тому что переменная str инициализирована но не используется, я даже цикл for для этого написал.
Так ты только заполняешь (пишешь в него), но не используешь.
Без ассемблера это невозможно. Там же нужен outb(0x61)
Хороший язык, и конкурсы интересные.
>короче поясняю - write() вывел сообщение раньше printf(), хотя он ниже по коду
бампую, почему функция write() лезет вперёд?
^ this
че это такое
#ifndef SET_H
#define SET_H
extern const void Set;
void add (void set, const void element);
void find (const void set, const void element);
void drop (void set, const void element);
int contains (const void set, const void element);
#endif
или хотя бы где прочитать про это
Спс, понял.
Очевидно, хедер для модуля множества.
стоимостьЧаса = 54
количествоЧасов = 396
коэффициентВычета = 0.10
суммаДоВычета = стоимостьЧаса количествоЧасов
вычет = суммаДоВычета коэффициентВычета
суммаПослеВычета = суммаДоВычета – вычет
long long wage = 5400;
int hours = 396;
long long sumBefore = wage*hours;
long long deduct = sumBefore / 10;
long long sumAfter = sumBefore - deduct;
А ты думал нас на float поймать, сучечка?
>че это такое
#ifndef SET_H
#define SET_H
...
#endif
Это include guard, пишется чтобы файл только один раз подключился, иначе будут ошибки что ты переопределяешь уже существующие сущности.
extern const void Set;
Указатель на какой-то объект неизвестно какого (void) типа, который определен в другом (extern) файле
void add (void set, const void element);
Объявления функций. Заканчиваются ; и не содержат само тело функции. Само определение находится, скорее всего, в соответстующем .c файле, где уже расписан алгоритм, что именно делает эта функция.
Ой чё это я на старый пост отвечаю?
Ахаха, поймал крестовика.
Читай что значит auto
Если кратко, то я купил одноплатник на ARMе и написал для него серверное приложение, которое общается с клиентом на основной пекарне amd64. Проблема, собственно, в том, что отправленные с клиента данные интерпретируются сервером невалидно и как я понял, это происходит из за разного представления чисел на моих системах. Как передать значение в промежуточном формате?
Например, клиент: открыл сокет, упаковал данные в промежуточный формат, послал данные, закрыл сокет.
Сервер: открыл сокет, принял данные, распаковал промежуточный формат, закрыл сокет.
endianess
rfc1700 сказал, что нетворк протоколы должнs быть биг эндиан
https://embetronicx.com/tutorials/p_language/c/little-endian-and-big-endian/
Процессор тут не при чем, это сетевой стандарт. Они могут быть оба LE, но если вызывают ntohs/ntohl то байты по сети летают BE
погоди но ПОЧЕМУ он стал стандартом?
Если из-за того что в 1970ом году интернет состоял из 100 компов с BE - шли бы они нахуй.
>Проблема, собственно, в том, что отправленные с клиента данные интерпретируются сервером невалидно и как я понял, это происходит из за разного представления чисел на моих системах.
А с чего ты взял?
Одни имеют одинаковую "оконечность".
>А с чего ты взял?
Например, отправляю на сервер число 4, а приходит число 27. Нашел обертку для сокетов в которой все числа приводятся в промежуточный формат и с ним все нормально получается. Похоже я чего-то не понимаю и это нюансы при работе с сетью как сказал этот анон >>537344
>>537005
Спасибо.
>>537274
>gRPC. на Golang, конечно же
Зачем мне ГОвно, как оригинально, если я пытаюсь писать на Си?
>Например, отправляю на сервер число 4, а приходит число 27.
Так это число 4 не должно было испортиться. Оно в один байт влезает.
Нужно подробнее описать.
Как конкретно называется твой одноплатник?
'1' + '5' + '9' выводить целое число
Эквивалентно 48+53+57. Всё правильно же. Дальше не проверял.
Быстрофикс 49+53+57
Кстати хочу узнать вот моя прога может делать free(). Делать ли m = 0; Или как контролировать чтобы два раза free() не было?
Сам я trainee embedded C, со слова моего нынешнего куратора-сеньйора взяли меня чисто из-за какого-никакого понимания азов схемотехники и прочее лабуды физики старшей школы(я сейчас радиотехник второго курса уника)
Си знаю самые основы(синтаксис знаю, знаю про динамическую память, про организацию памяти и прочую хуету для новичков) -- читал Прату, Ритчи, решал задачки на хакерранке). Сказали, что надо разобраться в корпоративном CodeStyle пока что.
У кого-то есть идеи как можно дальше развиваться? В каком направлении учить Си для железяк, может кто-то может посоветовать курсы/видосы/книги/сайты? До этого я только дрыгал ножкам на Атмеге на ассемблере. Смотрю на рабочий код -- по синтаксису вроде все понятно, а что он делает -- нихуя
P.S.Да, я долбоёб, помогите,пожалуйста
Забыл добавить, что сейчас все проекты у нас на СТМке
Начни с прокачки своих софт-скиллов. наверняка у тебя есть руководитель/ментор для таких вопросов, хули ты на харкаче забыл
Боится что такое тупое говно тут же пидорнут, ведь если начать разговаривать правда вскроется.
Для быдла нет, ага.
for(int j = 0; j < h; j++)
_for(int i = 0; i < w; i++)
__flatarr[i + j * w] = arr[j];
можно соптимизировать до
for(int j = 0, k=0; j < h; j++)
_for(int i = 0; i < w; i++, k++)
__flatarr[k] = arr[j];
Я криво прочитал твое задание, у тебя наоборот надо в 2д массив из 1д массива.
Еще не забудь выделить память всем подмассивам. Иначе arr[0][...] не имеет смысла
>значение что такое софт скиллы знаешь?
А ты?
Подсказываю безграмотному чухану:
>блат
>своячество
>кумовство
>чинопоклонство
>прихлебательство
>холуйство
>лицемерие
>показуха
>изворотливость
>ушлость
>пронырливость
>интриги
>подкопы
>подсиживание
Вот что такое это ваше пидорское "софт скилл". Быдло прикрыло кучу дерьма простыночкой и думает что незаметно и не воняет.
Да повезло мне, честно говоря. Меня рекрутерша сама нашла в линкедине -- так и прошел. Это с учетом того, что для вкатнуов сейчас во всем мире тяжело + я в Украине сейчас, а ты сам понимаешь, как сейчас у нас с работой
Обычно так делают безмозглые бесполезные тела, ходящие на работу часы отсиживать, а не пользу приносить.
Мне одногруппник недавно рассказывал, как тоже в эмбеддед вкатился, ответив "не знаю\не работал" на половину вопросов и сказав, что писал на Си, хотя вакансия на крестах была.
Да потому что хуй найдёшь кого: всем надо мобилььные дрочильни или фронт/бэк ебашить.
А ебаться с железками и байтоёбствовать нихуя нету желающих.
>ничего не отрицает
Ну вот и доказано. Удивительно, какое же грязное быдло тупое, всегда само доказывает правоту оппонента.
Ну у меня из знаний только основы Си, чуток в схемотехнике и сигналах шарю. Дрыгал ножками на Атмеге на ассемблере. Этого всего и хватило
Я буквально ты значит, только у меня в проге знаний больше, и они не ограничиваются только байтоëбством. А с железками да, только в универе познакомился.
Короче открываю в программе пикчу, разбираю ее попиксельно, получаю двумерный массив размером как у открытой пикчи, где элемент равняется нулю если пиксель белый, и единице если пиксель черный.
Где-то на картинке есть одна черная рандомная клякса. Как найти координаты ее центра масс и соответственно координаты центра масс в массиве?
Разве это будет центром масс?
Но я о том, что любая тонкая сопля торчащая из кляксы полностью смещает координаты нужной точки потому что описывающий прямоугольник будет охватывать и эту тонкую соплю. А в рельности тонкая сопля практически не влияет на общую массу кляксы. Поэтому вариант хороший, но это не центр масс вроде как.
В общем, внешний цикл идет по j. Во внутренних циклах много проверок, куда в качестве выражения входит arr [ j ]. Я решил сделать еще одну свою оптимизацию, ввел одну переменную, в которую в начале проверок записывается arr [ j ].
Логика простая - чтение из переменной temp дает условную одну операцию
На чтение из массива - складываем адрес начала массива arr и индекс j, и читаем переменную, это дает условные две операции
Ну и прикол в том, что после моей низкоуровневой васянской оптимизации скорость просела где-то в 2-2,5 раза. То бишь обращение к элементу массива (где сначала получаем адрес сложением и потом читаем) оказалось быстрее обращения к переменной (где адрес уже известен). Это не вопрос, просто вот так бывает, анончики, иногда "свои" оптимизации оказываются даже вредными чем те, которые делает компилятор
Да знаем, хипстерок, только какое отношение эта дрисня имеет к ламповой Си?
Ты всю жизнь будешь дрыгать ногами и мигать диодами, никакого роста у тебя не будет, максимум до начальника где ты будешь пинать такого же овоща аутиста.
> никакого роста у тебя не будет
> максимум до начальника
Признавайся, в нейросетка посты генеришь?
>был быдлосом
>дорос до начальника
И где рост?
И главное, где
>программировани на си
?
Так до чего ты там дорос? Как был быдлом, так и остался. Как был нулем в программировании, так и остался. Запомни, быдло не растет. Может расти высота кресла и размер зарплаты, но как человек быдло остается говном навсегда, каким родилось, таким и помрет, простым говном.
> и конечно на x86 там не будет двух операций, а будет lea
Благодарю. Реально себя тупым чувствую, но про lea узнал из твоего поста, не знаю как так вышло. В общем, благодарности, чаю и прелестниц тебе, анонче, спасибо, что ее упомянул! Я бы так необразованным и оставался. Всех благ и няшек!
Есть либа, которая будет подгружаться основной программой в известную локацию памяти. Эта же программа будет вызывать функции из неё.
Точка входа в либу известна, но смещения её функций могут изменяться по мере модификации либы. Т.е. динамическая линковка отпадает, т.к. неизвестны точные адреса функций.
Как организовать лучше всё это? Я пока додумался до контроллера/драйвера либы и вызывать функции через обращения к нему. Например ctrl_lib (идентификатор функции, лист аргументов). Звучит пиздецки всрато, но ничего лучше я не выдумол.
инб4 да, я аутист
>Сяч, для того чтобы слинковать исполняемый файл к динамической библиотеке, необходимо чтобы либа уже была загружена в память?
Непоня. С чего бы? Вот есть сисколл (на самом деле библиотечная фнкция, но не суть), которым программа может сама себе открыть динамическую библиотеку
https://man7.org/linux/man-pages/man3/dlopen.3.html
И потом dlsym, чтобы адрес найти.
>Вот есть сисколл
Теперь понял, что динамическая линковка в процессе исполнения. Спасибо. А то пикрил навёл на противоположный вывод.
Анон, а у тебя случайно есть статьи по динамической линковке? А то само назначение процесса понятно, а что там происходит на уровне исполняемого файла, таблиц символов и самой либы - одно волшебство в голове.
> Есть либа, которая будет подгружаться основной программой в известную локацию памяти.
А разве сейчас линукс не в рандомную грузит?
У тебя статья про сборку, а спрашивал ты про работу.
Статью про динамическую линковку я тебе выше уже кинул, там и ссылки на все подробности, и примеры.
Доложил начальнику, что его на двачах обижают.
питон макака на связи.
Нужно запарсить csv или xlsx. Может кто посоветует статьи, доки, туториалы?
А на питуне запарсить нельзя? Там же тоже есть функционал для ебания байтов и чтения файлов. Гуглишь структуру csv формата в интернете и вперед. Да и ставлю анус, что такие библиотеки уже существуют.
Для таких задач есть Дельфи. Скорость как в сях, но несоизмеримо проще и удобнее.
Так он тебе говорит либу искать (которая внутри скорее всего на си написана, просто интерфейс на питоне)
https://medium.com/casual-inference/the-most-time-efficient-ways-to-import-csv-data-in-python-cc159b44063d
А вообще проще на c++ писать, что то мне подсказывает что на голом си это будет боль.
Только что эта хуйня попалась в рекоммендациях и я очередной раз подумал, что сейчас мне обьяснят положняк. Ну не могут же люди высерать пустые и бессмысленные видео в огромных количествах, верно?
Итак, заходим...
>ряяяя я специально не учел условие и поэтому в программе появился баг, поэтому Си/Си++ говно
>ряя в Си++ есть 5 способов сделать одну и ту же вещь, поэтому мне сложно выбрать. Язык говно
>в расте есть синтаксический сахар, который делает за меня все то же самое, поэтому язык заебись
Охуенная аналитика, браво. И таких бесполезных видео просто миллиарды просто для того, чтобы пропихнуть культуру к которой они "причастны". Нет, чтобы снять видео как ты делаешь крутую штуку на расте, как членодевка из AsahiLinux. Это слишком сложно нахуй, будем распространять маркетинговый булщит. Из-за ебанутого cumюнити даже палкой эт поделие трогать не хочется. Как будто питонисты, джаваскриптеры и прочие макаки. Хотя почему "будто"? Основная ЦА и есть выходцы из веб-параши.
Держу в курсе
Поясните что не так?
FILE* plain_text;
int columns = 0;
int strings = 0;
int metering = 0;
char c;
fopen_s(&plain_text, "C:\Users\anon\source\repos\Text_editor\Debug\c_programm.txt", "r");
>>547681
https://learn.microsoft.com/ru-ru/cpp/c-runtime-library/reference/fopen-s-wfopen-s?view=msvc-170
Попробуй свой файл в примере открыть.
> посмотрел тупое видео, сделанное специально чтобы набрать больше просмотров
> искренне взбугуртнул
Ты же сам должен понимать для чего и для кого такое снимается
>Ты же сам должен понимать для чего и для кого такое снимается
Для него и снимается. Он посмотрел, получил эмоциональную реакцию, ещё и потащил по интернетам, чтобы другим показать.
Не имеет значения, случайно автор этого ролика наткнулся на такой формат (просто долбоеб), или осознанно его придумал (троллит), факт остаётся фактом, анон выше
>посмотрел, получил эмоциональную реакцию, ещё и потащил по интернетам, чтобы другим показать.
То есть цель ролика достигнута — он распространяется, и просмотры капают. Значит обучение обучение с подкреплением произошло, и автор будет таких роликов снимать ещё больше.
Быдлосы любят скандалы, сам видел бабку, смотрит целый день телешоу с руганью и так 8/7/365 и не надоедает и не противно. Грязь это плоть и кровь грязного быдла, они в грязи живут, дышат грязью, едят грязь, и в голове одна грязь.
Пишу на чистом Си, реквестирую хорошую литературу по системному программированию под Шиндовс, выложил список литературы по которой я практикуюсь, кого-то более лучшего чем Александра Побегайло и Павла Йосифовича не нашёл.
Если знаете более хороших авторов, или более современное издание, напишите пожалуйста.
Чел в Си-строке \ означает escape-символ.
Например \n означает перевод строки.
Для того чтобы в реальной строке в памяти был символ \
В исходном файле тебе надо писать \\
Т.е. "C:\\Path\\File"
Это буквально первые страницы любого учебника (параграф про литералы)
Вы по тик току учите что ли?
а есть похожее для линукса?
На чистом си под винду нельзя писать, там конец файла не \n, компилятор не ругается на крестовые констпукции и так далее. Только в юниксе си чистый.
Да нет, как раз имеет значение. Потому что ты исходишь из позиции, что вся эта срань изначально затевается ради простотров, что уже может быть не правдой. Я натыкался на множество статей, постов, видосов, где подобные вещи с серьезным лицом говорят без какого-либо троллинга. А для системного языка такое раковое сообщество не очень хорошо.
Ну и немного ебанутая позиция в духе "ты же посмотрел, значит все правильно делает". Можно говном на камеру измазаться и тоже много людей посмотрит, но это не значит, что ты сделал что-то хорошее.
>Потому что ты исходишь из позиции, что вся эта срань изначально затевается ради простотров, что уже может быть не правдой.
Это ролик, выложенный на ютубе. Если не ради просмотров, то ради чего, по твоему мнению?
>Ну и немного ебанутая позиция в духе "ты же посмотрел, значит все правильно делает".
И в чём я не прав? Это работает.
>Можно говном на камеру измазаться и тоже много людей посмотрит, но это не значит, что ты сделал что-то хорошее.
Что значит "сделал что-то хорошее"? Хорошее для кого? Для себя автор сделал очень хорошо — просмотры капают, известность растёт. Одни бонусы.
Да, тик-ток академия по программированию доктора Плюшевой.
>там конец файла не \n
О чём ты , чтение прекращается когда поток вывода передаёт нулевой байт, при чём тут переход на новую строку ?
проиграл с мема XD ))))
Спроси его, сможет ли ИИ поработить человечество и к какому году, чтобы я успел подготовиться.
Память выделяю динамически, потом считываю по букве в массив.
На пиках хуета если что для примера текста.
М.б. потому что Active Page в 1251 кодировке, а твой текстовый файл сохранен в UTF8 ?
Попробуй добавить в начале main:
SetConsoleCP(65001);
SetConsoleOutputCP(65001);
Мне кажется лучше использовать API операционной системы для задач ввода-вывода, чтения данных и т.д., т.к. стандартные функции предоставляемые в Си (как например из <stdio.h> вроде scanf) небезопасны, с ними не удобно работать (особенно с различными кодировками).
Для чтения записи файлов, можно использовать ReadFile и WriteFile.
http://vsokovikov.narod.ru/New_MSDN_API/Menage_files/fn_readfile.htm
http://vsokovikov.narod.ru/New_MSDN_API/Menage_files/fn_writefile.htm
Ассемблер
Говно говна там, если хочешь сегфолтами обмазаться или иметь потенциально уязвимый код, используй на здоровье scanf.
я тебе не няша
>Есть какие-то годные реплы или интерпретаторы, чтобы баловаться без конпеляции?
Да, есть:
https://habr.com/ru/sandbox/54131/
Тоже говно говна, и кстати ты можешь указать размер буфера в scanf после знака %, лучше использовать предоставляемое API.
Лучше использовать метод winapi ReadConsole либо ReadConsoleW (в качестве минимального буфера указать 256 символов, т.к. это минимальный лимит ввода, но ты можешь его увеличить увеличив размер буфера в n-раз кратного 256).
А хрен ли ты хотел, это числа, в Си нет типа string, за то есть минимальный тип char размером 1 байт, как раз для работы с ASCII, и массивы, которые являются указателями.
>Лучше использовать метод winapi
Лучше никогда не использовать какие то мутные расширения, которых нет в стандарте языка Си.
Код, работающий со скоростью 0 (не работающий на другой платформе) не может быть быстрее.
В C99 sizeof(char) == 1. Результат измеряется в байтах.
CHAR_BIT может быть больше или равен 8 битам, но это другое. Не путай.
На пердопараше нет натива, вот эти чуханы везде лезут и воняют своей "мультиплатформенностью", которая означает усредненное говно которое везде работает как говно. Говнари обмазываются говном, как будто что-то новое.
Если у тебя программа упирается по скорости в вывод в консоль, то с ней у тебя куда большие проблемы. Попробуй писать в файл, попробуй бинарные данные вместо текстовых, попробуй слать только дельту изменений.
>На пердопараше
>эти чуханы везде лезут и воняют своей "мультиплатформенностью", которая означает усредненное говно которое везде работает как говно.
>Говнари обмазываются говном, как будто что-то новое.
Двачую.
Пердодебилы такие, да. Даю подсказку - программа, написанная по стандарту, более переносима между разными линуксами, чем программа, написаная под разные версии пердошинды.
На первом пике не стандарт, а какая-то хрень. Сайзоф выдает размер в чарах, а не байтах. На пикрелейтед например (это тмс) размер Инта - 2.
Лонг Инта*
>Лучше никогда не использовать какие то мутные расширения, которых нет в стандарте языка Си.
Что, правда ты СКОЗАЛ ?
Какие расширения дебилоид ?
Быдло, ты когда-нибудь писал код не на питухоне, гейшарпах и для энтерпрайза, а не для своего студенческого мини-проекта ?
Ты вообще писал что-то на Си кроме "hello world", я в этом очень сомневаюсь.))
>>554027
>Тише, щас же прибежит сегфолтошиз
Ди нах даун, боюсь представить что будет если тебе доверят писать ПО для авионики, или запрограммировать робота-хирурга, когда ты начнёшь хуярить свой говнокод потому что так СКОЗАЛ индус с ютуба, ведь все вокруг тупые шизы и зануды))))
Ассемблер MIPS.
Разве не по древнему плану рептилоидов?
Имеется в виду, что с указателями легко сделать баги. Берешь указатель на что-то и прибавляешь 100500 - вот он уже указывает в адрес возврата на стеке. Или освождаешь память, а указатель на нее забыл сбросить.
Так вы без нас не можете нихуя, лол, девелоперы вы мамкины, джава-победители
так если ты только заведомо валидные данные в функцию передаёшь, это не уб, а если нет, ты долбоёб, или ещё не нашёл ошибку, очевидно
> боюсь представить что будет если тебе доверят писать ПО для авионики
Ох, чел, я уже...
Соболезную хуле, старайся тогда не летать рейсами грузовых самолетов, че поделать. Свои мокрописьки оставь при себе пожалуйста и не тащи свой кал в тредис.
>На первом пике не стандарт, а какая-то хрень
Самый настоящий стандарт. Скачай сам и открой.
>Сайзоф выдает размер в чарах, а не байтах
Сайзоф выдает в байтах.
> На пикрелейтед например (это тмс) размер Инта - 2.
На твоем пикриле нет никакого "2" и ниаких байт, только биты.
Я же сказал - не путай. Размер char = 1 байт.
А вот байт по стандарту может быть разного размера в битах. Но минимум 8. Поэтому там и написано что int минимум 16 бит.
>Ты вообще писал что-то на Си
На си я не пишу по причине того что это убогий язык, а на C++ писал серьезный софт когда тебя еще в планах не было.
> боюсь представить что будет если тебе доверят писать ПО для авионики, или запрограммировать робота-хирурга
Боюсь представить, что будет, если кому-то придет в голову писать такой софт под шинду.
Баги в софте есть всегда. Вся разница в том, что в Си у тебя будет креш с сегфолтом, или тихая порча памяти и данных, а в джаве - креш с NullPointerException, или креш с ArrayIndexOutOfRange
>На си я не пишу по причине того что это убогий язык
Потому что ты понятия не имеешь на сколько крут этот язык, и какими возможностями он обладает как например возможность создавать PIC код (код не зависящий от адреса).
Можешь писать и дальше свой индусский код на своих гейских крестах, не забудь вернуться в свой опенспейс и допить свой детокс-смузи, а потом сделать селфи со своим HRBP, и подвороты опусти, на улице холодно, зима.
>легко сделать баги
>освождаешь память, а указатель на нее забыл сбросить
И где тут баг? Освобождение памяти не требует никаких сбросов указателей.
>И где тут баг
Трудноуловимое reuse-after-free: https://developer.android.com/ndk/guides/gwp-asan#example
Не ломай над этим голову. По-видимому, оно лечится только полным отказом от указателей (т.е. заменой их на дескрипторы объектов), по крайней мере, я другого решения не нашёл.
>И где тут баг
Трудноуловимое reuse-after-free: https://developer.android.com/ndk/guides/gwp-asan#example
Не ломай над этим голову. По-видимому, оно лечится только полным отказом от указателей (т.е. заменой их на дескрипторы объектов), по крайней мере, я другого решения не нашёл.
Ещё такое есть:
C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, it blows away your whole leg. – Bjarne Stroustrup
Апхахах))
>Освобождение памяти не требует никаких сбросов указателей.
Освобождение не требует сброса, а вот контроль, чтобы не использовать после удаления - требует.
Не требует. В отладочной сборке оно само обнуляется для отладки, а в релизной это бесполезный блоат убивающий производительность.
Ты, очевидно, попутал c заполнением памяти нулями
(впрочем, если не на голом железе, то современная ОС все равно это делает для безопасности, например https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=6471384af2a6530696fc0203bafe4de41a23c9ef
а речь шла про "сброс указателей", т.е. про конструкцию
if(ptr != null) {
free(ptr);
ptr = null;
}
Что помогает при использовании контролировать, что указатель валидный
if(ptr==null) raise_error(); else foo(ptr);
Хочу читать текстовый файл в массив флоатов, выбрасывая пробелы, мусор и с переносом строк.
из без сппшных стринг вектор и тд, только си
Эта конструкция помогает говнокодить, потому что повторное освобождение указателя это баг, а она его подавляет. Надо лечить болезнь, а не симптомы, исправлять баги, а не обходить их. Условие не нужно, надо чтобы надежно крашнулось по известному значению, и лучше это будет не ноль, чтобы отличить обращение к неинициализированному указателю от использованого, но освобожденного.
Надеюсь, что ты просто троллишь тут новичков, засирая им мозги, а не говнокодишь таким образом реальные программы.
> она его подавляет.
Не подавляет, шиз.
А вот незануление, как раз, подавляет. Ты даже не будешь знать что ты юзаешь афтер фри. У тебя просто какой то указатель, ну и что что ты попортишь чужую память и данные.
>надо чтобы надежно крашнулось
Как там в 70-х? Надо чтобы корректно завершилось, сохранило все пользовательские данные, вывело корректную подробную ошибку.
> отличить обращение к неинициализированному указателю от использованого
Охуеть блядь кодинг на кончике пальцев. Если ты попал в это условие, то иди вилкой чисти, у тебя скорее всего и там и там лажа.
>if(ptr != null) {
>free(ptr);
Бесполезная конструкция, фри сама проверяет на нулпоинтер по стандарту. Тоже самое в крестах с делит.
Это правда, ну там имеется в виду
if(ptr == NULL)
raise_error("trying to double free");
free(ptr);
ptr = NULL;
Не знаю, что у тебя там за задача, но первое что пришло в голову это сначала запилить функцию, которая считает количество байт в файле, на основе этого количества выделяет память (юзаем вместо массива) при помощи malloc(), далее открываешь файл при помощи fopen(), в цикле (обычно while юзают) считываешь символы в массив при помощи fgetc(), пропуская пробелы и мусор, закрываешь файл, юзаешь free()
Да я понядеялся на анона, но запотел и уже сам сделал.
на чистых сях никогда не писал, от того и слажна, а вот тут пришлось
Нейронка, спок.
Почему не CLion ? Какие-то подводные камни у этой IDE?
Бесплатное же ломается 2 строчками в конфиге и заменой одного жава файла
Медленнее кодиума и креатора, это да.
Зато рефакторинг и парсинг нормальный.
В общем кому что.
Слава Украине!
А как это написать? Не понимаю нихуя...
Нужно ввести с клавиатуры предложение и чтобы оно разбилось по словам в двумерный массив
Бро, даже не пытайся научиться программированию до тех пор, пока не научишься гуглить вместо того, чтобы просить советов на дваче.
а зочем си кгда есть модный молодежный гоу аноны?
Гарбэдж коллектор все руинит
Laba11.c
Он и не пытается, это хуесос который хочет чтобы за него сделали домашку.
Сейчас за него сделают домашку, потом будет делать за него работу. Так и живут, хитрожопое быдло.
Анальники все такие душнилы? В чём проблема молча помочь, если знаешь и сидишь в треде? eastern-менталитет
Ну так и спрашивай у обладателей western менталитет, хуле ты сюда припёрся то?
Видишь ли, это Си тред, и я не хочу потом уебаться в машине контроллер которой программировал недоучка.
Тебе помогли советом открыть гугл и списать оттуда свой хеллоу ворлд. Пока ты этого не сделаешь - нихуя у тебя не выйдет.
>eastern-менталитет
Ты про себя, лол? Мы тут за western-менталитет топим, поэтому деньги вперед. Ну сам понимаешь, капитализм, срыночек, все дела.
Я Гугл тест использую, удобно в симейк подключать
Есть ещё и другие, буст тест, catch2
Ну это все плюсовые решения, может какие то есть которые на си
> Пишу в Visual Studio на C++ в стиле Си числовые алгоритмы для криптографии. Как покрыть этот код тестами?
Берешь wycheproof, например, грузишь евонные случаи libjansson и прогоняешь. Не думай обойтись случайным тестированием.
Возможно глупый вопрос, но я все же спрошу.
Какие профиты в изучении C сейчас? Есть ли смысл изучать сначала C, а потом уже переходить на С++ и другие Си-подобные языки?
Или лучше не тратить время и учить C#? а потом с него перекатываться куда интересно, на тот же С
Хз. я вообще на Си пишу с использованием gcc и сторонними отладчиками вроде gdb, нашёл вот такую статью от майков.
https://learn.microsoft.com/ru-ru/visualstudio/test/writing-unit-tests-for-c-cpp?view=vs-2022
А вообще, как ни странно, у майков очень удобная и весьма понятная техническая документация.
scanf() нельзя использовать, он не безопасен!!!!
Для чтения буфера консоли, используй широкие символы для записи юникода (wchar_t или short unsigned int) и метод WinAPI - ReadConsoleW, а также не забудь указать для записи своего массива буфер не меньше 256, потому что это минимальное ограничение для консоли, больше которого пользователь не сможет ввести (если не задаст размер буфера в n-раз кратным 256), также не забудь указать режим преобразования выходного потока в Юникоде через _setmode(_fileno(stdout), _O_WTEXT);.
Либо, если не желаешь возиться с WinAPI можешь использовать getwchar, а для преобразования строк в числа существуют методы atoi, _atoi_l, _wtoi, _wtoi_l.
Сам иди на хуй!
Обосновать можешь то что написал, или как быдло можешь только хуями покрывать без контраргументов и конструктивной критики ?
Даун, причем тут твой говнокод, это системные высокоуровневые методы операционной системы, без которых ты не сможешь написать ничего сложнее "hello world", даун ты тупой!
Ты в курсе что даже в вузах, помимо базовых основ вроде устройства операционных систем дают лабы по написанию программ с использованием WinAPI, или тебя в твоём сельском ПТУ кроме 1С ничему не научили ?
Мне кажется ты тредом ошибся, ты перепутал 1С с просто C.
Сам уходи, додик тупой, я от тебя так и не услышал никакой конструктивной критики или каких либо разумных контраргументов кроме
>ряяяяяяяя ета гавно яскозал гавно ряяяя
Всё чему ты научился, это сидеть на дваче и оскорблять других пользователей, зная что тебе за это ничего не будет, ебанный неосилятор))))
А когда си увидел сначала, очень порадовался его крутизне, но когда начал писать программы, эти генерик интерфейсы из говна типа консольного ввода-вывода такие убогие, всё равно что руки связали, а потом отрубили. Фублять, фунахуй, без нативных средств программирования не бывает, только теоретическая математика какая-нибудь, абстрактный бесполезный кал.
Да он и не нужен в большинстве прог. Если тулза для пользователя, там нужен гуй, если для сисадмина - ему нужны нормальные логи. Если уж совсем надо - то есть обертки над ncurses и альтернативы.
Единственное где это можно оправдать - микроконтроллеры которые надо отлаживать по проводу.
Чо в гугле было, то и вбил. Хули ты как нубяра, не знаешь, как взрослые дяди работают?
Слишком жирно будет если я в линукс тред с этой хуйней пойду?
он же сам ее скачивает, распаковывает и компилит, куда прописывать?
ну вот первый пик проект
второй - батник для сборки
типа мне еще флаги вроде -lmingw32 -lSDL2main -lSDL2 и тому подобные дописывать?
тогда почему у них тут все собирается без них
https://www.jamesfmackenzie.com/2019/12/01/webassembly-graphics-with-sdl/
так тогда почему у них в примерах оно само подхватывается? это же вроде как раз в флаге USE_SDL2 и предусмотрено
судя по ошибке же он из уже распакованного пакета не может собрать libSDL и говорит, что не видит его
Да вроде с помощью llvm можно в васм скомпилить. Не хочется просто всякое говно устанавливать себе.
так у тебя как клиента на выходе и будет итоговый wasm в обоих случая, какая разница чем разраб пользовался
ты же сказал не от майков
да, но он комп грузит сильно.
И что будет если адрес выделенный маллоком потеряется? Какими утилитами его потом находить и освобождать в таком случае?
Нет, при завершении процесса. Это в любом случае надо для безопасности (чтобы хакиры ее не прочитали потом)
https://stackoverflow.com/questions/5612095/is-freeing-allocated-memory-needed-when-exiting-a-program-in-c
Но конечно освобождать память за собой надо, потому что это тебя убережет от багов.
Что же касается утилит, то пишут Valgrind. Либо написать свою обертку malloc (так же в c++ пишут обертки new/delete)
https://stackoverflow.com/questions/9074229/detecting-memory-leaks-in-c-programs
Спасибо за ответ понял
>Нет, при завершении процесса.
В основном система чистит, но не всё, кое что остается, поэтому чистить надо всё не ища оправданий чтобы не чистить. Но свиномакаки привыкли срать совсем не обращая внимания, такие в в сях только насрут и обосрутся. Си не для быдла.
Поясни, почему.
Самое распространенное что приходит в голову
1. Use after free.
ptr = mysupersecretpassword();
login_with_password(ptr);
free(ptr);
Но допустим enter_pwd куда-то сохраняло временно указатель...
tmp_ptr = ptr;
Если хакир сможет его прочитать, он сможет прочитать твой пароль, хотя ты думаешь что он удален.
2. Buffer overrun/overflow
char string[80];
char ptr = string;
while(ptr++ = getch());
Но что если хакир не остановится и введет больше 80 символов; тогда они перезапишут какую-то часть стека, и он сможет ввести так прямо машинные коды, который исполнится. Сейчас конечно от этого добавили защит, но все равно это проблема.
1)Чувак,это пиздец кринж, нахуй ты 2 раза память выделяшь?
2)Пикрил полностью безопасный, после работы с памятью можно для безопасности забивать эту область памяти хуйней, например нулями функцией memset, главное в конце очищать память, чтобы система не рухнула
scanf можно юзать, если знать, что scanf("%ns", hiy), ограничивает кол-во символов на входе и не даёт совершить переполнение, ну или использовать fgets, тоже с ограничением.
А так в си пиздец с ёбанным wchar, просто кринж
https://godbolt.org/z/d9hdYKr8o
Почему этот код выдает сег фолт?
Я всего лишь хочу заполнить массив размером 4n четыремя копиями массива размером n
На первый взгяд, в memcpy(AR2 + offset, AR1, sizeof), использовать без амперсанда. Не факт, что твой компилятор адекватно это переваривает(с лишним амперсандом), но в гадболте зеленая галочка, следовательно он это скомпилировал, попробуй убрать &, если не поможет, то семантика
Мудило с варнингами, ты опять вышел на связь?
Ок, убрал операнд, вставил в sizeof сам массив, сегфолта больше нет, но заполняется только одна четверть массива, а тут почему?
https://godbolt.org/z/afdxsfex9
Ну а офсет то в цикле увеличивается, каждый раз на размер ar1, 4 итерации должны по идее покрыть все четыре четверти ar2.
И зачем ты так запердолился, если есть виндовый AVR Studio.
Оффсет не нужно на размер int'а умножать. Это индекс, а не количество байтов.
А как сейчас с этим обстоит дело?
Есть какой-то кроссплатформенный вариант без жирных либ?
За это дело вообще кто отвечает, драйвер звуковухи?
>>567011
Что правда ?
Я ведь такой наивный, читаю техническую литературу по системному программированию и документацию, никогда не знал что туда можно передать параметр размера буфера, а на дваче мне открыли глаза, надо же...
Минус этого метода не только в буфере, а в том что чтение символов, заканчивается после того как передается пробел, да конечно, можно указать что-то вроде scanf("%5s %d", buf1, &varint), но это не очень удобно, минус этого метода ещё и в том что он не имеет ограничение на количество символов которые пользователь может ввести физически в консоли,т.к. когда пользователь будет передавать текст в буфер консоли, то тот в свою очередь будет выбрасывать в твой буфер (в массив в куче например), в отличие от метода WinAPI - ReadConsole (ReadConsoleW для широких), в котором ограничение ввода установлено на 256 символов (из которых видимые 254, два последних это переход на новую строку и нулевой терминатор), при условии что размер массива меньше 256*(n+1).
Как вариант эту проблему можно решать, через какой-нибудь дескриптор консоли, смотреть сколько байт находятся в буфере консоли, либо использовать getchar() (или его аналог для широких символов), либо писать свои методы которые будут правильно обрабатывать поток ввода, но сейчас на меня набежит один шиз, который не пользуется предоставляемым API, и судя по всему ничего не программирует кроме своих самолетиков на кружке по авиамоделированию, будет доказывать что я не прав...
Короче говоря, нужно быть умственно-отсталым, чтобы на полном серьезе писать консольные утилиты используя scanf (или даже его аналоги вроде scanf_t), и если честно я на хую вертел аргументы в духе: "Но это же в стандарте написано, пок-пок...", нужно быть идиотом, чтобы не понимать, что в Си нет абсолютно всего, чтобы этого можно было легко использовать из "стандартной коробки", и тем более чтобы это было удобно, и работало правильно.
Это не блядская Java или Python, где за вас уже всё написали, и вы даже не задумываетесь что и как там работает "под капотом".
Не просто так говорят, что знание Си = знание операционных систем, знание того как работает железо, т.к. нужно знать не сам язык, а множество аспектов и нюансов архитектуры и среды выполнения, в которой ведётся разработка кода на Си (уже не говоря про умение работать с различными отладчиками и знание ассемблера).
Я бы переформулировал это немного иначе, пусть это и звучит абсурдно, но очень хорошо описывает суть вышеизложенного: "Си создан не для того чтобы на нем программировать в той или иной среде, скорее среда в которой ведется разработка, создана для того чтобы можно было писать на Си".
>>567011
>пиздец
>кринж
>с ёбанным wchar
wchar_t— это тип данных стандарта ANSI/ISO C (а также использующийся в других языках программирования) для представления широких символов.
Да, я в курсе что размер wchar_t соответствует машинному слову, а т.к. это меньше 4 байт, то не создает возможности кодировать всю таблицу Юникода, в отличие от Linux где wchar_t составляет 32 бита, т.к. размер типа wchar_t определяется компилятором, вплоть до минимальных 8 бит, поэтому конечно же лучше его не использовать этот тип тем более для хранения юникода.
В этом вопросе, я признаю твою правоту, я ошибся, и не уточнил, что под wchar_t я имел ввиду short unsigned int (по крайней мере на моём железе это два байта, (gdb) p sizeof(short unsigned int) $1 = 2) для хранение двухбайтовых символов юникода.
>>567011
Что правда ?
Я ведь такой наивный, читаю техническую литературу по системному программированию и документацию, никогда не знал что туда можно передать параметр размера буфера, а на дваче мне открыли глаза, надо же...
Минус этого метода не только в буфере, а в том что чтение символов, заканчивается после того как передается пробел, да конечно, можно указать что-то вроде scanf("%5s %d", buf1, &varint), но это не очень удобно, минус этого метода ещё и в том что он не имеет ограничение на количество символов которые пользователь может ввести физически в консоли,т.к. когда пользователь будет передавать текст в буфер консоли, то тот в свою очередь будет выбрасывать в твой буфер (в массив в куче например), в отличие от метода WinAPI - ReadConsole (ReadConsoleW для широких), в котором ограничение ввода установлено на 256 символов (из которых видимые 254, два последних это переход на новую строку и нулевой терминатор), при условии что размер массива меньше 256*(n+1).
Как вариант эту проблему можно решать, через какой-нибудь дескриптор консоли, смотреть сколько байт находятся в буфере консоли, либо использовать getchar() (или его аналог для широких символов), либо писать свои методы которые будут правильно обрабатывать поток ввода, но сейчас на меня набежит один шиз, который не пользуется предоставляемым API, и судя по всему ничего не программирует кроме своих самолетиков на кружке по авиамоделированию, будет доказывать что я не прав...
Короче говоря, нужно быть умственно-отсталым, чтобы на полном серьезе писать консольные утилиты используя scanf (или даже его аналоги вроде scanf_t), и если честно я на хую вертел аргументы в духе: "Но это же в стандарте написано, пок-пок...", нужно быть идиотом, чтобы не понимать, что в Си нет абсолютно всего, чтобы этого можно было легко использовать из "стандартной коробки", и тем более чтобы это было удобно, и работало правильно.
Это не блядская Java или Python, где за вас уже всё написали, и вы даже не задумываетесь что и как там работает "под капотом".
Не просто так говорят, что знание Си = знание операционных систем, знание того как работает железо, т.к. нужно знать не сам язык, а множество аспектов и нюансов архитектуры и среды выполнения, в которой ведётся разработка кода на Си (уже не говоря про умение работать с различными отладчиками и знание ассемблера).
Я бы переформулировал это немного иначе, пусть это и звучит абсурдно, но очень хорошо описывает суть вышеизложенного: "Си создан не для того чтобы на нем программировать в той или иной среде, скорее среда в которой ведется разработка, создана для того чтобы можно было писать на Си".
>>567011
>пиздец
>кринж
>с ёбанным wchar
wchar_t— это тип данных стандарта ANSI/ISO C (а также использующийся в других языках программирования) для представления широких символов.
Да, я в курсе что размер wchar_t соответствует машинному слову, а т.к. это меньше 4 байт, то не создает возможности кодировать всю таблицу Юникода, в отличие от Linux где wchar_t составляет 32 бита, т.к. размер типа wchar_t определяется компилятором, вплоть до минимальных 8 бит, поэтому конечно же лучше его не использовать этот тип тем более для хранения юникода.
В этом вопросе, я признаю твою правоту, я ошибся, и не уточнил, что под wchar_t я имел ввиду short unsigned int (по крайней мере на моём железе это два байта, (gdb) p sizeof(short unsigned int) $1 = 2) для хранение двухбайтовых символов юникода.
>>563349 (Del)
>>555643
>>555621
>>555298
>>554813
>>554022
>>554027
>>553938
>>553885
Я больше не зайду на двач, хотел из любопытства, в последний раз, посмотреть что мне написали, и не более, т.к. это помойка на которой мало кто умеет нормально общаться, и к тому же она формирует вредные привычки в общении, закладывает деструктивные макросы мировосприятия довольно пагубно влияя на психику.
Проще говоря, 2ch = деградация.
На этом всё, всем пока, было приятно (и порой не очень) пообщаться.
Не будьте агрессивными петухами, используйте этот тред чтобы делиться полезной информацией, обмениваться знаниями или опытом, узнавать что-то новое, всем удачи.
т.е. у DirectSound/WME есть такая функция воспроизвести ноту? Или там тоже нужно какой-то свой сэмпл делать для эталонной ноты?
Залетуха пришел в тред, насрал тут своими мокрописьками и говнокодом, а виноваты аноны. Правильно говорят «Если тебе все говорят что ты пьян, стоит присесть», но залетный этого не понимает и пытается в перефорс своей духотой.
Позитивное мировосприятие давно себя дискредитировало.
Ты не прав. Здесь очень много интересных людей сидит. Нужно только прорваться через это всё, что ты описал - и тогда ты поймёшь.
>Залетуха
>насрал
>мокрописьками
>говнокодом
>«Если тебе все говорят что ты пьян, стоит присесть»
>залетный
>не понимает
>пытается в перефорс
Ну если ты такой умный, напиши что-то полезное, книги например по системному программированию под Windows/Unix, полезные ресурсы, или можешь например скинуть ссылку на пример консольной утилиты в Win/Linux, а мы посмотрим на твой эталонный код, будет на что ровняться.
А лучше скинь ссылку на свой репозиторий, ты же не какой-то говнокодер-залетун как я, вот за одно посмотрим репу настоящего профи, а я чему-то новому научусь, и стану ещё больше тебя уважать.
>>570246
Да я устал что-то постоянно ждать от людей анон, как в реальном мире так и в виртуальном мире, проще просто изолироваться и делать то что тебе нравится, литературы полно, документация есть, бесчисленное море всевозможных ресурсов, форумов и прочего, возможность работать удаленно.
Каюсь, я и сам когда-то был таким, но это деградация общения, ни к чему хорошему не приводит, тем более в /pr/, я бы понял в /b/ где сидят полоумные школьники, или 40-летние скуфы которые ведут себя как те же полоумные школьники. Порой замечаю, как сам общаюсь подобным образом, и мне становится от этого противно, вызывает отвращение.
Ожидал что ты это напишешь, всё же хочется завершить дилог.
Скинь ссылку на свой настоящий git-репозиторий, быть может ты работаешь в сфере оборонной промышленности, и тебя с твоей гениальностью вырвали с руками из твоего универа не дав времени на создание собственных проектов, в связи с чем у тебя нет git-репозитория, поэтому можешь написать простую консольную утилиту под Windows на чистом Си, только подробно закомментируй свой код, и укажи ссылки на используемые источники, либо названия книг которые ты использовал при написании кода.
Ты же не чмоха, или како-то залетун-говнокодер, верно ?
Только пожалуйста, не пиши что ты циник, мизантроп, плейбой и филантроп, и что тебе чужда чья-то оценка, т.к. это будет явная демонстрация неспособности аргументированной критики, не падай ниже плинтуса.
>можешь написать простую консольную утилиту под Windows на чистом Си
Ну лови. Не знаю зачем тебе такое правда.
>Шиз
>писанине
>зацикленности
>мокрописьках
Прими тот факт что твоих навыков хватает, только на то, чтобы оскорблять других пользователей в треде, и самоутверждаться за счет матерных выражений, а я в этот тред пришёл чтобы обменяться полезной информацией, узнать что-то новое.
>непонятный кусок кода вырванный из контекста
>непонятно кому принадлежит
>без комментариев
>на C++
Я ведь просил на чистом Си, без плюсов, с подробными комментариями, списком используемых библиотек.
>>570380
Меня не волнует что ты, и куда скидывал год назад или 5 лет назад, я прошу то, что у тебя есть сейчас, и делаю я это не для того чтобы можно было тебя унизить, в отличие от меня униженной чмохи, залетуна-говнокодера, а для того чтобы понять, "как правильно делать", узнать что-то новое от настоящего профи из мира программирования, именно поэтому я прошу, чтобы код был полным, с подробными комментариями (в разумных рамках), и ссылками на используемые источники/документацию, будь милосерден, потрать немного своего сверх-ценного времени.
К тому же т.к. ты профи, много времени у тебя не уйдет, всего-то прошу написать простую консольную утилиту под Windows, желательно чтобы программа понимала и умела работать с UTF-8 и читать символы на разных языках,
всего-то делов, для тебя как два байта переслать...
>скидывал год назад или 5 лет назад, я прошу то, что у тебя есть сейчас
То, что было год назад, никуда не исчезло и есть у меня сейчас.
> код был полным, с подробными комментариями
Просмотри видео, там подробнейший построчный аудиокомментарий.
>непонятный кусок кода вырванный из контекста
Я и не обещал что он будет полными или понятным.
>непонятно кому принадлежит
Анону.
>без комментариев
Самодокументированный код
>на C++
Мелочи. Ncurses сишная либа.
> я в этот тред пришёл чтобы обменяться полезной информацией, узнать что-то новое
Но пока все что ты сделал - это доебался до анонов со своей духотой и неадекным поведением. Поэтому отношение к тебе соответственное, можешь проследовать нахуй.
>Просмотри видео, там подробнейший построчный аудиокомментарий.
Ну хорошо, видео годное, посмотрю.
>>570411
> Ncurses
Ну вот видишь анончик, я например не знал про этот Ncurses, не знал что есть такая замечательная библиотека для написания консольных утилит ввода-вывода, так что спасибо тебе, узнал что-то новое и полезное, а ведь изначально наш диалог мог начаться именно таким образом, вместо того чтобы покрывать друга друга матом и слать на разные стороны, другие аноны тоже узнали бы что-то новое и поблагодарили тебя.
>Поэтому отношение к тебе соответственное, можешь проследовать нахуй.
Надеюсь ты сильно не обиделся на мои слова, извиняюсь если обидел тебя (без шуток), спасибо что написал про Ncurses.
И всё же, хочу добавить, что полностью нельзя уйти от использования API-операционной системы, особенно если пишешь на чистом Си.
Буду очень признателен, если ты не станешь слать меня нахуй, а например посоветуешь пару книг по системному программированию (желательно под Windows), я вот недавно нашел замечательную книгу: "Рихтер Дж., Назар К. - Windows via C C++. Программирование на языке Visual C++ - 2009".
>узнал новое
>ncurses
>Initial release1993; 30years ago
>ncurses is a free-software emulation of curses.
>The first curses library was developed for a BSD operating system, around 1980
Ох вау.
А ты точно Си-программист?
>А ты точно Си-программист?
Признаюсь, я не Си-программист, писал на других языках, и очень слабо знал Си и ассемблер (тем более C++), дело в том что меня сильно заинтересовал реверс (и системное программирование тоже), поэтому решил восполнить забытое, и прошло не так уж много времени с тех пор как взялся за изучение этой темы.
Не смотря на это, у меня большое желание изучить всё очень подробно, на сколько глубоко это возможно сделать, поэтому был бы рад комментариям и полезной информации от людей вроде тебя, которые варятся в этом не первый месяц, или год.
ну вот я и уточнял есть ли в винде встроенное такое
В программировании нет понятия "изящно", чтобы еще его и сравнить как что-то более или менее. Такие понятия придумывают только смузихлебы и поехавшие преподы.
Есть скорость написания кода, скорость работы кода и потребление ресурсов.
Вот если нужно оптимизировать на скорость работы, то можно написать, например, так как на пикриле. Если задача будет выполняться особенно на больших размерах пирамид.
Видимо также у тебя подразумевается работа с некой двумерной картой, которую будут использовать не в вакууме.
Значит задача разбивается на три этапа:
1) инициализировать нашу карту какими-либо значениями (пустого места)
2) установить расположение пирамиды/юнитов на карте/пикселей в текстуре
3) отобразить/отрендерить это на экран/в текстуру
Данный алгоритм с пикрила оптимизируется еще двумя способами:
1) избавляемся от двухмерности массива и делаем одномерным
2) все циклы построены так, что мы можем каждый распараллелить по потокам, т.е. мы параллелим цикл в INIT, параллелим цикл в VIEW, а в SET мы можем и каждый из четырех циклов распараллелить и циклы сами выполнить в любом порядке, т.к. они работают с независимыми данными
надеюсь, что ты не лабу делаешь))
Бля, братан, спасибо, но я до таких умных вещей еще не дошел. Но спасибо, попытаюсь понять, че все это значит
>надеюсь, что ты не лабу делаешь))
Зря надеешься(
https://cs50.harvard.edu/x/2023/psets/1/mario/more/
>рисует фигуры
>printf()
printf это же потоковый вывод, годится только для портянок логов - последовательного выблева данных, но никак не для рисования по экрану. Что это за терминальная мозговая недостаточность, что даун не понимает таких элементарных вещей?
> мы тут просто серем тупостью
Ну и зачем? Что значит "просто"? Просто дебилы, и не мешай нам дебилить, так что ли?
> Что это за терминальная мозговая недостаточность, что даун не понимает таких элементарных вещей?
>>572087
> Ну и зачем? Что значит "просто"? Просто дебилы, и не мешай нам дебилить, так что ли?
ты то уж что порвался, я ему решил задачу с тем вариантом вывода, что у него была в условии, для визуализации алгоритма. Мне ему что, вкорячивать работу с контекстами графических устройств, может еще тут конвеер вулкана развернуть для такой задачи было нужно?
Мне-то не трудно, но наглядности это значительно лишает, т.к. акцент тут на алгоритмах, а не выводе, поэтому в учебных лабах это и используется там, где нужно. Как тебя похмелье-то после праздников еще не отпускает.
>решил задачу
Один пришел с тупой задачей, другой для него решил. В результате оба отупели еще больше. Браво.
>Мне ему что, вкорячивать работу с контекстами графических устройств
>консоль
>работу с контекстами графических устройств
Вот-вот, результат одебиливания налицо.
>>572093
А ты лучше вообще не пиши, раз не понимаешь разницу между принципом работы printf и поставленной задачей рисовать на экране. Это даже к программированию не имеет никакого отношения, а сырой здравый смысл - базовое наличие мозга, не тупить как дебил.
Дебил, ты вообще понимаешь что такое рисование? Представь холст или программу паинт, а теперь подумай, что является основой для процесса рисования? Подсказываю - место, координаты по которым ты собираешься наносить мазки своего рисунка. Рисование подразумевает прямоугольную площадь с ПРОИЗВОЛЬНЫМ ДОСТУПОМ. Заметь, тут программирование даже ни при чем, всего лишь надо не быть тупогогим имбецилом безмозглым, но ты не смог.
А теперь скажи, где ты видишь координаты у printf?
Правильно, нигде. Так какого хуя ты лезешь в рисование этим говном совершенно не подходящим для рисования?
Теперь уже программирование. Ты вообще понимаешь, тупой выблядок собаки, что такое компьютерный экран и как происходит вывод на него изображения? Что нужно чтобы рисовать? Нет, не понимаешь. Я бы сейчас посоветовал идти читать, учиться, но не буду. Потому что бесполезно, прежде чем учить компьютеры надо не быть дебилом, а ты уже конченый даун даже без программирования, что ясно видно по первому абзацу не касающемуся программирования, где ты обосрался.
> пук
Dwarf fortress и вобще посмотри что такое игры в терминале
Там неожиданно рисуют картинку симвалами ascii
но спасибо за пасту, улыбнулся с тупости
Нет, не подразумевает. Традиционно вывод производится в консоль, а у консоли есть способы передвинуть курсор обратно.
У терминала нет координат. В том то и фишка, что это потоковое устройство, а не блочное. Именно это позволяет подключаться к серверу и там играть в нетхак.
> У терминала нет координат
Результат одебиливания printf-ом налицо.
Пожалуйста, наглядный пример, как от дебильных задач люди тупеют. С каждым разом привыкают к тупости и тупеют еще сильнее. Уже даже когда прямо тыкают в ошибку, не шевелятся. Тупость закостенела намертво, обученный готов. Занавес.
> Это просто поразительно, как анон мог порваться из-за дефолтного printf'a.
не для всех новогодние праздники проходят без последствий, в том числе для психики)
Поколение ЕГЭ, спок.
Может тебе просто не интересно то, что ты учишь.
Все запоминается повторениями, причем циклическими, через неделю, через месяц. Помнят только то чем постоянно пользуются, в окружающем мире мало похожего на код.
> Почему сложно учить? Забывается все концепты, быстро.
> -девственный ньюфаг
С - самый простой язык для изучения. Но самый сложный если пытаться написать на нем что-нибудь вменяемое
А что делать, если я исходный блок разбиваю как хочу и везде использую указатели на произвольные участки внутри этого блока? После вызова realloc() память по всем моим указателям будет содержать мусор. Как сделать, чтобы блок нового размера был доступен по старым адресам? mmap здесь может помочь? И вообще, если у меня возникла такая необходимость, то всё ли я делаю так?
клангом собираю из него wasm (пик-2)
после чего дергаю функцию из js (пик-3)
все работает нормально, а как теперь в обратную сторону: вызвать из си функцию js?
Как я вычитал, что формируем importObject, который должен будет содержать всё импортируемое в си, пихаем его вторым аргументом в функцию instantiateStreaming, а как правильно объявить ее в си коде и нужны ли еще какие-то флаги при компиляции?
Наоборот же, самый простой. В си ты можешь делать все, что хочешь. Ты не зависишь от либодела, насравшего говном в дефолт функционал.
Ничего. Поэтому и говорит что сложно.
Или у тебя есть пруфы обратного? Ну показывай.
Си - язык говно, язык пидор с практической точки зрения. Но тут нет вины Си, это наоборот следствие его охуенности. Си идеально соответствует компьютеру, поэтому проблемы с написанием программ это проблемы компьютьеров, железа, а не Си.
"Персональные компьютеры (PC)" как платформа это говно ёбаное, отсюда и лезут проблемы. Ничего нельзя написать нормального потому что компьютеры не содержат программной поддержки своего железа, т.к. оно нефиксировано, может быть каким угодно, а значит и годную прошивку не напишешь.
Как результат, всё сваливается на сторонние библиотеки, васянские поделки. ПК это сплошное васянство, и Си только лишь отражает эту проблему как идеальное зеркало из за своей идеальности.
Бтв, правильно ли я понимаю, что с точки зрения производительности лучшие решения 2 и 4, так как там дублирующихся действий?
https://pastebin.com/SHepZvKM
У меня всё получилось! Я во всём разобрался и написал идеальный код для решения моей простенькой задачи! Спасибо всем неравнодушным сишникам, которые мне помогли в этом!!! УЁБКИ!!!!!
Ну я не разбирался во всех циклах.
Но у тебя массив [10] это элементы 0...9
Зачем же тогда берешь остаток от деления на 11? Надо писать %10.
Потому что только так ты получишь 0..9
Я пока не использую эту переменную. А так да, что-то косякнул!! Спасибо за наводку. Но ошибка явно не в этом. Ладно, можешь забить на ошибку - я вроде разобрался где она у меня возникала, но не понимаю почему так происходит, т.е., почему ошибка переполнения возникает не при каждом вызове? Косяк был в последнем вложенном цикле, в процедурке array, там при инициализации счётчика он равен равен счётчику основного цикла, а по ходу пробегания по массиву эта "вложенный" счётчик должен уменьшаться, а я применил операцию инкремента. Но почему в этом случае программа падала не каждый раз - я хз. Наверное, не каждый раз выполнялось условия активации вложенного счётчика. Надо проверить!
Может быть потому что у тебя int i = 0, в последнем цикле int j = i (= 0) и при этом ты обращаешься к (p + j - 1), т.е. вылезаешь до массива? Да и до этого, *(p + i - 1) при i == 0. Но повторюсь в таком коде мне лень копаться, я просто смотрю очевидные моменты.
Нет, не в этом дело! Если бы было в этом >*(p + i - 1) при i == 0 дело, то мне думается, что программа падала бы каждый раз, потому как это условие проверяется при каждом проходе, а вот в последний вложенный цикл программа заходит только в том, случае, если выполняется условие, которое может, при рандомном заполнении массива, не выполняться каждый раз.
>в таком коде
А поделись своим видением нормального кода. Что мне нужно подтянуть, чтобы писать удобоваримый для других людей код? Или пока не заморачиваться этим, потому что я пока постигаю эту науку, изучая по книгам и статейкам в тырнете, типа лучше для начала научиться решать задачки посложнее, освоить алгоритмы, а потом можно будет и красотой кода заморочиться? Или лучше сразу полезную привычку вырабатывать?
>А поделись своим видением нормального кода
Я отказался от Си в пользу С++, но это тсс. Все же другой тред.
на пике просто эталонный код какой-нибудь лабораторной, хорошо, что на практике так непонятно никто не пишет
> Бтв, правильно ли я понимаю, что с точки зрения производительности лучшие решения 2 и 4, так как там дублирующихся действий?
компилятор может оптимизирует, а может не оптимизирует, тут как карта ляжет
с точки зрения производительности - скорее всего сразу считаешь во float и оптимизируешь формулу, удаляя лишние/прожорливые действия
Потому ты прекращаешь работу программы на первой итерации цикла. Понимание памяти здесь ни причём. В чём вообще задача состоит? Перевернуть строку?
>В чём вообще задача состоит?
Продемонстрировать понимание работы указателей. Задача провалена.
Как же я проорал когда два указателя пробежали мимо друг друга и пошли обратно разворачивать.
Объясните несведущему совершенно в программировании ламеру, зачем нужен C, когда есть C++?
В чем нюансы вообще? В чем их разница столь ключевая
https://tproger.ru/articles/what-c-is-good-for/
t
t
p
s
:
/
/
t
p
r
o
g
e
r
.
r
u
/
a
r
t
i
c
l
e
s
/
w
h
a
t
-
c
-
i
s
-
g
o
o
d
-
f
o
r
/
После этого пста у тебя будет понимание в чём отличие чистого си от плюсов.
https://tproger.ru/articles/what-c-is-good-for/
t
t
p
s
:
/
/
t
p
r
o
g
e
r
.
r
u
/
a
r
t
i
c
l
e
s
/
w
h
a
t
-
c
-
i
s
-
g
o
o
d
-
f
o
r
/
После этого пста у тебя будет понимание в чём отличие чистого си от плюсов.
Пиздец, что за ебанутая задача и её исполнение!!!??? А в функцию или процедурку передать массив, чтобы продемонстрировать понимание работы указателей?
> зачем нужен C, когда есть C++? В чем нюансы вообще? В чем их разница столь ключевая
компилятор С есть на любом утюге сейчас пока продолжает появляться на любом утюге для новых устройств, плюсы - нет
возможно в отдаленном светлом будущем будет только уже llvm со своим ir, под которое будет подгоняться все свежее железо
Писал вчера финальный экзамен в парижском университете , дали задание на листе и попросили написать только output. Вот в чем смысл был)))
Двачую, причем соблюдающий стандарт компилер Си пишут многие в одиночку как хобби или курсач, а вот С++ компилер вообще мало кто написал.
ну так-то си во многом хорош, если б не древние костыли, от которых не избавиться
поэтому появляются всякие zig, v, чтобы оставаться в рамках c и его функционала и простоты понимания, но убирая всякие косяки и костыли прошлых лет
Zig приятный, но последние пару версий совсем неготовые, и тоже довольно сложный, я бы его компилятор вряд ли написал.
Так костылить начали в стандартах, если юзать чистый Си без этих нововведений, т.е. не использовать фичи из новых стандартов, то всё ок - Си выполняет свою задачу, как язык, который создавался на замену ассемблеру. А, если его использовать как высокоуровневый язык, то я ебал его маму рот - Пайтон в тыщу раз проще и интуитивнее, но, при этом, если юзать Пайтон, то всегда остаётся мысль о том, что ты нихера не шаришь то, как работает комп, т.е. для тебя всё это лютая магия; но с Си таких проблем нет - по мере погружения в этот язык, начинает прояснятся картинка в голове, плюс появляется способность читать код на Си, следовательно появляется возможность погрузиться в ядро линукса и начать понимать, как устроена ещё и ОСь, а за ней и как устроена и работает сеть. Вот этим этот язык и хорош - если хочешь понять устройство и принцип работы компа, а за ним понять и принципы устройства нашей цифровой цивилизации, то вежливо просимо в великий и могучий Си.
ну там он переезжал на рельсы аутофилляции, поэтому последние версии такие
а по сложности там особо ничего нового сверх и нет, деферы, которые от Си уже просят уже как от С11, импорт вместо инклуда, так то же самое примерно, еще UB поменьше, так что особо не сильно
ну так да, на с89 пишем алгоритмы, числодробилки и либы, потом дергаем любым на вкус скриптовым языком их api
Дебильные сказки. Скриптомакака не осилит си, а программист на си не будет пользоваться скриптопарашей.
Одебилившего виндузятника сразу видно за сто вёрст!!!!!!!
Этот долбоёб пытается нести окна в массы, а за окнами он несёт смерть всему разумному, не иначе. Он, наверное, фан С#.
Вернусь через месяц, снова.
Есть.
>>578801
>на с89 пишем алгоритмы, числодробилки и либы, потом дергаем любым на вкус скриптовым языком
Видишь, написано что это один человек, и на си пишет и на скриптах вперемешку. Так не бывает. Кто пишет на скриптах си не осилит, а кто пишет на си не будет писать на скриптах.
Налицо тупая скриптомакака которая пиздит. Считает, что если есть какие-то сишные либы которые можно дергать из скриптов, значит ЭТО МЫ ПИШЕМ НА СИ кудкудах. Короче, чухло приписывает себе чужие заслуги. Обычная тупая чернь, макакоскот скриптовый.
Блять, какой же долбоёб тут по треду прыгает!!! Просто пиздец!!! Долбоёб, нахуя тебе дёргать целые сишные либы, когда ты можешь дёргать результат, который получен на Си?
Скрипт это хуем елозить по рту.
Бесконечный скрипт это грязным, ниггерским хуем елозить по твоему рту.
> кто пишет на си не будет писать на скриптах. Налицо тупая скриптомакака которая пиздит
чел, я пишу на с, плюсах, расте, питоне, луа, js... для меня нет особой разницы на чем писать, я программист, скриптами я тоже пользуюсь внезапно, но чаще всего я пишу либы, чтобы тот, кто не программист просто дергал api этих либ через скриптовый язык или вообще интерфейс
тебе так нравится, что тебя обоссывают всем тредом? )
> я чот нихуя не понел си же и есть скрипт
не, это ниша за AngelScript он же сиська с крыльями
"мы" очевидно означает фирму целиком.
А что делать, если нужно изменить размер блока, но сохранить указатели на участки внутри него? Понятно, что можно вместо указателей хранить смещения, но я надеялся на что-то более приятное.
Динамичнский массивы же как раз по смещению на размер элемента и работают.
Depends. Может быть надо больше памяти выделять заранее. Может быть если у тебя указатели на что-то, то получается обычная куча, и неважно что она не непрерывная.
Открой спеки процессора и посмотри как он работает с адресами. Тогда и идиотских надежд не будет. Программирование это техника, а не религия с загадыванием желаний.
Уже
Язык Си не завязан на то, как процессор работает с адресами. Это абстрактный язык со своей моделью памяти.
Так я же не ты, который путает язык и процессор.
Хз, я по Прате вкатывался. Да и сейчас его юзаю как справочник, если что подзабуду.
В гугле все ссылаются на студию
Что-то мне подсказывает что так не получится.
Надо все равно MS Build Tools и Windows SDK качать, и clang.
Или может быть кросскомпиляция MinGW из под cygwin?
Короеч все выглядит большим гемором, чем студия.
Может кто еще подскажет.
Спасибо за инфу, анон
>Надо все равно MS Build Tools и Windows SDK качать, и clang
А есть где пример? Хочу организовать это в vscode, без чего либо тяжеловесного. Скачал там плагин с плюсами, но он ест-но не видит всё что связано с винапи.
Я правильно понимаю, что тут:
1)точки следования это ; и ;
2) присваивание у оператора присваивания это тот же побочный эффект что инкременты
3) получается побочный эффект присваивания может происходить до инкрементов, тогда в переменной будет 12?
Чел, чёт ты какую-то хуиту читаешь, потому что алгоритм тут следующий:
1) Переменной i присваивается значение 5;
2) К переменной i прибавляется единица;
3) К переменной i прибавляется единица;
4) Переменной i присваивается значение суммы двух переменных i, которая уже равна 7 после двух операций инкремента;
Тут как не крути, но i будет равна 14.
> Как можно собрать проект на си и винапи на винде? Не хочу качать студию. Есть где толковые примеры? В гугле все ссылаются на студию
https://rsdn.org/article/baseserv/api32.xml
когда уже освоите хотя бы гугл
>ты какую-то хуиту читаешь
Или ты малость не шаришь. Черным по белому же написано, зависит от компилятора и моральной деградации его создателя.
Да, я после того, как написал псто, подумав, понял, что какой-нибудь уебан может написать компиллятор, который не будет соблюдать правильный приоритет операций.
Тут один еблан это ты, компиляторы пишут под стандарт, а не под то как тебе кажется это должно работать. А стандарт знать должен ты, чтобы понимать, что может выдать компилятор
А читаю я просто Вики статью про UB...
Но ведь если стандарт допускает говно, говно стандарт, а не я. Кто же виноват, что си дохлый язык, на чей стандарт всем поебать.
А зачем же выпускать стандарт, который будет ломать всем привычную логику? А, еблан? Или, если тебе в тарелку наложить говна (настоящего человеческого говна), то ты не будешь сопротивляться и костерить повара, а начнёшь жрать говно, потому что оно подано тебе на тарелке?
>собрать проект на си
>Не хочу качать студию
>скидывает древнюю статью с билдом через плюсы и в студии
Когда уже начнёте читать а не кряхтеть?
Сначала поживи с наше, щенок.
>>585539
Хуйню какую-то несёшь, стандарт не просто так написан, чем больше там операторов является точками следования, тем медленнее будет код. Ты натурально не понимаешь, поэтому несёшь хуйню, а делали это всё умные деды. Вообще лучше бы на мой вопрос ответили а не вот эти пуки пустые высирали
Ты вообще понимаешь, что происходит, когда твой погромисткий компилятор, написанный для стандарта, который создан погромистами, которые делают из Си высокоуровневый язык, чтобы следовать, по каким-то только им известным причинами, за модными тенденциями, лишая, при этом, Си своего плюса - zero runtime? Ты понимаешь, что то говно, которое ты защищаешь в этом выражении: i = ++i + ++i, чтобы получить 13 хранит одну и ту же переменную в разных местах и с разными значениями? Теперь, дурик, объясни мне - нахуя это вообще нужно? Нахуя ломать язык, единственные плюсы которого - скорость и возможность скомпилить его на утюге?
>чтобы получить 13 хранит одну
Ты какую-то хуйню нафантазировал. У ++ и + просто один приоритет, они выполняются последовательно. А вот чтобы получить 14, нужно задать искусственный приоритет операций, несвойственный языку изначально.
Складываются не переменные, а значения, естественно они должны храниться. А у тебя какая-то шизанутая оптимизация: раз там указана переменная, значит работа только с переменной, а раз переменная только одна, значит и значение только одно - после всех вычислений. Это шизофазия. Не нужны такие ебанутые оптимизации вопреки здравому смыслу того что написано - выражения сложения.
>они выполняются последовательно
>искусственный приоритет операций, несвойственный языку изначально
Совсем пизданулся? То есть, ты хочешь сказать, что в этой реализации Си арность операций никак не влияет на её приоритет, да и вообще в этой реализации Си нет никаких приоритетов у операций?
Это что же, если мы зададим такое условие:
if (k + 1 <= k % 2), то оно будет true?
>>586495
>естественно они должны храниться
Что они? Значения? Ебанутый, как значение привязывается к переменной?
>А у тебя какая-то шизанутая оптимизация
Ебанутый, это не оптимизация, и тем более не моя, а работа компьютера! Значение переменной хранится в определённой ячейке памяти или регистре процессора, с которой (ячейкой памяти), или с которым (регистром процессора) происходит определённая работа.
Блять, такое ощущение, что не с сишниками разговариваешь, а с ебанутыми питонистами, которые проходят какой-то манякурс в скиллфактори или где ещё вы, блять, этого говна понабрались?
имеем:
i=5;
надо получить:
i= ++i + ++i;
смотрим по порядку:
++i
какой значение? - 6
Всё, 14 уже не получится.
Если в сях по стандарту это не выполняется, значит такой поеботой просто нельзя пользоваться, нечитаемый человеком код.
>Совсем пизданулся?
То есть в твоем мире все инкременты в выражении должны выполняться до первой операции сложения?
И что же тогда должно получиться в результате выражения:
int i=5; i=++i + ++i + ++i + ++i;
Но питонист тут я, да.
Блять, а это похоже вообще скрипто-вебмакака понабежала в тред! Просто пиздец!!!!
>i= ++i + ++i;
>смотрим по порядку:
>++i
>какой значение? - 6
блять, ещё и неграмотная
Тут надо, продолжить, долбоёб:
>смотрим дальше
>++i
на твоём чурбекском языке продолжу
>какой значение? - 7
>смотри по порядку дальше
>+
>какой значение? - слева в выражении стоит переменная со значением 7, справа в выражении стоит переменная со значением 7, т.е. имеем два аргумента, которые являются значением одной и той же переменной, которая, блять, сука вы ёбанные дегенераты и уёбки, хранит своё значение в одной и той же ячейке памяти, в бинарной операции сложение, которые равны семи, так, сука ЁБАНЫЙ РОТ БЛЯДИ ВЫ ТУПОРЫЛЫЕ, какой значение присвоится переменной i, если сложить 7 и 7?
Долбоёб, операция сложения является бинарной. Узнав эту сакраментальную тайну - посчитай сам своё ебанутое выражение. 31
Ну так посчитай. Почему инкременты, имеющие больший приоритет, не выполняются в первую очередь? Как обосрался, так сразу ушел в троллинг тупостью?
>Почему инкременты, имеющие больший приоритет, не выполняются в первую очередь?
Да, долбоёб, почему? Может помимо приоритета операций есть ещё и другие правила языка, допустим, которые говорят, что сложение есть бинарная операция, а, следовательно, если мы имеем уже два "готовых" аргумента, то их надо обязательно сложить? И кто тут обосрался, а, ебанашка ты, блять, питоническая?
Дальше смотреть не нужно, иначе получится, значение меняется в зависимости от записи последующих значений, это шизофазия, нечитаемый код, одно сплошное UB.
i=i+i
это арифмерическое выражение оперирующее значениями, а не переменными. В данном случае i это лишь алиас для её значения, числа 5. Так устроен язык си, это обыкновенная запись по значению.
i=i+i
эта запись вовсе не оперирует переменными, для того нужны указатели или ссылки, а тут запись по значению. То что опертор ++ увеличивает содержание переменной это побочный эффект, не относящийся к записанной арифметической операции. Арифметика происходит со значениями - анонимными числами, а вовсе не с переменными. Повторяю, для манипуляции переменными применяются указатели или ссылки.
>для манипуляции переменными применяются указатели или ссылки
Чел, ебать ты очевидные вещи рассказываешь! Спасибо, конечно! Но, то что, ОКАЗЫВАЕТСЯ, БЛЯТЬ, мы единицу прибавляем не к самой, блять, переменной, чтобы не получить, блять, в арифметическом выражении i1, а к её значению, которое, ОКАЗЫВАЕТСЯ, БЛЯТЬ, хранится не в самой переменной, а, БЛЯТЬ, ОКАЗЫВАЕТСЯ, просто где-то в памяти, т.е. в какой-то ячейке памяти, на которую, ОКАЗЫВАЕТСЯ, БЛЯТЬ, указывает указатель (давай ещё затри мне, что указатель тоже хранится где-то в памяти), и таким образом...
Как эта вся дичь, что ты мне прогнал, объясняет то, что складывая две одинаковых величины (заметь, это не две одинаковые дробные величины), получаем нечётное число? Ваш этот ебучий стандарт и компиллятор погромисткий, блять, нарушают даже простые правила арифметики. Ты мне для начала этот ебантизм объясни, а потом уже, возможно, мы с тобой попытаемся объяснить тебе такие сложные материи, как указатели в языке программирования Си.
>>586660
Ты тоже мне попытайся объяснить ебантизм, что я описал выше. А то ты, долбоёб питонический, даже не понимаешь, что такое арность операций. Хотя, если ты не понимаешь, что такое арность операций, то, блять, и не объяснишь мне ебантизм, что я описал выше. Поэтому просто, для начала, давай послушаем попытки этого 2586659 господина объясниться, а потом подумаем.
i=5;
i= ++i + ++i;
++i :значение 6
+
++i :значение 7
i= 6+7 :значение 13
14 не получится никак.
14 может получиться, если это не значения, а ссылки на переменную, но тут нет ссылок, это запись по значению.
1) Что такое сложение в ЯПе Си? Сложение - это бинарная операция.
2) Что делает сложение в ЯПе Си? Сложение получает сумму двух аргументов.
3) Откуда берутся эти два аргумента? Они хранятся в ячейках памяти.
>это запись по значению
Хорошо, давай проще:
>++i :значение 6
Когда ты получил значение 6, куда ты сохранил это значение? Уже сразу присвоил переменной i, которая стоит слева от знака равно?
Я кажется понял корень проблемы этого треда:
Кому-то из этого треда не помешало бы пройти курс низкоуровневого программирования. Чутка покодить на assembler и много вопросов и пустых мест в картинке о кодинге пропадут.
http://www.stolyarov.info/books/programming_intro/vol2
Приобщайтесь, аноны!
>>586704
Я мимо шел, но в gcc получается 14.
https://onlinegdb.com/GyauuOQJQ
Если посмотреть дисассемблер в gdb, то там такоe выполняется:
mov [rbp-0x4], 0x5
add [rbp-0x4], 0x1
add [rbp-0x4], 0x1
mov eax, [rbp-0x4],
add eax, eax
Надеюсь, разметка не сожрет. Но вроде и так все понятно, что в моем случае i хранится по одному адресу и все действия выполняются только над ним.
gcc 6.3.0 если что
>это кринж
Кринж, это то, что ты высрал. Префиксная и постфиксная операции в выражениях выполняются по-разному.
Чаю, анонче!
Можно в любую функцию залетать и смотреть дисассемблирование. Крутяк!! gdb это величайший инструмент для исследования!!!
Сам по себе голый гдб достаточно архаичен. Если реально часто в него лезешь рекомендую глянуть его модификации типа gdb-peda или gef.
Чаю, анонче! Надо поизучать.
Где-то полгода проверял эту хуйню на микроконтроллере, то есть все компилил арм компмлятором. Получалось 13, хотя на х86_64 всегда получалось 14 на прыщах, на винде тоже было 14, когда тестил в Visual Studio.
Мб это уже устаревшая тема и почти везде это пофиксили, хз.
>Хорошо, давай проще:
>>++i :значение 6
>Когда ты получил значение 6, куда ты сохранил это значение?
Никуда, это забота компилятора, а не программиста куда там чего сохранять или нет.
++i естественно присваивает сразу переменной, но это не имеет значения для сложения, которое берет ЗНАЧЕНИЕ, а не ССЫЛКУ на переменную. Ты реально такой тупой, что не можешь отличить значение от ссылки? Значение берется компилятором и хранится где ему угодно, оно отвязано от переменной, главное, что оно уже не меняется, иначе арифметика перестает работать. Иначе получаются мутирующие значения в зависимост от дальнейших аргументов, это непредсказуемая шизофазия, а не код.
> Уже сразу присвоил переменной i, которая стоит слева от знака равно?
Совсем того? Присвоение знаком равно идет результирующего значения, когда справа от знака равно всё посчитано. Компилятор может оптимизировать это как угодно, и присваивать хоть сразу, вообще поебать, потому что в первую очередь он должен генерить ПРАВИЛЬНЫЙ код, а только потом уже быстрый.
По ключу -S
Чел, иди проспись! Ты похоже незамерзайки объебался.
Нет, потому что алгоритм может быть таким:
1) Переменной i присваивается значение 5;
2) Первое слагаемое инкрементируется, теперь это 6;
3) Второе слагаемое инкрементируется, теперь это 7;
4) 6+7 = 14
>>587106
Блять, поколение ЕГЭ, вам даже ассемблерную вставку вкинули, но вы, бляди питонические, высокоуровневые уёбки, продолжаете, объебашись незамерзайкой, писать какую-то хуиту.
mov [rbp-0x4], 0x5
add [rbp-0x4], 0x1 - ебанашки питонические, вы здесь видите адрес, куда добавляется единица?
add [rbp-0x4], 0x1 - а здесь, питонические уёбки, видите адрес?
mov eax, [rbp-0x4] - тупорылейшие бляди, вы здесь видите, откуда берётся значение и куда добавляется???
add eax, eax - безмоглые хуесосы из поколения ЕГЭ, вы понимаете, что это всё значит?
> ассемблерную вставку вкинули
Это баг компилятора, противоречащий синтаксису языка и здравому смыслу. Типичная багофича wontfix, которую приходится выучивать и обходить (не использовать такие конструкции) чтобы не уебаться об грабли.
Посмотрите на веруна, которому компилятор как библия, молится считая непогрешимым идеалом, своих мозгов-то нет.
>баг компилятора
Твой батя - долбоёб и баг компилятора, сучий ты уёбок!!!!
Короче, я обоссал, вас долбоёбов, и укатил в закат! Заебался отвечать на дегенеративную толстоту!
Шиз, ассемблерная вставка - это когда ты сам на ассемблере код вставляешь.
А стандарт с++ не говорит, какой ассемблер будет в результате в данном случае, и позволяет компилятору выдать такой код:
mov ax, 0x5
add ax, 0x1
mov cx, ax
add ax, 0x1 - ебанашка, увеличилось только второе слагаемое
add ax, cx
Обтекай.
Пфффф, я долбоёбам пол дня доказывал, что их погромисткий компилятор хранит значения одной и той же переменной в двух разных местах (в двух разных ячейках памяти, либо в двух разных регистрах) и только из-за этого, что их погромисткий компилятор занимает большую величину памяти, и получается в выражении i = ++i + ++i нечётное число, блять, один их этих уебанов, чтобы доказать мне, что их компиллятор не занимает доп. пространства и что он более оптимизированный, что это просто "последовательный", блять хуй пойми что, и чтобы доказать мне, что моя ассемблерная вставка неверна, приносит свою ассемблерную вставку, где чётко указано, что одно значение одной и той же переменной сначала хранится в регистре ах, а другое значение, блять, той же переменной, хранится в регистре сх, после чего два этих значения складываются.
Блять, этим дегенератам приносишь ассемблерную вставку, где переменная занимает один регистр, долбоёбы, приносят ассемблерную вставку, где эта переменная занимает уже два регистра, и, сука, говорят, что их код более оптимизированный...
Я в ахуе!! Это настолько толсто и дегенеративно, что мне, на самом деле, страшно, что у нас растёт вот ЭТО, и что вот ЭТО, пытается в язык программирования Си! ЭТО даже не пытается признать, что ОНО не право, ОНО просто приносит на похуй толстоту, и думает, что эта толстота прокатит!! Полный пиздец!!!!!!
> Когда уже начнёте читать а не кряхтеть?
ты сам и не читал, открываешь блокнот, пишешь на си то, что там есть и получаешь итоговую прогу, компилишь тем же mingw
Ой блядь. 12
Переменная и побочные действия это разные вещи и побочные действия могут происходить в любом порядке. Значит первое побочное действие присваивание в i 5 + 5 и потом 2 инкремента
Как она может 12 выдать? Она двенадцать выдаст только в том случае, если приоритет операции у сложения двух аргументов будет выше, чем у инкримента, т.е. это, либо приоритет бинарных операций преобладает над приоритетом унарных операций, либо просто у только одного сложения приоритет выше, чем у инкримента. Но это не побочное действие, а правило, которое зашито в компилятор. Если ты пользуешься не шизо-компиляторами, а нормальным компилятором, то он никогда не выдаст ни 12-ти, ни 13-ти.
Если ты не будешь таким же тупорылым дегенератом, который доказывал, что его шизо-компилятор, который хранит одну и ту же переменную с разными значениями и в разных местах, лучше, чем gcc, то никаких подводных, потому что в любом случае обзаведёшься очень большим пакетом полезных знаний, которые сможешь применять где угодно, слегка модифицируя подход. Ядро это же база, от которой всё исходит.
>Как узнать, что вам пишет погромизд? Этот даун всегда пытается впихнуть стену текста в одно предложение.
этот обоссыш ещё и правила русского языка не знает
Ещё раз блядь, у инкремента приоритет всегда выше чем у сложения. И он возвращает ровно то же число. То что число ещё и увеличится на 1 это побочный эффект. Приоритет у них не определен вообще. Присваивание это тоже побочный эффект. Поэтому инкременты дали 5, 5 + 5 равно 10. А затем происходит два инкремента
Чел, блять, как же вы меня уже заебали, сука, два долбоёба, блять!!!!! Кто определяет, что у унарных операций приоритет выше? Если у унарной операции приоритет выше, то как это всё, что ты описал, своими долбоибическими ручками, блять, с побочными эффектами и хуектами долбобоибического твоего мозга, может получится? Ты просматривал, хоть, блять, краешком своего долбоибисеского мозга те ассемблерные вставки, что кидали аноны? Блять, долбоёб, мы даже эти две ассемблерные вставки особо подробно разобрали для самых долбоибических владельцев самых долбоибических мозгов, сука!!!!
Сука, тварь тупорылая, ответь на простой вопрос - кто определяет приоритеты операций?
про 2 и 3 знаю, а вот первое реально годнота, спасибо. Но вопрос все же стоял о специальности
>специальности в ВУЗах, после которых можно работать на АСУТП
Инженегр АСУТП и называются, лол.
Ну значит у меня в городе таких просто нет, потому что по известным вузам посмотрел, ничего такого нет
>>587384
Бумеры такой простой вопрос неосилили, нагуглил.
Статья https://www.transmissionzero.co.uk/computing/win32-apps-with-mingw/
Код https://github.com/TransmissionZero/MinGW-Win32-Application
>>584908 - кун
> Бумеры такой простой вопрос неосилили
чел, у меня mingw в папочке валяется и notepad++ и я пишу трехмерные приложения на си
качать тут https://winlibs.com/
Набредал на винлибс, так и не понял зачем он если mingw тупо ставишь и всё компилит/работает
обычно предприятия просят любую инженерную корочку
У меня "информатика и вычислительная техника" специальность называется, но ТАУ и железки в том или ином виде присутствуют. Это от специализации зависит уже.
потому что там тупа скачиваешь даже и ничего не ставишь и поддержка MinGW-W64 получше
win 10, vs studio 2019, wdk под вин 10 на обоих машинах стоит идентичная версия. На третьем скрине обозначил желтым ту область которая с ошибкой на первом пике.
Что я делаю не так? Может в .inf файле что подредактировать. У меня там секции install и uninstall помечены как .NTamd64
Ну типа {Install.NTamd64] ну собсна такая платформа у системы на которой я тестирую драйвер и есть.
Я гуглил эту ошибку кстати, там написаны общие причины что типа повержденные файлы программы, недостающие файлы и т.д. перезапись в памяти процесса и т.д. Мне кажется что раз программа завершается из за вероятно недостатка каких-то данных, то там скорее всего в .inf файле какая-то хуета. Там этих версий и стандартнов под каждую версию ногу сломит. Может есть здесь опытный анон что драйвера пишет под винду, да поможет.
Суть вопроса - есть ли какието конвенции на этот щёт
отладкой выясни какие диапазоны
Погугли сорцы, там ULONG
>>592913
>>592946
>>2592924 → (You)
Решил проблему.
Нужно удалить тестовый сертификат который выдан для драйвера на тестовом компьютере из store сертификатов в двух местах
certutil -f -delstore ROOT серийный номер сертификата
certutil -f -delstore TrustedPublisher серийный номер сертификата
После этого все заебумба работает.
Написал, мало ли кому пригодится. А то в интернете на форуме у многих людей темы так и остались открытыми висеть на многие годы. Короче это сертификатная проблема, решается просто перепропиской тестового сертификата для драйвера в двух хранилищах.
Задача состоит в том, чтобы ввести двузначное число и помножить друг на друга его цифры. При запуске дает ввести число, но дальше прога просто выключается.
Хз, как этот долбоёб с отладчиком себе представляет то, что ты написал, но этот анон >>594471 допустил явную ошибку по невнимательности, поэтому зря ты ему так просто подсказал, где он ошибся, - за такие тупые ошибки надо наказывать, пускай дрочится долго-долго. Либо, если невнимательный, то пускай уже сразу начинает изучать отладчик, тем более, скорее всего, этот анон изучает Си не под Линуксом, а в винде, следовательно, пускай накатит какую-нибудь идэешку со встроенным отладчиком и дрочит их (идэе с отладчиком) до опупения, пока сам не начнёт выявлять такие тупые ошибки.
Я знакомиться с С начал только вчера. Пишу на питоне в основном.
Да дебагер вообще не нужен. Не нужно хуйни писать просто, ну или фиксить ошибки в программе методом пристального взгляда. Немногие это понимают.
& это операция взятия адреса переменной (или можно сказать )
Ты передавал переменную по значению. А эта функция подразумевает, что ты передаешь адрес переменной, в которую будет записан результат.
Таким образом, она ожидает грубо говоря 0x612332b23, а ты ей передаешь 5 (или другой мусор, так как она неициализирована). Программа пишет данные по рандомному адресу, ОС ловит попытку записать вне разрешенной страницы и программа падает.
*или можно сказать указатель на
От души, анон
зачем вообще IDE древним пользоваться? при компиляции через консоль тебе бы сразу показали ошибку
Карго-культ ООП, хули.
как меня заебали эти адепты кала под названием ооп, которые пытаются везде это впихнуть. Кстати видел как один человек на полном серьёзе говорил про инкапсуляцию в Си, и что хедеры можно интерфейсом считать..
неактуально, ооп умирает и это факт, все новые языки которые выходят это процедурщина
> все новые языки которые выходят это процедурщина
Например?
получается не зря я в сишечку вкатываюсь?
Например я преувеличил(напиздел), чтобы показать неважность ооп. Да забей никому это ооп не нужно, вон там го, раст, zig какой-нибудь все они процедурные. Даже если эти языки что я и перечислили используются 1.5 людьми, это уже показатель что ооп языки щас никто новые не делает, ну какие там щас ооп языки в моде? C#, Java(которая уже вот-вот), все остальное уже мертво давно
Ты прав, но и ему скоро придёт конец я гарантирую, пузырь уже лопнул осталось немного подождать и скоро javascript разработчики будут получать не больше офисных
Они не процедурные.
я тут подумал что раз все мои манямирки разрушены, то хуле толку держатся за последний
я готов опуститься на дно ебаное, в самую низушную низину к червям пидарам и гречневым байтоебам за два мрота
принимайте пополнение так сказать..
ну и платиновый вопрос - посоветуй справочник на одну-две странички чтобы сходу въехать в это дерьмо
меня все устраивает, я же на нем работаю
привет братишка! я тоже решил вкатываться
но тут походу сидят чванливые престарелые пидарасы и просто ебливые додики дрочеры без задач
давай вкатываться вместе! :3
Пока приходит в голову только извращение с обёрткой функций с компилируемым кодом в форме inline assembly в какие-то макросы и дальнейшим его копированием без пролога/эпилога куда мне надо.
>сильно ли она нужна, если нужна, то какие темы?
нет, не нужна, если только конкретно твоя специфическая задача не завязана на этом
> Что использовать, если нужно написать компилятор для простого языка под x86_64?
лучше llvm
И чё тут разбираться. Любой школьник за вечер осилит.
Это копия, сохраненная 2 марта 2023 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.