Это копия, сохраненная 4 августа 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 помогает читать сложные сишные декларации.
Прошлый: >>2599695
Пик-1:
Состояние регистров после проверки условия в switch, и перед началом расчёта адреса инструкции, на которую надо прыгнуть по условию, которое сформировано в switch.
Пик-2:
Состояние регистров после того инструкций (красными чёрточками показываю какие регистры изменились):
lea rdx, [rax*4]
как я понимаю в rdx записалось значение, на которое нужно будет увеличивать указатель, который записывается в rax следующей инструкцией
lea rax, [rel 0x560c7280f078]
т.к. переменные у меня типа int, а в условии switch значение равное 11-ти, то в rdx записывается значение 44, типа указатель нужно будет увеличить на 44.
Пока всё ясно, типа, как подсказал мне гугол, что при компиляции gcc создаёт таблицу с адресами, в которые записываются условия из switch/case.
Пик-3 и Пик-4:
Мне вот этот момент непонятен: типа, мы взяли адрес начала таблицы (не знаю, наверное, это не точно, потому что я не допираю для чего мы используем значение и что это за значение, которое у нас в регистре rax на пике-1) 0x560c7280f078, прибавили к нему 44 и получили то, что в регистре rax. Т.е. у нас есть указатель, который указывает на начало таблицы, к нему мы прибавляем 44 и получаем другой адрес, из которого мы берём значение и заносим его в eax, потом мы знак этого значения расширяем до rax, после чего значение fffffffffffff3a1 прибавляем к адресу (как мне кажется начала таблицы) 0x560c7280f078, после чего получаем конечное значение, которое у нас в rax на пике-2, по которому и прыгаем.
Но нахуя мы прибавляем два разных значения к одному и тому же адресу, это, во-первых? Во-вторых, что значат тогда 44 и fffffffffffff3a1?
Значение в ах отрицательное.
Назуя тебе и нам листинг без адресов?
Смотри cc -OS -o - с метками и коментами от клопилятора.
https://www.youtube.com/watch?v=pSvSXBorw4A
Си-параша это буквально дементивный дед языков программирования
Как же у скриптомакаки печёт то!! Любо дорого это лицезреть! Очень много книг про фундаментальные алгоритмы, про криптографические алгоритмы, про низкоуровневое устройство компьютера, про кибербезопасность когда будут написаны на этих ваших растах и цыгах, вот тогда и приходите. А сейчас извольте в первую очередь изучать язык Си, чтобы не быть скриптомакакой, коей вы являетесь.
>Как же у скриптомакаки печёт то!!
Старпер, у тебя галюны после валидола начались?
>Любо дорого это лицезреть!
Пока лицезрел, пустил подливу.
>Очень много книг про фундаментальные алгоритмы, про криптографические алгоритмы, про низкоуровневое устройство компьютера, про кибербезопасность когда будут написаны на этих ваших растах и цыгах, вот тогда и приходите.
Делирий или маразм.
>А сейчас извольте в первую очередь изучать язык Си, чтобы не быть скриптомакакой, коей вы являетесь.
Мания величия оподливившегося маразматика.
Да не отвечай, у этого макакошиза очередное обострение. Он сюда залетает периодически.
Да, я знаю, анонче. Это я больше не для него ответил, а для "юнцов" этого треда, которые могут повестись на этот его дегенеративный скрипто-макакный байт.
Из-за чего такая разница в производительности между растом и це? С чем это связано? Я думал раст это просто безопасная надстройка над си. Ну и ещё не понятно, по какому признаку измеряется производительность.
А си это просто безопасная надстройка над ассемблером.
Забей!! Это уебанский тест!!! Тем больше упрошений (для человека), тем больше приготовлений нужно сделать компьютеру, т.е. тем больше машинных инструкций нужно выполнить, прежде чем дойти до самой программы.
На си пишут реально дементивные. Я сначала пошутил, но теперь как-то не по себе даже.
Что за шутки такие скрипто-макакные, которые нужно объяснять, и говорить, что это на самом деле шутки? Может, просто ты обдристался и тебя обоссали, и может больше так не надо делать в этом треде?
И я о том же.
>Это винда? Какой компилятор? Можешь показать код?
Это убунту, компилятор gcc, код прикладываю:
https://pastebin.com/ENdcGLDy
Это я просто в отладчике edb дизассемблю и изучаю Си.
>>14777
>Смотри cc -OS -o - с метками и коментами от клопилятора.
Можешь это разжевать, пожалуйста?
Прикладываю новые скрины с адресами. На пике 2 отчётливо видно, что мы прыгаем на адрес 00005653:bd280424, как раз тот адрес, что и указан в rax, только без двоеточия.
Нет, в этом треде подсказали, ну не прям подсказали, а был спор насчёт того, что в итоге получится (i = i++ + i++, при изначальной i равной 5), и там чел задиассемблил и всем всё стало ясно и спор прекратился. А я в этот момент как раз пыжился над одной функцией, и всё никак не мог понять, как она робит. Поэтому я также задисассемблил её и мне всё стало ясно.
Поэтому я временами дизассемблю различный код на Си, когда непонятно, либо, когда (как в этот раз), просто интересно как оно работает на уровне машинных команд.
Звучит неплохо. Просто иногда компилятор такое может сгенерировать, что по итогу больше смуты введёт.
>иногда компилятор такое может сгенерировать
Хз, это явно не про этот случай. Я уже несколько раз пересобирал код, и дизассемблированный код ничем не отличается, только в тех местах, что я менял.
>Звучит неплохо.
Вообще, если заинтересуешься этим способом, то советую отладчик ddd, если ты на линуксе. В нём, под основным окном с сурсом Си, можно включить окно с машинными инструкциями, и видеть, при каждом шаге на Си, на какую инструкцию прыгает твоя программа. Т.е. ты можешь чётко видеть границы твоего кода в машинных инструкциях. Плюс ddd построен на gdb, поэтому можно ещё и навык пользования gdb прокачивать. Правда, в этом отладчике ебала с отображением инфы в регистрах, в памяти, в стеке, поэтому я первым делом "разграничиваю" код, а потом иду в edb (когда не хочу ебстись с командами gdb), чтобы присмотреться к нему более детально.
Мне кажется, что я допёр до того, что делает gcc со switch/case: сначала он присваивает каждой инструкции адрес, затем он создаёт таблицу куда заносит разницу между и самой инструкцией и началом таблицы, которая должна выполнится при условии в switch. Расстояние между ячейками в таблице равно 4 байтам. В этих ячейках располагается отрицательное значение, которое соответствует разнице между инструкцией, которая должна выполниться по условию, и началом таблицы. Начало таблицы с адресами всегда располагается после ф-ции main, поэтому и в ячейках таблицы располагаются отрицательные значения.
Т.е. мы сначала узнаём то, что у нас получается в условии (т.е. в моём случае месяц), далее мы полученный результат умножаем на четыре, прибавляем к указателю на начало таблицы, берём из нужной ячейки необходимую разницу, затем мы расширяем её знак до 8 байт и прибавляем к началу таблицы. Теперь понятно, почему мы два раза прибавляем разные значения к одному и тому же адресу.
*быстрофикс
Мне кажется, что я допёр до того, что делает gcc со switch/case: сначала он присваивает каждой инструкции адрес, затем он создаёт таблицу куда заносит разницу между самой инструкцией, которая должна выполниться при условии в switch, и началом таблицы. Расстояние между ячейками в таблице равно 4 байтам. В этих ячейках располагается отрицательное значение, которое соответствует разнице между инструкцией, которая должна выполниться по условию, и началом таблицы. Начало таблицы с адресами всегда располагается после ф-ции main, поэтому и в ячейках таблицы располагаются отрицательные значения.
Т.е. мы сначала узнаём то, что у нас получается в условии (т.е. в моём случае месяц), далее мы полученный результат умножаем на четыре, прибавляем к указателю на начало таблицы, берём из нужной ячейки необходимую разницу, затем мы расширяем её знак до 8 байт и прибавляем к началу таблицы. Теперь понятно, почему мы два раза прибавляем разные значения к одному и тому же адресу.
https://github.com/QSPFoundation/qsp
struct foo {
...
} х_fieldname;
Это я пару лет назад вытянул определение из другой структуры, чтобы поднять читаемость. Сука. И главное, никто не может предупредить о таком. 100% легальный С.
Bindings/default/default_control.c
Строка 374 вроде, явный инит, в мейк тоже входит.
Хотя где Мэйн сам не ебу, с телефона смотрю.
>П - производительность.
Видос не смотрел, но вангую классику растоблядей.
>код на Си написан через очко
>код на расте вылезан и используется специальная структура данных под задачу
Ты просишь без должного уважения к старшим! Без должного внимания к нам! От чего мы должны помогать тебе?
Прости деда, что давно не звонил, замотался совсем. Заеду летом к тебе, посидим, поговорим нормально, а сейчас помоги пожалуйста.
Вот main, но что дальше я хз. Нужные более уважаемые (более старые и опытные) аноны.
https://github.com/QSPFoundation/qsp/blob/master/qgen/source/main.cpp
Передаю в функцию в качестве параметра указатель на структуру
struct sockaddr_un paddr
По ману эта структура объявлена как:
struct sockaddr_un {
sa_family_t sun_family; / AF_UNIX /
char sun_path[108]; / Pathname */
};
Далее я делаю дебаг принт:
printf("%s\n", paddr->sun_path[1]);
и получаю сегфолт
А если делаю так:
printf("%s\n", paddr->sun_path + 1);
то сегфолт не получаю. Почему так?
Мне нужно напечатать sun_path не с нулевого байта а с первого, т.к. юзаю unix domain socket abstract namespace , где 0-й байт всегда 0
Я бы сначала в gdb посмотрел с точкой останова перед сегфолтом, че там у тебя происходит. Глянь, мб сразу понятно станет.
paddr->sun_path - указатель на область памяти с 108-ю байтами.
paddr->sun_path[1] - ты передаешь конкретный ascii знак
paddr->sun_path + 1 - ты передаешь адресс смещенный на 1 байт вправо
Принтф ждет от тебя указатель на строку, ты ему передаешь знак, он пытается использовать полученное значение как адресс и естественно сегфолтит
Я не он, но как тогда лучше поступить в таком случае, если необходимо принтить этот массив?
В цикле через putchar() нормально будет?
функциональщиков - нахуй
Благодарю, чет думал что "arr[1]" и "arr + 1" в С - это одно и тоже, типа сахар.
Почему адрес первого элемента берется, а не нулевого?
&paddr->sun_path[0] тогда уж должно быть?
Понял. И ласт вопрос, а если я не уверен, что у меня там есть символ конца строки, то лучше в цикле выводить посимвольно?
Ну в смысле что printf или puts требует наличие символа конца строки ведь, а если его нету то он будет дальше принтить.
> если я не уверен
Тогда си не для тебя.
Можно плюхнуть \0 в конец массива перед выводом, но это так себе выход.
Понял. Бтв щас проверил, если создать массив из 8 элементов типа char и заполнить первую половину случайными символами, а вторую половину оставить как есть, то puts выведет только первую половину, хотя \0 я в ручную не добавлял. Пробовал два варианта, инициализировал через char mas[8]; и char mas = (char ) malloc(sizeof(char) * 8); а потом первым 4 элементам массива присваивал значение.
Печатает только то, что я присвоил почему-то.
Макаба съела два указателя, ну там и так вроде понятно где.
Глобальный массив инициализируется нулями по старту, с маллоком просто повезло, там может быть любой мусор.
Скачал я от JetBrains -> Clion, но эту херню уже не купить из РФ (или может какие не замороченные варианты приобрести лицензию?).
Единственным более менее нормальным вариантом под Linux я так понимаю остается VS Code?
Вывод я сделал исходя из популярности, хотя сам не особый поклонник VS..но куле делать.
Eclipse или Qt глянь, мб понравится.
> Какую IDE лучше использовать под Linux?
https://www.jetbrains.com/fleet/download/#section=linux
https://www.eclipse.org/
https://netbeans.apache.org/
>>19286
>остается VS Code
Это редактор кода, не IDE.
Есть из редакторов ещё:
https://www.sublimetext.com/
https://geany.org/
Все говно. Это буквально кусок винды на бесплатных костылях из жевачки гну. Выбор только между емаксом и вимом.
браузер и есть, электрон же
ага, да. большинство фич "изкаропки" мне нах не сдались. кроме кодкомплетинга, древа файлов и консоли от иде никогда ничего не было нужно. для дебага использую valgrind и немного gdb.
все иде что я пробовал пиздец тормозные (даже с моими 20гб озу). плюс у каждого языка есть свои, а вим один
> Штааа, писать код в интерпретаторе лиспа? Ахахаха!!
А тут-то что смешного? Ну разве что лучше в нем писать на лиспе.
1. nerdtree
2. vim-lsp для clangd/ccls. ещё есть vim-lsp-settings, его не пробовал, он сам ставит и настраивает lsp сервера
предлагаю тебе написать 2-3 без плагинов полностью. Почувствуешь себя человеком
cflow ругается на любую рекурсию
Дед в треде. Пишу в виме много лет, никаких плагинов не пробовал. Я даже не могу заставить себя использовать метки для перемещения.
Включи предупреждения от компиятора. Прочитай их.
enum по умолчанию беззнаковый.
> 1 - TWO > 0
В стандарте не прописано переполнение, поэтому это UB.
> В стандарте не прописано переполнение, поэтому это UB.
Переполнение беззнаковых четко определено. Сравнение интов происходит беззнаковое, если одна сторона беззнаковая.
Типа, если я в самом коде, не даю возможностей для изменения переменной при запуске программы, она ведь и так не изменится. Зачем тогда нужны константы?
чтобы ты, например, случайно сам не очистил указатель на константную область памяти. Это больше для программиста
Костыли компилятора для сокращения ошибок программиста, к самому исполняемому коду это не относится.
Вот взять например строковые литералы: "тут текст", это адрес на память только для чтения, если случайно туда напишешь, может быть ошибка нарушения доступа (access violation). Поэтому, при попытке присвоить простому (не константному) указателю строковый литерал, компилятор ругнется. Короче, защита от дурака, просто компилятор нянчится ругаясь на типовые ошибки, хотя это конечно может быть не ошибка, а сделано намеренно, но тогда уже сам себе хозяин.
> к самому исполняемому коду это не относится.
Справедливости ради, глобальная константа (число пи) будет одна на всю программу, а копии литерала могут оказаться во многих объектниках и в бинаре, если компоновщик не дозуя умный.
Разговор был вроде про константы. Нет константной памяти куда нельзя писать, нет константных указателей по которым нельзя писать, таких вещей не существует. Память бывает защищена и выдаст ошибку при обращении, но само обращение всегда возможно, не бывает такого что нельзя.
Поэтому константы это лишь маркеры на уровне исходных текстов для программиста, к коду это не относится. Ошибка констант это не ошибка кода, а просто защита от неправильного (по мнению программиста поставившего маркер) использования кода. Это просто маркер для себя, как например закладки в тексте. Вот ты читаешь книжку и расставил закладки, но в книге, в рассказываемой истории которую ты читаешь закладок нет, это метаданные чисто для читателя, для удобства чтения только. Так же и константы, в коде их нет, это мета-костыли на уровне редактирования кода только.
Напиши коротенькую программу, в которой будут использованы переменная и константа, и задисассембли эту программу, и посмотри что происходит.
ничего не будет происходить, в том же си можно спокойно менять константный указатель, а это значит что в исходных текстах констант не существует
Да, анонче, ты прав! На уровне машинных команд конст ничем не отличается от обычной переменной (пик 2), только компилятор ругается, когда ты пытаешься записать в область памяти, которая выделена под конст (пик 4).
> Нет константной памяти куда нельзя писать, нет константных указателей по которым нельзя писать, таких вещей не существует.
Молодой падаван, ты еще не видел МК и ДСП.
https://ideone.com/8GEFZN
>код на расте вылезан и используется специальная структура данных под задач
мне всегда казалось что обратное это ошибка на равне с высратым на свет творчеством питухониста
впрочем наверное просто нормально написать код на расте тут приводилось в качестве противовеса высратому на свет творчеству питухониста но на языке си
я обрыгал сам себя, спасибо мне, расходимся тут не на что смотреть
полагаю как минимум твой Cell[][] это символ в который ты пытаешься запихать строку "#" а в строке 2 символа, тобишь это массив символов, наверное еще с новарнингами пишешь, а так бы компилер тебе сказал что ващет негоже так класть одно в другое
почему на 24 строке мне кидает варнинг и просит кастануть поинтер к моему типоразмеру (6 байт) если целевое поле структуры такого же типоразмера (6 байт)
ведь поинтерам без разницы какой тип данных в них пишется или читается, им важен типоразмер, сколько байт за раз мы читаем или пишем
так вот почему варнинг то?
не обращайте внимания, это учебная программка по структуркам для одной девочки, которая учит си
Да, анонче, понимаю, что это нехорошо, но пока меня это не напрягает. Может ещё посоветуешь что-нибудь, что можно сделать, чтобы некоторые программы (например, ddd) работали бы нормально под обычным пользователем, а не только под рутом?
Я запускал и с помощью sudo, и в файлу sudoers ковырялся, но всё равно что-то не получалось. Отладчик под моим пользователем как-то криво работает, а под рутом всё норм. И так, кста, не только с ddd. Мб, я криворуко всё это настраиваю.
На уровне компилятора -- нет, в лучшем случае есть костыли, которые детектируют опечатки и всякие очевидные ошибки вроде = вместо ==, но они обычно работают в виде подсказок и за тебя текст не редактируют. Может можно сделать их более агрессивными, типа чтобы они при сохранении файла исправляли, есть же форматтеры, которые при сохранении файла запускаются. Но это все равно хуевая практика, лучше поставить линтер и смотреть что он пишет перед запуском кода. В IDE линтер по дефолту должен быть включен.
https://pastebin.com/Mtq0mwhb
Этот цикл остановится на 4-м шаге (когда u и v будут указывать на 4), но почему, после завершения цикла, u и v будут указывать на следующие (за 4-кой) элементы массива?
Люди памагите прошол целый день, а программа до сих пор сама себя не исправила капец!
Так, если вайл получил фолс, тогда как могут операторы отработать? Вайл получил фолс, т.е. цикл закончился, значит ВСЁ!, идём дальше.
Операторы не в теле цикла, а в проверке условия, они в любом случае отработают, потому что выражение исполняется для проверки.
Ладно, не буду вас мучать! Операторы первым делом берут адрес следующего значения lea rdx, [rax+4] и записывают его по адресу, где хранится указатель, а только после этого сравнивают текущие значения, после чего, если они не равны прыгают в начало цикла. Поэтому и получается, что на выходе из цикла мы имеем указатели, увеличенные на единицу.
lea rdx, [rax-4] это для v
Где и какие числа? Распиши подробнее вопрос, я часика через два освобожусь и тебе отвечу.
мимопрохожу
постфиксные операторы сначала отдают значение а потом вычисляют инкремент
таим образом
int i = 0;
printf("%d\n",i++); //напринтил бы 0 а после принта i = 1
printf("%d\n",++i); //напринтил бы 2 а после принта i = 2
только ради тебя анончик залил
https://pastebin.com/YFK15VQW
а вообще мне кажется я сам догадался в чем варнинг
в поле структуры висит массив, а по механике у массива то же есть поинтер типоразмером в одну ячейку (1 байт это же чары) и крч он волнуется что типоразмер ячейки массива не совпадает с типоразмером поинтера который смотрит на массив
я тут кое что увидел в твоей программе
для ii по фору не задано условие брейка (не уверен может специально)
а вообще чо так сложно написано то?
куча библиотек
размер массива стрленом вычисляется
ладн я придираюсь потому что я люблю писать без зоопарка библ стандартными средствами
например вместо стрлен что нибудь такое sizeof(word)/sizeof(char) но делить на сайзоф чар не обязательно, размер чара 1 байт
какой нить сканф заместо гетча
все, ладно не бубню
Речь о машкоде после коньпеляции. Сначала апдейтит указатель, а потом уже берёт текущее значение.
ты всегда можешь делать асмавставки для мануального управления, если тебе не нравится как работают эти операторы
просто напоминаю
>>39239
еще хотел сказать пару слов
в книге Крнигана и Ритчи как раз есть галава где обсасываются строчные лагоритмы над массивами чаров, ну там апперкейсы ловеркейсы и все такое и как они устроены на каких принципах
так вот довольно легко понять что внутри чаров или интов или других переменных лежат только нолики и единички, по сути как ты эти нолики и единички представляешь зависит только от тебя, можешь работать с символами как с числами напрямую
например
char c = 'a';
c = c + 20;
printf("%c -> %d\n",c,c); // выводим с как символ и с как число
Анон, в корне ничего не меняется, только в регистры, которые в последствии сравниваются помещаются не указатели, а числа. Но суть остаётся той же:
мы сначала в edx помещаем текущее значение (для а) mov edx, [rbp-8], затем помещаем в rax значение а увеличенное на единицу (при этом значение в edx остаётся текущим, т.е. 0) lea rax, [rdx+1], после чего мы увеличенное не единицу значение заносим в область памяти, которая выделена под а mov [rbp-8], eax. Затем тоже самое, только с уменьшением на единицу, происходит с пtременной b , только её текущее значение заносится eax. Ну и после всех манипуляций идёт сравнение текущих значений a(edx) и b(eax) cmp edx, eax, и если не равны, то прыгаем в начало цикла.
не, понятно что сожрал, ведь код запощен без ошибок и со всеми явными кастами, в нем нет ворнингов
но если убрать каст к типу поинтера в 24 строке будут варнинги, я про это писал
компилер не знаю какой в икскоде, гцц наверн то же с99 стандартом копилит с11 нет в икскоде ну в моем нету
Ткни меня сейчас в какой строке у тебя ворнинги были, а то 24-я строка на пастебине у тебя сейчас пустая.
а, да, извини, там же в начале студия еще комменты печатает несколько строк
на пастебине это 17 строчка
объявление поинтера и его инициализация адресом поля
Ага, понял! Завтра поковыряюсь, сейчас как раз struct изучаю.
OpenGL жешь
а для рисования нативных окошечек и оконных приложунек windows.h
еще когда то давно я писал на Qt, но я бы не назвал это графической библиотекой, скорее это обертка над плюсами для упрощения всякой кастующейся фигни по типу обработки событий по дескриптору
а вообще философия си как бы намекает - сделай сам себе тот же транслятор CSS или Lua или MD или любого другого самописного скриптового языка при помощи которого ты опишешь графику в окне консоли или в окне виндов мэнеджера
в защиту такого способа я бы хотел напомнить что все 3 набора библиотек под жабку абсолютно нерелевантны до тошноты
если с точкой все предельно понятно, то вот с линией не все так однозначно
да и вцелом мнение о том что в консоли пишутся какие то учебные программы а настоящие проекты это только работа с пикселями - неправда. на самом же деле разница лишь в средствах отображения вашей графики, в консоли аналогами пикселей будут служить символы (конечно со своими особенностями, символы консоли не квадратные и разрешение консоли то же не квадратное, поэтому для корректного отображения например круга или сферы нужно будет это учитывать). аналогично написать графику можно вообще не используя монитор, например через контроллер электрощитка здания, где аналогом пикселей будут служить окна на фасаде и включенный или выключенный свет в помещении. в общем зависит только от вашей фантазии.
но так или иначе написать тот же рейтрейсинг в псевдографике это задача того же уровня как и написать рейтрейсинг в полноценной игре, все рассчеты абсолютно такие же до момента вывода на "экран", разница начинается как раз в слое обработки при выводе на то или иное устройство вывода
а нет, фигню сморозил
А ты задебажь и посмотри в чём дело. По шагам пройдись и тогда станет ясно.
>WORDSIZE - 1
Шифр Цезаря?
Как по мне, дело в регистре букв. Ты задал для сравнения только большие буквы, а запрос написан маленькими
>На си пишут реально дементивные
А как дело обстоит у скриптомакак при прямом обращении к ПАМЯТИ?
Тише, ты чего?? Эта скрипто-макака только угомонилась, зачем ты её опять ворошишь?
Ну, получается что ни одна буква не совпадет, значит ни одна буква не должна сместится
Неа. Это особенность компилятора новарнинги короче. К примеру, если ты создашь массив, и выведешь его в неправильном диапазоне, он будет выдавать случайные символы юникода в произвольных местах
Кстати, анон, если интересно, то вот так выглядит условие с префиксными инкрементом/декрементом. Отличие в том, что переменные увеличиваются/уменьшаются и полученные значения сравниваются, т.е., если с постфиксными инкрементом/декрементом сначала идёт запись текущего значения в регистр, после чего увеличенное/уменьшенное текущее значение записывается в область памяти переменной, и уже после этого происходит сравнение текущих значений, то в условиях с префиксными выражениями происходит сравнение сразу увеличенных/уменьшенных значений.
объясните мне кто нибудь почему массив на пике проинициализирован вот так?
почему 'Z', } что это за пустое пространство после символа Z? это компилируется как '\0' ? наверное нихуя ведь нужно явно фигануть туда 0 или \0 как символ
ну я не буду придираться к методу инициализации, можно было канеш просто строкой инициализировать массив с авторазмером например
Alphabet[] = "XYZ";
или повесить поинтер на сегмент текста где будет висеть константная строка например так
char* Alphabet = "XYZ";
просто держать в голове что у строки в конце допсимвол '\0' вотличие от натурального массива символов
дальнейшая работа с этим ничем не отличается, точно так же в Alphabet[0] будет лежать 'X' если вытаскивать в виде символа
но я не понимаю что за пустое пространство после Z что это означает?
Я очень тупой человек.
Как выводится 10-чное представление числа из памяти ЭВМ? Там же все представлено в 2-чном коде.
Условно, у нас есть 20байтовое число в памяти , как компьютер выведет его 10чное представление?
В десятичной системе счисления
И ещё вопрос, когда мы вводим число с консоли это же просто на просто текст условно:
int a;
scanf("%d", &a);
А как он переводит это значение в двоичное для хранения в памяти ЭВМ?
20ти байтовое целое можно пушнуть в канал вывода при помощи поинтера с шириной шага 20 байт, в стандарте таких длинных типов нет поэтому что то навроде такого будет
typedef struct {
_Bool b[20];
} pointer;
pointer p = &a;
printf("%lld\n", p);
но я не уверен, %ll умеет в вывод long long'a но не в 20битное целое, а тот же puts пушит только строки, а у тебя в задаче число
интересная задачка на самом деле, пойду поломаю голову как на экран вывести число, с хранением и записью/чтением чисел так то проблем нет особых
То что ты написал выведет только 10-чное представление первых 8 байт этого 20 байтного числа
разметка макабы сожрала звездочки
я и говорю что %ll только в лонги умеет, я же это написал
ты вот лучше скажи какой спецификатор умеет в 20байтный формат
Нет такого, насколько знаю, слышал только, что некоторые компиляторы могут в 128битные числа, но это не 20байтовое все ещё, есть либы для работы с очень большими числами, так называемая длинная арифметика, на этом мои знания заканчиваются
крч я думаю на регистрах просто не хватит памяти чтобы вычислить 20ти байтное целое так что все равно надо костылить и проще всего наверное накостылить через строки раз уж вопрос с выводом на экран всяких там гиперчисел песчинок на пляже омаха
Нужен цикл, в котором через арифметику указателей мы берём единицы и нули из памяти 20-ти байтного числа и складываем их в переменную. Каждые 8 шагов (через байт) приводим эту переменную к десятичному виду и это число выводим. Только из-за литтлиндиана цикл надо начинать с конца.
Проще, конечно, использовать особенно принтфа, которая позволяет вывести 10 байт, т.е. в переменную загоняем арифметикой указателей 10 байт, приводим к десятичному виду, и после выводим.
Вот, анон, он на пустое место после Z никак не обращает внимание.
Что за ШГ?
Мужик, а ты сколько программируешь вообще ? У тебя курс информатики в школе был или ты троллишь так охуенно? Просто с твоих постов жир течёт пиздец как, ты либо не очень шаришь за математику, либо охуенный тролль, а таких тут не надо, все таки жизнь новичкам портить не надо, а то некоторые на арифметике указателей Си бросают
Не, ну критикуешь - предлагай.
благодарствую, а то чуть кровь из глаз не пошла
уже собирался дух Ритчи пробуждать и насылать проклятия на жопу
Не хочу ебать свой ССД, но требуется загрузить файлы с телеграмма на гугл диск, можно ли это сделать путём выгрузки файла в оперативную память, а позже загрузить ее из оперативной памяти на гугл диск? Файлы размером в пределах 1,5Гб
Я не буду предлагать, но ты реально думаешь что у нас число, ты его засунул в buf и если по 8 байт и вывести, то получится 10 представление это 20байтового числа?
char buf[20];
void × start = buf;
for (int i = 0; i < 3; i++, start = (char ×)start + 8)
printf("%llu", (int64_t× )start);
Ты либо программирование бросай, либо матан учи
у тебя ашипка
%llu распечатает байтпоследовательность как ансигнеды а число ты засунул в сигнеды чаров ну и про 8 байт из 20ти мы уже тут обсуждали
мимодругой анон
Да, да, я понял, что у нас разрядность нарушается.
ну типа cout << xp; ???
прост если могут то почему бы не покопать как cout реализован в плюсах и не переложить на си рельсы
https://www.cyberforum.ru/c-beginners/thread153284.html
а си тут причем?
не ну с матаном он канеш перегнул слегка
преобразованиями форм счислений занимается арифметика
не, последний символ это '\0' символ конца строки
обработка строк на этом принципе и основана
ты пихаешь в функцию адрес начала строки и функция без определения размера уже знает что в конце строки будет символ \0 и читать надо до него
например puts(conts char x) так работает да и спецификатор %s притэфа так же обрабатывается
в других вариантах переброса массивов в функцию ты вынужден передавать размер массива, функция изнутри не знает насколько большой твой массив, но только не со строками
принтани sizeof(Text)
а еще можешь принтануть числовой вариант каждого символа и сравнить с табличкой ASCII юникодов чтобы понять чо там в строку запихалось
окей это ентер, ты оказался прав, мои поздравления
а еще поздравляю тебя, ты только что научился делать юнит тесты и можешь не постить каждый вопрос сюда а провести тестирование самомстоятельно
реально
Сап программач, хочу поделиться болью. Я очень много пишу на сишке, ну и я вообще люблю низкоуровщену и поэтому на ней зарабатываю: bare metal, Linux kernel modules и прочее. На работе до определенного времени спокойно писал bare metal на сишке, потом коллектив выступил за переход на плюсы, но со стилем написания исходников «си с классами» — против этого я не выступал потому что не видел в этом смертельного. Замечу только то, что у нас нет практики постоянного code review, потому что у нас небольшой коллектив и просто нет ресурсов на регулярной основе такое делать. Когда мы использовали плюсы в си-стиле стало чуть чуть удобнее, как минимум, объекты собирали методы в свою сущность. Но недавно начался полный пиздец, потому что человек, который имеет большое влияние на коллектив предложил перейти на самые последние плюсы (темплейты, концепты, хорошо я отговорил от std::string и std::vector). Архитектура полностью пошла по пизде, темплейты теперь везде нахуй, в некоторых местах архитектура была поменяна только для того чтобы «так удобнее написать на темплейтах», интерфейс тоже стал ужасным, а сейчас я сижу на созвоне и слушаю как челы спорят о том, как лучше написать концепт. И мне было бы похуй, если мне давали делать мои низкоуровневые вещи (на уровне регистров), но нет, реализовывай наши криво написанные концепты (некоторые концепты написаны только ради того чтобы концепт был). Говоришь им что написанные концепты говно и это перетекает в 2-3х часовой созвон с обсуждением как правильно написать концепт. На вопрос: «как концепты и темплейты помогут мне реализовывать низкоуровневые интерфейсы (uart, spi и прочее)» — но кроме: «ну можно будет статически проверить некоторые куски кода» — я ничего не слышал. За то время, что я убил на все это дело, я бы покрыл все тестами, написал эмулятор и крутил бы систему днями и ночами на x86. В общем просто хотел высказать.
разве темплейты это не старый добрый си?
и разве объекты с методами это не старый добрый си?
typedef struct {
char x phrase;
void (xmessage) (void);
} className;
void sendMessage(void){
puts("idite nahuy dolboebi");
}
className Obj;
Obj.message = sendMessage;
int main(void){
Obj.message();
}
Да, классы то же самое, только методы находятся в пространстве имен класса, а твоя функция sendMessage попадёт в область видимости текущего файла. А темплейты (именно статический полеморфизм) нереализуемы на чистом си
а... ну хотите полиморфизм тогда страдайте чо я могу сказать
ооп паттерны вот это вот все говно с фабриками и вечным дебагом корявой наследственности жопы из говна а не говна из жопы, это же лучше чем pure c в котором ничо нельзя реализовать нахуй его вообще придумали говно какоето лол для дементивных как тут скриптомакака пишет
А что вы имели под темплейтами, если не полиморфизм? Еще темплейты удобны для задания параметров класса, которые не будут меняться в рантайме, например, буфер определить длину кэшурующего буфера для юарта: uart_class<256> foo(...);
я имел ввиду фразу "тыскозал?"
Управлению памятью только в итт япах можно научиться?
Тебе лучше в асм-тред сходить, и вообще почитать/покодить на асме, если хочешь понять что такое память, как устроена память, как управлять памятью.
Вот работал я с памятью только на уровне malloc(), calloc(), read() или write(), не превышая килобайта используемой памяти ща раз. А как с ней работают в больших приложениях, которые жрут по несколько гигов, типо всяких игровых движков и прочего?
>А как с ней работают в больших приложениях, которые жрут по несколько гигов, типо всяких игровых движков и прочего?
А никак. Индусы просто засирают память, пока не придумают чипы мощнее.
Пишут полезные обертки
- пул, из которого выделяют разные объекты для уровня, а потом целиком его уничтожают (защита от утечек)
- стек (вариант предыдущего)
- пул для объектов одного размера (скорость+экономия памяти)
пул это бассейн, чо несешь то, поехавший
Спасибо, еще вопрос: как напечатать символы массива, что бы один из них был большего размера чем остальные? Типа маленькие точки а потом огроменная
а ты посмотри в таблице символов под каким номером твоя огроменная точка
блондинка залетела в кодинг?
может вопрос нубский будет, я просто никогда еще не писал с поддержкой вычислений на гпу, но вот хочу спросить
если я объявляю registered float несколько штук, то на регистрах какого чипа они будут сидеть? на цпу или на гпу? и есть ли механизм как ручками выбрать нужные ргистры если допустим я хочу просчитать флоаты именно на гпу чипе?
Сап
Аноны, я тут придумал очередной сюжет игры и друг мне предлагает закодить её на Си. Есть ли годные библиотеки которые бы позволили это делать быстро и легко?
Я одно время пытался сделать игру на жс и знатно поел говна. В итоге забил. Потом ещё был небольшой опыт на джаве, там чуть лучше даже намного лучше, но тоже пришлось как следует поебаться с библиотекой и её установкой.
Короче стоит ли браться за Си? Из целей вкатиться в этот замечательный перспективный язык и сделать хоть простенькую игру.
ебашь хоть на ассемблере всем поебать
можете еще рассмотреть такие варианты
игра на фортране
игра на паскале
игра на делфи
игра на окэмле
игра на руби
в любом случае язык лишь инструмент достижения целей, а си хорош тем, что для него нет нерешаемых задач
а в чем причина такой нелюбви к си?
я вот подумываю над собственной реализацией гита потому что гит во первых тупой во вторых подпиндосский и хочу монолитный сервис, а значит либо ебаться с переносимостью, либо выбирать жабку
скорее всего я выберу жабку просто потому что на веб баунд нагрузках нет каких то заебов по скорости вычислений, а значит можно взять любое медлительное говно, главное чтобы приложунька везде работала, ну а это про жабу
но почему в играх не использовать си? там то как раз нужны сверхбыстрые вычисления в первую очередь, а переносимость уже вторична
>сделать хоть простенькую игру
Ну это ты можешь сделать на Си, а что-то более красивое и сложное лучше кодить на плюсах из-за большого кол-ва библиотек под игры на плюсах.
>в этот замечательный перспективный язык
Чел, ты должен понять, что Си это отвратительный язык, единственный плюс которого это zero runtime. Всё остальное, что пишут, особенно всё, что связано со стандартами выше С89, это ебантизм, потому что есть более удобные высокоуровневые языки программирования, с которыми пытаются конкурировать стандарты С99 и выше.
Поэтому, если ты не собираешься писать высокопроизводительные программы (всё что связано с драйверами, ядром ОСи, пизданутые числодробилки, где две альтернативы - Си со стандартом не выше С89 или ассемблер), то в Си можешь не вкатываться, либо ты можешь полгода-год потратить на ассемблер и Си (именно в таком порядке), чтобы лучше узнать то, как устроен компьютер. Этих знаний тебе будет более чем достаточно, чтобы освоить любой ЯП. Всё остальное, что будет иметь противоположную точку зрения от той, что я тебе привёл, что тебе будут писать местные петухи это от лукавого.
Чел, ты серьёзно? Регистр точки хочешь сменять, типа переводить точку в нижний и в верхний регистр? Короче, мой тебе совет это пойти загуглить, разобраться самому как напечатать "огроменную" точку, а потом прийти сюда и объяснить нам это.
>>44313
>как напечатать символы массива, что бы один из них был большего размера чем остальные? Типа маленькие точки а потом огроменная
Давай, чтобы тебя не продолжали троллить сразу отвечу.
Увеличить размер шрифта только одного символа из всей строки ты не сможешь, потому что такой функции в терминале нет. Размер шрифта меняется сразу для всей строки, поэтому у тебя остается несколько вариантов:
- смотреть эскейп последовательности для своей ОС и эмулятора терминала, а потом просто выводить нужный символ жирным шрифтом.
- если у тебя строка состоит из символов в нижнем регистре, то выводить нужный символ в верхнем регистре. При этом стоит учесть, что для символов никаких регистров не существует.
Алсо, вот как это может выглядеть на линуксе. Просто как пример.
А как, кстати, вывести то "огроменную" точку? Это получается, что нужно же её из каких-то элементов соединить? Или нужно окрашивать часть экрана?
Что значит огроменную точку? Ты задачу подробней опиши.
Можно составить массив символов по нарастанию яркости и использовать его, например, ".,-:;c3#@". Но, думаю, что для твоей задачи это не подойдет и тебе нужно просто символ юникода вставить.
Да я вообще мимироходил. Не знаю подробностей задачи. Просто стало интересно как вывести "огроменную" точку. Как я понимаю из вопроса анона про эту задачу, что у него идёт ряд точек, сначала энное кол-во обычных точек, а после этого кол-ва нужно вставить точку, которая будет больше обычных, скажем, раза в 4.
>Просто стало интересно как вывести "огроменную" точку. Как я понимаю из вопроса анона про эту задачу, что у него идёт ряд точек, сначала энное кол-во обычных точек, а после этого кол-ва нужно вставить точку, которая будет больше обычных, скажем, раза в 4.
Если для вывода используется терминал, то произвольно увеличивать отдельные символы не получится. Это тебе не ОпенГЛ, где можно умножить вектора на скаляр и изменить размер обьекта. В данном случае можно: использовать другие символы(т.е. заменить огромную точку на что-то похожее), рендерить изображение в памяти, а затем выводить его на экран(т.е. создать большую точку из маленьких точек), использовать жирный шрифт.
> рендерить изображение в памяти, а затем выводить его на экран(т.е. создать большую точку из маленьких точек)
Примерно так и предполагал.
Понял, анон, спасибо!
В кодировке Юникод символы представлены шестнадцатеричными числами, называемыми кодовыми точками. Жирная точка, также известная как точка среднего веса, кодируется в Юникоде и имеет следующий код: U+2022.
Этот символ представляет собой круглую точку, часто используемую для обозначения элементов списка или маркеров. В различных языках программирования и системах можно использовать разные способы ввода жирной точки, например, с использованием управляющих последовательностей или специальных символов, в зависимости от контекста и требований конкретной платформы.
Для вывода жирной точки в кодировке Юникод в языке программирования C в терминале Ubuntu 22.04 можно использовать последовательность управления ANSI-escape или использовать функцию printf с необходимой последовательностью Юникод-символа.
Вот пример двух способов для вывода жирной точки в кодировке Юникод в языке программирования C в терминале Ubuntu 22.04:
### Способ 1: Использование последовательности ANSI-escape
#include <stdio.h>
int main() {
printf("\u2022\n"); // Использование Юникод-кода точки
return 0;
}
### Способ 2: Использование функции printf с UTF-8 символом
#include <stdio.h>
#include <wchar.h>
int main() {
wchar_t dot = L'\u2022'; // Объявление Юникод-символа точки
wprintf(L"%lc\n", dot);
return 0;
}
Компилируйте и запускайте код в терминале Ubuntu 22.04, и вы увидите вывод жирной точки в кодировке Юникод в вашем терминале.
Обратите внимание, что поддержка Юникод-символов может зависеть от включенных шрифтов и настроек вашей терминальной программы.
В кодировке Юникод символы представлены шестнадцатеричными числами, называемыми кодовыми точками. Жирная точка, также известная как точка среднего веса, кодируется в Юникоде и имеет следующий код: U+2022.
Этот символ представляет собой круглую точку, часто используемую для обозначения элементов списка или маркеров. В различных языках программирования и системах можно использовать разные способы ввода жирной точки, например, с использованием управляющих последовательностей или специальных символов, в зависимости от контекста и требований конкретной платформы.
Для вывода жирной точки в кодировке Юникод в языке программирования C в терминале Ubuntu 22.04 можно использовать последовательность управления ANSI-escape или использовать функцию printf с необходимой последовательностью Юникод-символа.
Вот пример двух способов для вывода жирной точки в кодировке Юникод в языке программирования C в терминале Ubuntu 22.04:
### Способ 1: Использование последовательности ANSI-escape
#include <stdio.h>
int main() {
printf("\u2022\n"); // Использование Юникод-кода точки
return 0;
}
### Способ 2: Использование функции printf с UTF-8 символом
#include <stdio.h>
#include <wchar.h>
int main() {
wchar_t dot = L'\u2022'; // Объявление Юникод-символа точки
wprintf(L"%lc\n", dot);
return 0;
}
Компилируйте и запускайте код в терминале Ubuntu 22.04, и вы увидите вывод жирной точки в кодировке Юникод в вашем терминале.
Обратите внимание, что поддержка Юникод-символов может зависеть от включенных шрифтов и настроек вашей терминальной программы.
Я попробую запустить в 20.04, потому что в 18.04 и 16.04 чёт не пошла программа.
анал терминатора
Настоящий чед, нихуя не шарит, а полез в си.
Или сейчас ещё какую-то студентоту на нём дрочат?
да брось, студендота как и все вкатыну в мире дрочат ооп, а это плюсы как минимум
1C программист в треде, всем в табличку!
Ну, мне он помогает, потому что я могу смело дизассемблить любые непонятные мне функции, и, читая дизассемблированный код, лучше понимать, как эти ф-ции работают.
Во всех мануалах пишут что \b это бэкспейс, но принтф "0\b1" печатает 01. Еще пишут что \a это звуковой алерт, но он чота не звучит. Еще пишут, что \r это возврат каретки, возврат куда? Он просто с новой строки печатает как будто это \n.
В общем я ничо не понял. Объясните. Или эти эскейпы только на настоящих терминалах работают и мне надо блять купить стойку AT&T чтобы работала эта параша ебаная?
Задача напечатать символ, стереть, напечатать другой. Хочу попердолить псевдографику но не хочу раздувать хистори консоли всеми кадрами отрисовки, лучше стирать символ и печатать заного.
\r точно работает. Он возвращается в начало и можно поверху старой строки хуярить. Так делают все эти прогрессбары соснольные.
> Задача напечатать символ, стереть, напечатать другой. Хочу попердолить псевдографику но не хочу раздувать хистори консоли всеми кадрами отрисовки, лучше стирать символ и печатать заного.
https://tldp.org/HOWTO/Bash-Prompt-HOWTO/x361.html
А в каких системах эти анси трюки работают?
>\r точно работает. Он возвращается в начало и можно поверху старой строки хуярить. Так делают все эти прогрессбары соснольные.
Блять мой эмулятор терминала игнорит эту хуйню.
>Блять мой эмулятор терминала игнорит эту хуйню.
Что ты выводишь после \r? Если только один символ, то его сложно заметить.
> чтобы работала эта параша ебаная?
Пхахах, ты виндузятник?
Для отладки выводи по символу, делая fflush и sleep.
Да ничо не сложно. "0\r1" выводит 0 и 1 на разных строках. Я же говорю как \n
Ладно пойду попердолюсь, чота работает не так как должно работать.
Алсо \r и \v это экспейпы для принтеров говорят.
Уффф, анон, успокоил! Спасибо!
Хммм
А вот цвета не работают в родной консольке.
Я имею ввиду ANSI секвенции.
Для курсор позишина все гуд printf("\033[%d;%dH",L,C); отлично отрабатывает.
А вот обертка для цветов не отрабатывает.
Сама ANSI строка задается как \[\033[<COLOR>m\] и в нее на место <COLOR> мы записываем например 0;32 (это зеленый цвет)
Но как бы я не пердолил эту ANSI строку она печатает символ '[' заместо переключения цвета.
Вот теперь я думаю мой эмулятор zsh не поддерживает цветовые секвенции ANSI и надо пердолить в tty например без гуев.
Или в чем трабла?
Ну ваще выглядит так будто реально zsh не поддерживает цвета. Вывод ls никак не маркирует по цветам папки и файлы. Хмм
В общем я не знаю. На хабре пишут все гуд, в мануале пишут все гуд только для x-term'a. Но вот моя палитра "цветов" для zsh. И цветов я тут не наблюдаю.
В общем я думаю это проблема в эмуляторе, именно этот zsh не умеет в цвета и все тут. Болд, регуляр, лайт - пожалста, даже бэк залью если надо (правда только в черный), но вот цвета фигушки.
Ну и как мне блин написать реализацию cmatrix для этой залупы? Цветов то нет!
Цвета, вроде бы, нужно печатать дригим способом. Завтра покажу.
Было бы неплого, если бы ты прислал исходники
https://pastebin.com/FtVsbm2G
Держи исходник. Я тут уже с психу ебанул 0-99 значения в попытке поймать хоть какой то цвет. Но все тщетно.
Анон у меня тут undefined behaviour или что?
Почему первый символ инпута заполняет весь array?
какой аррей? пиздец конечно у тебя разметка уебанская, как будто у тебя дисплей из складного метра (пикрилейтед) состоит
у тя гетчар читает в ц, а потом если ц не 0 тогда ++ все 10 индексов аррея
нахуя тебе это я не ебу, но ты так написал
ну судя по принтам ты там какие то символы должен считать я хз
а чо это такое на скрине? пхп какой то
крч я не знаю где ты наебался анон, надо было юнит тесты хуярить на каждом шаге чтобы быть в курсе правильно у тебя считает вот здеся или нет, а ты походу нахуярил логику и ща будешь дебажить ее, удачи
потыкай шаги вайла в дебагере
алсо вот тебе лайфхак для твоих флажков фора
found != 1 это то же самое что и !found
сишник булы извлекает как 0 и как все что не 0
тобишь if(0) = if(false), if(124124124) = if(true)
хотя с интами не должно прокатывать
операция нот (!) это операция над булевыми и наверн надо кастарунть инт к улам прежде чем юзать булевы операции
!(_Bool)found
или просто флаг нормально объявить как булевый
вот на моей машине например юникод символы и вообще числа в интах ложатся в первый байт, потом после переполнения закрывается второй байт и так далее
слева направо
и я тут думаю если в первом байте инта лежит символ, то как записать в оставшиеся 3 байта число повторений (ну допустим мы уже отладили улагоритм подсчета)
допустим трехбайтным поинтером я могу пихнуть в инт число и извлечь обратно это не проблема
а вот как подобрать нужный сдвиг по адресу?
пока что не могу придумать ничего кроме как ходить по инту однобайтным поинтером до второго байта и уже с его позишена перехватывать адрес в трехбайтный для записи/чтения
есть еще варианты?
круто что нашел! молодец!
>>46735
я тут поколдовал
походу надо свою матешу писать для извлечения чисел из трехбайтной последовательности
но вот например хранение числа матчей в соседнем байте инта
https://pastebin.com/yzcBWVcY
>надо свою матешу
туплю
надо просто локальный инт создать, прочитать в него три байта которые лежат в инте массива справа от байта в котором лежит символ
затем заплюсовать локальный инт
затем записать три левых байта из локального инта на место трех правых байтов инта массива где лежит символ в первом байте
бля дохуя операций и ваще ритчи писал что есть машины с двухбайтными интами, так что такое решение через чар поинтер даже лучше
Могу ошибаться, но код ты посмотреть скорее всего не сможешь.
Ты можешь посмотреть используемые библиотеки в директории /usr/lib, например. Используемые библиотеки у скомпиленного исполняего файла можно посмотреть через readelf, а используемые системные вызовы через strace.
>и где искать этот заголовочный файл в убунте, там есть несколько заголовочных файлов stdio.h
Ты можешь посмотреть код библиотеки stdio.h, но ничего полезного кроме внешнего вызова ты там не найдешь.
Основная реализация находится в системной библиотеке libc( glibc в linux), поэтому копай в эту сторону. Исходники можно найти в интернете.
хочешь сказать что я пиздабол и сам придумал сайзофать инты заместо подстановки цыфры 4? нахуй иди долбоеб
Да. Надо было флажок нажать "показать цвета". Мои догадки про то что именно этот zsh не умеет в цвета оправдались. Именно этот и не умел.
>Мои догадки про то что именно этот zsh не умеет в цвета оправдались
Это не проблема zsh, потому что оболочка этим не занимается, плюс она является ПОСИКС совместимой. Это у тебя эмулятор терминала цвета не выводил, потому что функция отключена была.
int printf(const char х __restrict, ...) __printflike(1, 2);
#define __printflike(fmtarg, firstvararg) \
__attribute__((__format__ (__printf__, fmtarg, firstvararg)))
#define __printf0like(fmtarg, firstvararg) \
__attribute__((__format__ (__printf0__, fmtarg, firstvararg)))
Кто то может расшифровать? Это макрос или чо? И как оно работает? Как вот мне написать аналогичную функцию myfunc(int a, ...) __myfunc(1,2);
?????????
>Кто то может расшифровать? Это макрос или чо? И как оно работает? Ка
Попытаюсь обьяснить как я это вижу, так что могу быть не прав.
Это вариадик функция. Первым аргументом передается обязательная часть(fmtarg - formatting argument?), а потом передается специальная структура, которая содержит в себе произвольное количество аргументов(firstvararg - first variadic argument?)
>#define __printflike(fmtarg, firstvararg) \
>__attribute__((__format__ (__printf__, fmtarg, firstvararg)))
>#define __printf0like(fmtarg, firstvararg) \
>__attribute__((__format__ (__printf0__, fmtarg, firstvararg)))
Тут никакой магии нет, просто повышение уровня абстракций и обертка над оберткой.
>ак вот мне написать аналогичную функцию myfunc(int a, ...) __myfunc(1,2);
пикрил
Что с тобой не так челик?
printf -- функция с переменным количеством параметров
Для работы с функциями с переменным количеством параметров используется макрос stdarg, ты прав
2 байта инт был на 16-ти битных машинах, на 32-х битных машинах инт вырос до 4-х байтов, в 64-х битных машинах инт размер не поменял и остался быть 4-х байтным.
есть какие то другие команды, что бы сделать это без мигания?
Что-то подсказывает, что он делает около-аскии графику и хочет, чтобы этот процесс отрисовки консоли заново не был таким.
У меня собственно тоже такой вопрос хочу сделать АСКИИ морской бой
А хз, надо смотреть как в всяких ncurses сделано, там вроде не фликерит.
да, хочу покрутить квадрат
Да ничего страшного, мы все тут сидим и умничаем друг перед другом. Дэнис Ритчи сам написал что надо не забывать делать сайзофы инта потому, что есть машины с двухбайтными интами. Я это не придумал.
попробовал оба варианта, у меня вместо точки какие буквы вылезли. Значит терминал у меня какой то не такой или что?
предполагаю что в С константы будут заменены своими значениями мимо жс бибизян
Сам исходник подкатом.
https://pastebin.com/MhqV7p9X
Алсо вот такой вопросик возник.
Можно ли как то в сишнике инкапсулировать прототипы функций? Ну вот допустим я заинклюдил хидер и там лежать фукнции всякие. Можно ли как то сделать так, чтобы я не мог из мейна напрямую юзать функции, а только через обертки публичные? Ну крч как инкапсулировать то? Статик не решает эту задачу.
А если допустим не инклюдить, а компилить в отдельный объектный файл и потом уже мейком собирать? Тогда поидее статик ограничит область видимости до объектника и все. Разве нет?
>мертвый код
Что значит мёртвый код? Это код, который показывает как выглядит программа, что на пике 1, в виде машинных инструкций.
>REX.W movq rax,0x600000000
Я так понимаю, что интерпретатор джээс использует макросы, т.е. эта строчка, которую ты привёл, на самом деле, на каком-то этапе развёртывается в код, который похож на пик 2, поэтому и такое различие.
>Что значит мёртвый код
Это код который никогда не выполнится или который ничего не делает. По идее компилятор должен понять что main не несет никакой полезной нагрузки и просто выкинуть этот код.
>Я так понимаю, что интерпретатор джээс использует макросы
Не, это как раз строчка скомпиллированого кода аналогичной функции на js, компилятор видит что мы просто складываем статичные числа и заменяет две операции a = 3; b = a * 2; одной операцией b = 6;
Просто стало интересно почему С компилятор не делает аналогичную свертку. Может надо флаги какие-то задать?
Не странно. По умолчанию код должен быть такой какой пишешь, а всякая самодеятельность компилятора ведет к багам, поэтому это опционально под твою ответственность, если что сам себе злобный буратино.
В этом и мощь языка Си, потому что оптимизация это лишняя память, плюс лишние такты, которых может не быть на устройстве, под которое пишется код.
Уже давно на копеечном ембедде мощи больше, чем тебе надо, хуярят иотовые питоны и жабаскрипты. Это тебе к дедам на лавочке послушать про байты и такты.
Ты скозал? Чёт на моём шлагбауме, который открывается по нажатию кнопочки, я не заметил много гигабайт памяти и супермощный процессор.
У тебя и банкоматы на районе на списанных шиндовс нт, который старше тебя. Есть проблески, но проще купить готовое решение.
Банкомат, который занимает, как минимум, кубический метр, и всегда подключён к сети, сравниваешь со шлагбаумом, "голова" которого не больше 0,008 кубического метра...
Всё с тобой ясно, скрипто-макакыч.
Задачи банкомата может решать мк за полтора бакса, но функционал проверен комиссиями, стандартами и прочими капитализьмами. Купить полтора тонны сертифицрованного мусора дешевле, чем заниматься этим с нуля.
Вообще, задачи бизнеса важнее твоей технической хуйни. Как только ты это поймешь, так перестанешь быть ойти-мальчиком, а станешь солидным господином. Но ты не поймешь, т.к. ты наёмный работник, а не господин.
Одна из задач бизнеса это максимизация прибыли, что включает в себя, также разумные траты на технические средства, которые могли бы обеспечить выполнение той задачи, которая на них положена, а это означает, что не нужно тратить много денях на доп. оперативную память и процессор с несколькими сотнями мегагерц, чтобы обеспечить быструю и не "лагающую" работу интерпретатора питона, на котором так приятно кодить скрипто-макаке, которую я нанял.
>Задачи банкомата может решать мк за полтора бакса
Чёт я сомневаюсь, что безделушка за полтора бакса сможет потянуть оптимизацию пайтона или жээс, так ещё и обеспечить "приятную" работу с сенсорным дисплеем.
Существующий мусор это дешево и работает с колёс, что и нужно бизнесу. Можно делать с нуля на будущее, но это противоречит философии постсовкого бизнеса, у которого суть получить прибыль здесь и сейчас, пока что-то не наебнулось. И это вполне разумно, не так ли?
>И это вполне разумно, не так ли?
Согласен, это разумно, но до определённых пределов. Просто не понимаю, что ты хочешь до меня донести?
Хочу до тебя донести, что твоя технологическая целесообразность очень редко пересекается с бизнес целесообразностью, для которой тебя нанимают.
Тебя наняли выкопать яму, а для чего её копают и какими средствами это не твоего ума дело, если тебя об этом не спросили.
Изучать си и предоставлять услуги, или вкладывать деньги и получать услуги.
Но ты не годишься ни для того, ни для гругого, по-моему.
Ты из тех водителей троллейбусов, у которых какие-то фантомные амбиции. Да, любой хуй в постсовке имел окно, чтобы чего-то добиться. Сейчас этого нет. Сейчас в постсовке выжить это уже заебись, если у тебя есть возможность выехать и работать таксистом это уже замечательно. Не всем получать заработок на уровне потомственной ренты. Чисти трубы и живи достойно, сука, хули ты выебываешься?
>И это вполне разумно, не так ли?
Скрипто-макакыч разорвался!!! Ладно, анон, хватит флудить в этом треде. Если хочешь позаниматься хернёй, то иди в б, и там загоняй свою философию, а нормальные ребята и так понимают, что из-за автоматизации, скоро и светофоры станут "умными", а для этого их нужно будет подключать к сети, чтобы мощные серваки, которые обладают овердохера памятью и суперпроизводительными процессорами, выдавая "красивое" окошко уведомляли оператора (скрипто-макаку), что в том или ином месте прогнозируется затор, следовательно он должен в "красивом" окошке переключить режим работы светофора. Но вот, чтобы светофор, своим маленьким микроконтроллером, понял, что скрипто-макакыч хочет преключить режим его работы, и нужны будут такие ребята, как я, и как многие из этого треда, которые напишут под этот маленький мк код на Си. И таких светофоров, шлагбаумов, турникетов, и т.д, и т.п. с каждым годом будет становиться всё больше и больше. Поэтому, анонче, флуд в б, а здесь только сишный, с ассемблерными вставками, хардкор.
Да лучше уж Си дрочить в свободное время, чем какой-нибудь лисп или еще хуже хаскелль. Хотя лисп еще минимально интересен за счет интерактивности, но это давно и в Питоне с Джулией есть. А в Джупитер и C++ запилили уже.
Да я хз откуда такая ненависть к Си! Это афигенный язык, благодаря ему и ассемблеру, я просто лучше стал понимать компьютер, да и благодаря этим знаниям, даже мой код на питоне стал красивее, лаконичнее, быстрее, просто потому что я теперь понимаю как бегают байтики в компьютере. Плюс к этому теперь ещё и логические операции со сдвигами обрели какой-то внятный окрас, просто я понимаю, что эти операции гораздо проще выполнять процу, да и благодаря этому теперь ещё и математика для меня совсем другой окрас обрела.
Это как раз логично, а не странно. Например для криптографии полезно размазать управляющие команды всяким мусором, чтобы очередной кулхацкер джиэсбибизян по дизасемблу не смог накодить кейген для очередной денувы.
>Да я хз откуда такая ненависть к Си!
>Это афигенный язык, благодаря ему и ассемблеру, я просто лучше стал понимать компьютер
Именно отсюда. Раз си помогает лучше узнать компьютер, его ненавидят те, кто ненавидит компьютеры, не хотят ничего про них знать. Большинство не хочет лезть разбираться в кишках компьютера, им надо наоборот, чтобы было проще, меньше думать, меньше делать, чтобы тык и стало заебись, чем дальше от компьютера, тем лучше, они стремятся к языкам более высокого уровня, более далеким от настоящей архитектуры железа.
Так уже придумали скратч. Зачем они теряют время на пустословия в топике морей, когда можно лампово чиллить на хайлевел джипег бейзед ультрапоредж лангуаге?
Вопрос риторический, повторяю вопрос риторический.
Нет, денег больше не стал получать. Но и программированием занимаюсь не потому что тут все 300 кк/наносеки, а потому что мне это интересно, потому что я получаю некое эстетическое удовольствие, когда написанный мною код делает то, что я запланировал. А Си и ассемблер я стал изучать, потому что, кодя на питоне, компьютер для меня так и оставался магией, даже пытаясь освоить книги по его архитектуре. Или у тебя, дебича, всё меряется деньгами?
Анон, рили! Получается, что цилочисленные литералы имеют тип инт. Спасибо, анон, просвятил.
ну вот у меня теперь вопрос к знатокам. почему компилер идентифицирует единичку как инт? наверное зависит от флагов компила? ну логичнее же представлять единичку как ансигнед чар, чем как инт, а с флагами омпила наверное он еще и мог бы предугадать что ты тут подразумеваешь ансигнед лонги и представить единичку как ансигнед лонг (или ансигнед лонг лонг, наразных машинах это разные типы)
> ну логичнее же представлять единичку как ансигнед чар
Да! Который все равно станет int из-за integer promotion.
сильно не бейте, моя первая программа
https://pastebin.com/WKzji6Sb
*длина имени
Изучаю Си.
Так вышло, что в моём понимании fopen вызывает open и что-то потом делает.
Собственно вопрос: как open может открыть бинарный файл? Вот fopen("bla_bla_bla","rb") позволяет читать бинарный файл, fopen("bla_bla_bla","wb") записывает в бинарный (и создаёт, если его нет), а как такое проделать с open?
Мои попытки записывать через open+write приводили к появлению текстового файла.
В юниксе, откуда твои open+write, не было такой педерсии, как текстовые vs двоичные файлы.
Если ты про шиндовс, то там нет никакого open. Если про linux, то вызову open фиолетово что там
неужели кбхит ненужен? а если и так тогда через какие средства мне накодить самый обыденный интерактив:
for(;;){
if(kbhit()){ switch( c=getchar() ){} }
}
точнее нет не так вопрос должен звучать.
вопрос должен звучать вот как - существует ли какое либо кроссплатформенное решение по замене гетча через кбхит?
ну я не знаю, может читать байты из буфера консоли можно и на пинусе и на шинде одинаково (в чем я сильно сомневаюсь, команд лайн это какая то каляска по лекалам павершелла а не копия)
немношко поправил код, теперь квадрат не сплющивает, но по прежнему все точки тянет в центр
Сделал пару примеров с указателями на функции, где в функцию передается указатель и потом по очереди в цикле по указателю вызываются разные функции из массива указателей на функции. Но как при этом себя ведет поток управления? Пишут, что он идет в обратную сторону, потому и обратный вызов, но я не могу этого понять. Как работает стек при использовании обратных ввзовов тоже не понятно.
а, окей я не заметил при беглом листинге
а что значит жмутся к центру? может надо на радиус умножить корды?
у = син(а) х радиус
х = кос(а) х радиус
иначе корды в разбеге -1 to 1 по флоатам будут и околонулевые по интам
для чего обратный вызов я не знаю, но указатель можно положить в структуру и будет классно
радиус это константа, на какую константу не умножай, с каждой следующей итерацией, они всё сильнее и сильнее тянутся к центру
вплоть до сингулярности
Вот как это выглядит (чем больше угол поворота, тем быстрее сплющатся)
ладно, тебе виднее
Такие алгоритмические задачи надо делать на подходящем языке, как питон или бейсик. Вот когда отладишь алгоритм, тогда можно его переносить на си. Иначе непонятно, то ли у тебя в алгоритме косяк, то ли ты наступил на сишные грабли по незнанию языка или неосторожности, как например выход за пределы массива или неправильная арифметика чисел.
Бог дал человеку инструменты дебага, но человек не перестал млеть
от мыслей о высоком уровне, и тогда Бог обозлился на человека, и сделал его скрипто-макакой.
Единственный язык, который нужен дополнительно, это ассемблер (nasm, так с ним много рарных книг), и то на уровне, чтобы ты мог читать дизассемблированный код. Знаешь Си и ассемблер, можешь дебажить, плюс правильно дизассемблить (как бы с элементами дебага, главное, чтобы можно было ходить по дизассемблированному коду по шагам), значит можешь приступать к фундаментальным алгоритмам. И поверь, ни одна книга, сайт, статья, препод, т.е. ни один источник информации, откуда ты будешь черпать её, посвящённый любому высокоуровневому ЯПу, не расскажет тебе о фундаментальных алгоритмах столько, сколько ты сам сможешь выудить, используя связку си-асм-дизассм-дебаг. А огрехи в понимании этих алгоритмов будут стопроц., потому что в их структуре (особенно, если используется любой высокоуровневый ЯП) столько уровней абстракции, что ебанёшься!!!
Художественная книжка кернигана про юникс даст тебе больше, чем мильйоны абасракций, которые ты даже не осилишь.
Да, ты кондовый снулист, который думает, что если он начнет прорабатывать букварь, то станет дохуя писателем-философом. Не станет.
Будет дристать такими максималисткими выпадами в сторону всех подряд, пока не стухнет окончательно.
>прорабатывать букварь
Скрипто-макакыч, ты пойди хотя бы один уровень абстракций пойми!! Как букварь, где описаны лишь символы, т.е. атомарные частицы языка, можно сравнивать с целыми языками, на которых написаны целые системы? Дебич, хватит здесь дристать! Просто пойми уже наконец, что ты ни за что не освоишь рекурсию на питоне, пока не посмотришь на то, как она выглядит на уровне машинных команд (на самом деле ничего сложного). Если ты до сих пор не осилил рекурсию, мы не виноваты. За что ты нам тут постоянно срёшь тупостью?
> > Будет дристать такими максималисткими выпадами в сторону всех подряд, пока не стухнет окончательно.
Сколько лет, сколько лет прорабатываешь?
>кондовый снулист
Поди, ведь, все выходные и понедельник искал это выражение, чтобы высрать нам его в этом треде. Вот шизик, пиздос!!
Что там искать, это главный инфоцыганский термин. Любого овоща можно вкатить в зарабатывание миллионов, но именно С НУЛЯ. Потому что у него нет никаких знаний, он НОЛЬ.
А тут проработает вопросик с Анатолием Пиздунковым и уже ПРОФЕССИОНАЛ.
Ты типа ругаешься на то, что это долго? На самом деле, прорабатываю может полгода, даже меньше. Пара месяцев ушло на то, чтобы понять, что Си без асма не осилю, потом пара месяцев ушло на то, чтобы осилить асм на уровне, чтобы можно было бы читать дизассемблированный код. И сейчас прошло ещё, наверное, пара месяцев, когда я дизассемблю всё, что мне не понятно, продолжая изучать Си. Ясен пень, что всё это не без перерывов, тому что 24/7 не могу уделять Си, но то, что после освоение асма обучение ускорилось и улучшилось это сто процентов.
Извини, в следующий раз воспользуюсь твоим советом.
>Нотацией примеров теперь служит Оберон/Компонентный Паскаль – наиболее совершенный потомок старого Паскаля по прямой линии.
А мой хитрый план состоит в том, чтобы сразу на Си нырнуть в фундаментальные алгоритмы.
Ловите столярова и топите его в бочке с тухлой рыбой.
Чо он там, кстати, высказался или молчит как уёбище?
Да забей! Наш скрипто-макака сегодня совсем обезумел.
>фундаментальные алгоритмы
мне так нравится это выражение
вот наши то алгоритмы фундаментальные, не то что у ваших там виртов
фундаментальные это вот такие как
алгоритм сложения двух чисел return a + b;
?
а соответственно нефундаментальные это основанные на фундаментальных? тоесть квик сорт уже не фундаментальный будет
уууу вирт собака сутулая хуйне всякой учит
Чёт ты переборщил с тупостью! Ты бы хоть оглавление этих книг прочитал, а потом оглавление книги Вирта, и тогда понял бы, что это суть одно и тоже (практически). Только тут примеры на Си, а у Вирта на Паскале. Видать из-за жары сегодня и скрипто-макака с цепи сорвался, и другие аноны подтупливают...
Ну, это похоже надмозги так перевели.
Не могу понять, зачем нужны эти книги? Просто выложили бы исходники на гитхаб и всё. Зачем мне как дебилу перепечатывать с книжки? Что в башке этих идиотов творится?
Чего ты ругаешься? Обычно, в книге есть ссылка на сайт, где можно все исходники из этой книги найти.
>начнет прорабатывать букварь
твой уровень абстракции близок к инфантильному, скриптоманя. Это почти что магическое мышление.
Ты в своей абстракции уже преисполнился?
это значит меняется? или нет?
типа не может же быть что бы одни символы кодировались одним байтов, а другие двумя (или может)?
типа когда я пишу char var
откуда он знает сколько памяти выделить? (один или два байта)
я ведь ещё не записал в него никакой символ...
Там отдельные типы и функции, которые с этим работают, обычные вроде latin-1.
Извиняйте, парни, что случайно саганул.
Так, стоп. Переменный размер в каком смысле? Вот есть например японское предложение(условно), каждый символ будет(так же условно, я не знаю сколько там конкретно байт на символ используется) 2 байта, но тут вдруг в этом предложении встречается слово, написанное на английском, то есть умещается в 1 байт каждый символ. Это слово английское тоже будет на каждый символ 2 байта занимать, или тут будет какая-то вуду магия и в данном случае будет уже 1 байт? То есть половина предложения из 2 байт, а другая из 1?
Ну почитай вики, штоле. Там битмаска, которая кодирует длину последующего символа. Суть та же, что в компрессии - самые ходовые символы (аски) занимают минимум в один байт, самые залупные и нинужные больше.
https://ru.wikipedia.org/wiki/UTF-8#%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BE%D0%B4%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F
просто это не совсем стыкуется с тем что я читал до этого.
вот например я инициализирую переменную char, но пока не присваиваю ей никакое значение.
Для неё выделяется ровно 1 байт (или ровно два байта)
количество байт не может увеличиться или уменьшится после присвоения. Если в тексте есть символы не из аски, то компилятор заранее как то должен об этом узнать и кодировать всё двумя байтами. Если нет, то и смысла в двух байтах нет и на всё выделяется только один байт.
\Что из этого неверно?
Я же говорю, там другой тип wide char, он резервирует больше, что-то не используется, очевидно.
В стандарте.
SDL этим не занимается, насколько мне известно. Это грубо говоря обертка для openGL
А так надо смотреть исходники mesa наверное. И кстати тебе действительно легче свою написать, чем изучить готовое, годами проверенное решение? оптимистично
пихнуть на шину байты?
а вот такой вопрос
допустим есть какие то данные (похеру пусть числа будут) как их организовать чтобы поиск по ним был максимально быстрый?
с одной стороны самый быстрый поиск проходит по б-три, но с другой стороны есть префетч сортированных массивов
ну так и что быстрее то в итоге?
с одной стороны оопэшники переписали всю стдлибу под копи он райт для быстродействия, а с другой стороны соверменные железки диктуют откат к классике и оопэшники снова переписывают свою шарманку под классику с которой уходили
блять у меня реально зогошиза с этой хуйни начинается, храдварщики сознательно откатывают технологии на 50 лет назад иил чо?
>храдварщики сознательно откатывают технологии на 50 лет назад иил чо?
Какие еще "технологии", лол?
Все "технологии" были созданы для обхода костылей железа. И половину проблем, которые решают "технологии", можно было решить, отказавшись от x86 в свое время, но срыночек и нужные связи выблядков из intel порешали , поэтому имеем, что имеем.
Алсо, нет ничего удивительного, что выкидываются костыли, когда проблему решают на фундаментальном уровне.
>проблемы можно было решить, отказавшись от x86 в свое время...
>"Весь старый мир мы разрууууушим! До основааанья, а затееем! Мы наш, мы новый мир построооим! С чистогоооо листаааа!"
Слыш, тупое говно, это называется деградация, взять и заруинить достижения прошлого, откатившись в болото недоразвитости. Переписывальщики херовы, каждого такого пидараса надо клеймить как дегенерата и больше ни к чему не подпускать, кроме работы дворником и мойщиком полов, да и то с осторожностью, и там умудрятся нагадить всё испортив.
Шиз, деградация - это когда еще в 90х годах ты знаешь о том, что твой продукт говно и продолжаешь его пилить. Вот сейчас инцелам полная пизда, потому что лимита по нанометрам достигли, а расширяться больше некуда, архитектура говно, о чем, повторюсь, знали еще в конце прошлого века и другие компании решали эту проблему, но срыночек порешал.
слыш хардарщик билять хватит говно мне в жопу заливать атвичай пачиму ультрасовременные бинарные деревья с логарифмическим биг оу работают медленнее чем скуфидонские массивы с линейным биг оу
а ну к стенке становись, из за тебя проебываем алгоритмы
>пачиму ультрасовременные бинарные деревья с логарифмическим биг оу работают медленнее чем скуфидонские массивы с линейным биг оу
Ты же сам ответил на свой вопрос постом выше. На одинаковой железной базе выбор правильного алгоритма или структуры данных могут зарешать, но если на уровня железа есть прикольные фичи, то можешь хоть обосраться со своими алгоритмами.
Это вопрос уровня "Почему программы дидов, которые оптимизировали код сотни часов, лагал, пердел и свестел, а модный и молодежный питончик даже при сортировке пузырьком работает быстро?"
>рыночек порешал
Я про то и говорю, раньше был качественный профессиональный софт, а сейчас браузерные высеры из говна и палок. Софт деградирует не по дням, а по часам, все плюются. Деграданты отбрасывальщики старого переписыватели дорулились, всё изгадили и опустили на днище.
Как наглядный пример, посмотри на линукс. Уже 40 лет пишут графическую среду, но всё никак не напишут. Каждый раз выкидывают старое и переписывают по новой, и каждый раз становится только хуже и хуже.
так я тебя и спрашиваю нахуя вы откатываете технологии взад дебилы вы дремучие рептилоиды сука с нибиру иншала вертел нибиру тваю маму рот наоборот
Какие технологии назад, шиз? Раньше ты пользовался хуйней Х, чтобы обойти косяк копроархитектуры. Теперь это пофиксили и ты пользуешься Y. А все твои технологии в ИТ остановились в развитии где-то в 80-90х. С тех пор ничего прорывного и фундаментального не изменилось. Даже современные ЯП пиздят фичи из старых и малопопулярных языков и выдают за неебаца прорыв.
сука ты чо меня бесишь рептилоид ты хоть раз назови блять этот косяк который обхиодит костыль в виде бинарного дерева тупая ты хуета блять дремучая заладил про костыли и пояснить нихуя не можешь выйди нахуй с треда
>Я про то и говорю, раньше был качественный профессиональный софт, а сейчас браузерные высеры из говна и палок. Софт деградирует не по дням, а по часам, все плюются. Деграданты отбрасывальщики старого переписыватели дорулились, всё изгадили и опустили на днище.
Когда у меня приступы такой шизы находят, то я ставлю старую винду(хотя бы xp/vista(про линукс тех времен даже говорить не буду)) на некропеку из чулана и начинаю пользоваться. Сразу пропадают все эти манямысли про НАСТОЯЩИЙ софт дедоф. Это не более чем искажение восприятия и ностальгия.
>ряяя не смейте делать процессоры быстрее
Лол.
Причина подрыва, шизло? У тебя горит попа с того, что материальный мир побеждает твою идеалистическую хуйню? Если кто-то запиливает ускорение определенных операций на физическом уровне, то очевидно, что они будут работать быстрее всего остального.
Наверное, если создадут такой процессор, который сможет нативно исполнять ФП код, то у тебя вообще анус треснет?
Какой вопрос, выблядок? Ты кроме своего рявканья ничего не с силах сказать. Сначала удивился, что физическая оптимизация оказывается эффективней программной, а потом из-за этого порвался и начал всех рептилоидами обвинять, которые как оказалось манямирок дегенерату сломали. Воистину долбоеб.
какой косяк/костыль/маняхуйнянейм архитектуры обходит алгоритм поиска в бинарном дереве?
>я ставлю старую винду(хотя бы xp/vista(про линукс тех времен даже говорить не буду)) на некропеку из чулана и начинаю пользоваться
Перевожу на человеческий язык: дегенерат пытается запустить хром под хр, тот не запускается, бабах, говно нинужно кал, виндоус11 фарева, во имя святого гугла, аминь
Какое там искаженное восприятие, когда биологический урод без мозгов, у которого восприятие реальности отсутствует за пределом одноклеточной браузеропараши и насасывания корпорации-барину.
Э, слыш. У меня 98 на Р4 моментом грузится. Почему современный пука так не может, пока не прикупишь еба-ссд?
уже весь stdio.h перерыл не могу найти реализацию
>https://github.com/bminor/musl/blob/master/src/stdio/getchar.c
найс троленг
>>56989
сысоев к доске!
Причем тут троленг? Я тебе скинул вполне доступную реализацию getchar, дальше можно самому найти все что надо. Думаешь в glibc ты что-то найдёшь? там написано все так, чтобы любопытные глазки ТОЧНО НИЧЕГО не смогли понять, вот и гпл весь
меня интересует реализация гетчар а не его дефайны оберток над обертками так что это был траленг с твоей стороны
ладно толку от вас все равно нет пойду дальше копать
В беззнаковый чар можно впихнуть всего 255 значений, поэтому, если твой цикл меньше 255 итераций, то можешь и чар использовать.
смотря как создавать счетчик
если создаешь вне цикла - можешь задумываться о размерах памяти
если создаешь внутри фора - похеру локальная переменная будет уничтожена сразу как только цикл закончит работу
unsigned char i;
for(i = 0; i< 256; i++){}
for(long long i = 0 ; i < size; i++){}
Ты тупой, если е читаешь чужие исходники и не умеешь их понимать. Исходинки великих людей. Замолчи и выйди из треда. От тебя толку нет. Ты ничего полезного в тред не приносишь
Скрипто-макакыч, ты стиль общения поменял, что ли? Теперь ты хочешь казаться самым полезным аноном этого треда?
>Скрипто-макакыч
Докажи, что ты не скриптомокака, глянь исходники величпйщего nginx'а, уверенно занявшую свою нишу от скромного автора, который даже не пиарил его. Потому что код - гениальный. Или ты вопросы только увроня char не char можешь пояснять?! Я же сказал, если ты мимо - то иди назуй просто, не отвечай на сообщения, которые тебе не нужны. Нахуй такие гниды как ты засираете инет своими комментыми нулевыми?
Пояснить не могу, потому что я только учусь. А ты, уёбок, если хочешь что-то серьёзное узнать, то разговор надо начинать не с ёбнутых обращений, а просто с хорошо поставленного вопроса; тогда, возможно, аноны сочтут, что ты достоин ответа.
Если ты только учишься, тогда хуле встреваешь в разговор. А моё обращение отсеивает дебилов, которые ждут на дваче (да и ваще в инете) этикета. А вопрос простой, хуле sentinel для красно-чёрного дерева расположен не в самой структуре дерева ngx_rbtree_t
пасибо
пришел тут срать в тред своей хуетой заместо того чтобы начеркать себе юмл диаграммы
такие тупездни достойны только информационной изоляции
алсо макросы гетчара и путчара вкомпилены намертво и голой реализации в стдлибе не будет
реализацию можно было бы найти в исходниках гцц или силанга, но мне лень
кажется прочитать сигналы на ножках проца гораздо проще, чем ковырять исходники компилера
на случай если анон захочет сам реализовать кбхиты
для переносимости программного обеспечения на другие платформы
инфа отсюда
http://wwwinfo.jinr.ru/~dushanov/book/c/6.htm
>>57305
вообще
это HAL ядра, тот самый нативный кусок позволяющий остальные части ядра, такие как например ретранслятор адресов или диспетчер процессов сделать более переносимыми
в поисках реализации я нашел пару статей с самописными ядрами и танцами вокруг IRQ_handler и каких то самописных потоков по образу цикличных буферов но мне проще называть такую структуру двусторонней очередью
однако такие танцы мне не нужны, я не форкаю ядро и не пишу свое, поэтому не стал сильно вчитываться
так что буду колдовать на асмовставках свой кбхит да я знаю что на стаковерфлоу лежит готовая реализация кбхита свой гетчар/путчар свои потоки
void*
size_t
printf ("text\n"); fflush(stdout); но программа падает и ничего не выводит
как вернуть всё на первую строчку и запробелить что бы всё типа удалилось (обьясните, как обьяснили бы своей училке по русскому)
Скорей всего только стирать все. Одну строку можно перезаписывать \r.
>enum{false, true};
>int i = 2;
>if (i == true) printf("anon molodez);
>else printf("anon durak);
ыыы
Лучше уж так
#define false 0
#define true !false
мимо поумничал
uintptr_t
Да, скуффиксы.
>бойся 228 когда пудришь носик
ты печатаешь в консоль символы туда где стоит каретка |
есть юникод управляющие символы последовательности секвенции как удобнее \b вернуться назад на 1 символ и \r вернуться в начало строки
есть анси если твой терминал умеет жрать анси
есть написанные на основе этих штух библиотеки, например curses https://www.ibm.com/docs/ru/aix/7.2?topic=concepts-curses-library
ну и конечно же есть ответы в гугле )
Просто попробуй. Ни один стандарт такого не гарантирует.
e+d/f))for(e=d%=f;g=--b2;d/=g)d=db+f*(h?a:f/5),a=d%--g;}
Какими байтиками нужно манипулировать, чтобы терминировать луп тогда когда захочется?
байтиками пупы
Ладно. подожду более компетентного специалиста.
А g у этого тралля всегда равно мусору? Збс, конечно, циклы, но чему равно g?
Забей!!! Это пост инцелла, у которого при розыске g, эта самая g стремится к бесконечности.
Сук в голос...
Я понимаю, что у инцеллов g при любом раскладе стремится к бесконечности, но мне интересен ответ самого автора цикла.
У меня теоретический вопрос.
В результате реверса специально сделанных программ мне удалось прийти к предположению, что число функций в c в рамках одной компиляции ограничено.
К примеру пусть имеется такая программа:
int f1(){}
int f2(){}
int f3(){}
...
int fN(){}
int main(){}
Теперь вопрос:
Какое наибольшее значение N в такой ситуации? Я правильно понимаю, что какой-нибудь gcc не будет работать при достаточно большом N?
Во-первых, первоклассному траллю, на мой взгляд, мешает сажа пикрилл один.
Во-вторых, кол-во функций всегда можно загнать в константу ОСи плюс один шурупишь о чём я?
В-третьих, могу сделать смелый вывод - ты наиглупейшая скриптомакака, которая пытается траллить тред умных ребят, а потому...шёл бы ты отсюда подальше, дебич, пока обоссаны, у тебя, только карманы за щеками
Ограничено размерами стека скорей всего.
>Тут старперы любят вонять, как они байты ебут
Ахахах, узнаю почерк "любимого" скриптомакаки! g чему равно?
>>60196
Ещё раз, дебильнейшая скриптомака, у тебя второй цикл имеет условие:
>g=--b2;d/=g
А дальше сам цикл равен:
>d=db+f*(h?a:f/5),a=d%--g;}
В котором неясно что такое "g"!!!
Так же как и неясно, что такое g из первого цикла и из, как я понимаю, констант, что ты хотел ввести в программу:
>a[52514],b,c=52514,d,e,f=1e4,g,h;
>{for(;b=c-=14;h=printf("%04d",
e+d/f))
Так о чём ты хочешь ещё узнать, дебич? Ты пытаешься троллить в стиле майндфак??? Но из-за твоей тупости у тебя это не получается, скриптомакакыч. Хотя, то, что ты задал интересно с точки зрения внимательности, следовательно, "когнитивки".
Там просто два умножения и макаба заменила их италиком. Смотри где начинается итаилик и где заканчивается.
Пиздос! Потому что в где-то в программе "объясняется" что такое g, Либо, работает не так, как изначально планировал ты, когда писал программу.
Я имею ввиду, что ты конч!! Какое ещё двойное умножение, блять???? У тебя явное деление на g. Короче, дебич, кидай код на пастебин, где нельзя будет обвинить макабу.
Не, сорян! На пастебине этот код имеет немного больше смысла, чем на дваче, но всё же это хуита. Чему равен пикрилл?
Здесь тоже мусор находится.
D в этом коде вообще ничего не присваивается. Единственное что можно предположить, что какой-то конченый компилятор занулил стековую переменную(что очень маловероятно), к тому же в коде в функции main() типа нет, 89 стандарт какой-то.
Тролляка со своей говно laba1.c завайпал тред, поздравляю
А, ну всё верно, d это и не стековая переменная, ей 0 изначально объявлен
>D в этом коде вообще ничего не присваивается.
Равна нулю.
>main() типа нет
int не обязательно писать.
Таким что это статичная переменная, которая инициализируется нулём. Это факт, база
Текущий вышел пару недель назад.
запомните мрази
плохой код с хорошим неймингом - говнокод
хороший код с плохим неймингом - кал говна
бля, хуй знает. почитай на странице репозитория, может там какие-то зависимости есть
Анон, а что ты имеешь в виду под байтиками, на которые ты хочешь влиять? Очевидно, что влиять ты можешь, отталкиваясь от кол-ва итераций, где "1" это переменная b, которая у тебя уменьшается на 14 в первом цикле, а "2" это уже введённая мною переменная, которая считает кол-во итераций во вложенном цикле.
А вообще твой внутренний цикл выглядит так - пикрилл один. Участки кода, которые я выделил, зависят от переменной g, поэтому ты можешь ею манипулировать, чтобы не вводить доп. переменную. И, кста, у тебя какая-то бестолковая первая итерация (можешь глянуть на пикрилл один) на переменную d.
>Не b, а с. b нужна для второго цикла.
Ну это да, просто у тебя b приравнивается с уже в условии фора, следовательно, т.к. фор начинается с проверки условий (т.е. нет никаких инициализаций), то первым делом программа прыгает в участок кода (машинного), где происходит проверка этого условия, т.е. получается, что первым делом b присваивается с уменьшенная на 14, и дальше уже программа исходит из этого. А так да, уменьшается на 14 с.
>>60667
>Указание типов и соблюдение разметки это смузи хуйня чтоли?
Да ладно тебе! Это было весело. Если бы я вчера самогоном не нахерячился, то всё уже вчера решил бы (заместо того, чтобы писать вчера тут пьяную хернь), а так этот код мне сегодня даже снился в каком-то лютом, пьяно-угарном сне.
>>60683
Анон, давай ещё что-нибудь подобное неси сюда.
При чем тут питон, когда речь о читаемости. Ты же, что бы ответить на пост, воспользовался гринтекстом для разметки. Почему это не стоит делать в коде для читаемости?
Закономерное врети смузихлёба.
сыглы. норм пацаны ебашат на си и мыслят системными вызовами
сыглы. норм пацаны ебашат на си и мыслят системными вызовами
Я раньше думал, что нет в чистом C перегрузки, однако сегодня узнал, что функция open() имеет два набора параметров:
int open(const char pathname, int flags);
int open(const char pathname, int flags, mode_t mode);
Это как-то макросами сделано или тут какой-то совсем иной уровень знания C?
да, макросами. в С нет перегрузки функций, эта фича, как и многие другие, были добавлены только в С++
Я так понимаю, что если off_t может иметь число значений от 0 до 2^(32)-1, то всего можно адресовать в файле 2^(32) байт=2^(22) КБ=2^(12)МБ=4 ГБ.
Я прав или где-то ошибаюсь?
Во-первых, "сикать" можно многократно от текущего положения указателя. Во-вторых есть всякие lseek64, llseek.
это вроде пределы для адресной архитектуры памяти при 32битном машинном слове так что полагаю анон с сиком64 вырулит ситуацию
> Есть ли ограничение на размер открытого файла в си?.
В Си нет. В отдельных функциях типа fseek есть.
Ограничение обусловлено только количеством разрядов или там какая-то конкретная цифра есть?
Количество разрядов + особенности библятеки и ОС. Тебе никто не гарантирует, что файловая система поддержит файлы до 12345 байт.
да я и сам люблю хлебнуть кефирчика с ягодами под макарошки с сосисками
ой прости, переведу на ваш
да я и сам люблю полакомиться смузи под напоритан
Допустим я произнес божье слово int.
Что оно определяет для переменной (кроме размера выделяемой памяти)
то как по дефолты будут декодироваться биты в памяти, в данном случае как знаовые целочисленные
да и ето то жи, флоаты вроде на отдельном матядре штампуются
какие спецификаторы?
спецификатор области видимости сообщает компилятору область видимости
спецификатор регистровости сообщает компилятору желание присобачить переменную непосредственно на регистр
спецификаторы знаков сообщают как следует читать старший бит
спецификаторы длины сообщают компилятору о модификациях длины байт для чтения записи данных
чо там еще есть?
это "гнезда" для форматного ввода/вывода чтобы туда подставлять переменные
я не копал реализации форматных вводов/выводов, но думаю там что то по типу войд поинтера который кастуется к типу который вычисляется из форматной строки например %d вычислит что нужно кастануть к (int*) типа того
>если тип уже все определил
В языках выше уровнем тип учитывается автоматически. В си этим управляет программист.
Форматные специкаторы.
printf не знает тип переданных переменных, он видит только кусок памяти на вершине стека, где эти переменные одна за другой + выравнивание. scanf там видит только ряд указателей на что-то.
Понял, спасибо
int main(){
int b = 0;
char a[] = "Hello world";
while ( &a != "/0"){
printf("%c",a);
b++;
}
return 0;}
че не получается, что за ошибка
4 ошибки
попробуй так:
#include <stdio.h>
int main()
{
char a[] = "Hello world!";
short b = sizeof(a)/sizeof(char);
for(short i=0; i<b; i++)
printf("%c",a);
return 0;
}
*в printf a вместо а
эм... крч хз не отоброжается почемуто, поставь квадратные скобки с i
>while ( &a != "/0"){
while( a != '\0' )
>printf("%c",a);
printf ("%c",a);
а вообще если тебе надо принтануть строку то можно и гораздо легче делать
например
printf("%s", a);
puts(a);
без всяких там вайлов и проверок на символ конца строки
к тому же например компилятор считает две строки записанные друг за другом одной строкой а твой алгоритм так считать не будет
Функция ведь где то хранится, правильно? Ее так сказать исполняемый код загружается в рам? Тоесть она сама по себе занимает место в раме? А если функцию реализовать макросом? Макрос так же занимает место в раме? Имеет ли смысл переписывать функции макросами вообще? Часто встречаю фул листы макросов в юниксовых микропрограммах, которые заменяют простые двустрочные функции. Зачем это сделано? А если например больше строк замакросить? В чем профит так сказать?
Могу ошибаться, но таким образом ты инлайнишь код, чтобы не вызывать каждый раз функцию. То есть, этот макрос просто подставляет записанный код на место его использования.
Тобишь нет хождения по памяти в другой сегмент и теоретически код быстрее? Так что ли?
Как бы да, но таким образом код занимает больше памяти, потому что каждый раз вставляется на месте использования макроса.
Тоесть выбор либо жирнее по РАМ и быстрее, либо тоньше и медленее? Правильно я понял?
Потому что в строке есть символ конца строки.
Слово из 5 букв Hello если записывать посимвольно имеет длину 5 байт, а если как строку то 6 байт.
потому что sizeof возвращает размер массива в байтах, а строка это массив символов, ограниченных нулем. Размер строки заранее известен на этапе комплияции, так, строка "Hello world!" на самом деле является "Hello world!\0"
Потому что Стетхем запретил. Вопросы?
>>65377
Да нечего тут объяснять. Вот цитата из книги Ван Гуйа про программирование на ассемблере, из которой можно понять, что макросы выгоднее тогда, когда есть очень большое кол-во вызовов одной и той же ф-ции, следовательно, код становится объёмнее, но зато производительнее:
При многократном использовании в программе одного и того же набора ин
струкций можно создать функцию и вызывать ее каждый раз, когда необхо
димо выполнить эти инструкции. Но для функций характерно снижение про
изводительности: при каждом вызове функции поток выполнения переходит
к вызываемой функции в некоторой области памяти, а после ее завершения
возвращается обратно в вызывающую программу. Вызов функции и возврат
из нее требуют определенного времени.
Чтобы избежать подобных проблем с производительностью, можно вос
пользоваться макрокомандами (или просто макросами – macros). Как и функ
ция, макрос представляет собой последовательность инструкций. Макросу
присваивается имя, и когда нужно выполнить этот макрос в коде, вы просто
указываете его имя, возможно, сопровождаемое аргументами.
Важное отличие от функции: во время ассемблирования везде, где в исход
ном коде встречается «вызов» макроса, NASM заменяет имя этого макроса
на набор инструкций, записанных в его определении. Во время выполнения
не происходит никаких переходов и возвратов, потому что NASM уже вставил
машинный код во всех необходимых местах.
Макросы не являются функциональным свойством языка ассемблера Intel,
но эта функциональность предоставляется NASM (или другой версией про
граммы ассемблирования). Макросы создаются с помощью директив препро
цессора, и NASM использует макропроцессор для преобразования макросов
в машинный язык и вставляет инструкции машинного языка в соответствую
щие места в коде программы.
Макросы позволят улучшить скорость выполнения кода, но они увеличива
ют объем кода, потому что во время ассемблирования инструкции из опреде
ления макроса вставляются в каждую локацию, где используется макрос.
>>65377
Да нечего тут объяснять. Вот цитата из книги Ван Гуйа про программирование на ассемблере, из которой можно понять, что макросы выгоднее тогда, когда есть очень большое кол-во вызовов одной и той же ф-ции, следовательно, код становится объёмнее, но зато производительнее:
При многократном использовании в программе одного и того же набора ин
струкций можно создать функцию и вызывать ее каждый раз, когда необхо
димо выполнить эти инструкции. Но для функций характерно снижение про
изводительности: при каждом вызове функции поток выполнения переходит
к вызываемой функции в некоторой области памяти, а после ее завершения
возвращается обратно в вызывающую программу. Вызов функции и возврат
из нее требуют определенного времени.
Чтобы избежать подобных проблем с производительностью, можно вос
пользоваться макрокомандами (или просто макросами – macros). Как и функ
ция, макрос представляет собой последовательность инструкций. Макросу
присваивается имя, и когда нужно выполнить этот макрос в коде, вы просто
указываете его имя, возможно, сопровождаемое аргументами.
Важное отличие от функции: во время ассемблирования везде, где в исход
ном коде встречается «вызов» макроса, NASM заменяет имя этого макроса
на набор инструкций, записанных в его определении. Во время выполнения
не происходит никаких переходов и возвратов, потому что NASM уже вставил
машинный код во всех необходимых местах.
Макросы не являются функциональным свойством языка ассемблера Intel,
но эта функциональность предоставляется NASM (или другой версией про
граммы ассемблирования). Макросы создаются с помощью директив препро
цессора, и NASM использует макропроцессор для преобразования макросов
в машинный язык и вставляет инструкции машинного языка в соответствую
щие места в коде программы.
Макросы позволят улучшить скорость выполнения кода, но они увеличива
ют объем кода, потому что во время ассемблирования инструкции из опреде
ления макроса вставляются в каждую локацию, где используется макрос.
Ну а вот применительно к современным процам как оно? Однообразные инструкции префетчатся на кеши или так только сортед байты умеют делать?
>Ну а вот применительно к современным процам как оно?
А хз! Надо эксперементнуть! Написать простенькую программу, которая будет вызывать овер9000 раз одну и ту же ф-цию, а потом ту же прогу, которая подставит овер9000 раз один и тот же макрос в код, и запустить эти проги через какую-нибудь утилиту вроде time.
То же об этом думал. Но замер времени на эвм необъективный когда прога исполняется в авм слое. Объективные замеры могут быть на слое самой ОС.
Ну или самый близкий к объективному замер - читать регистр в котором хранится число тактов, надеясь на то что проц параллельно не будет тратить такты на какой то другой процесс.
это тредик морей, а не питухонов
>надеясь на то что проц параллельно не будет тратить такты на какой то другой процесс.
Ну тут же математика, которая позволяет просто вычесть, либо прибавить кол-во тактов.
Я имею в виду, что у той же утилиты time кол-во тактов, которая она тратит на запуск программы всегда одинаковое, т.е. этими тактами можно пренебречь, суть же в том, что time запустила процесс (записала куда-то время запуска), а после того, как процесс вернул управление time вычла из времени окончания процесса время начало процесса. Правда, я не знаю точный алгоритм этой утилиты, но логика подсказывает, что алгоритм должен быть подобный, т.к. в такой реализации эта утилита не лезет в сам процесс и не мешает его тестировать. Если кто-то знает как робит time, то поделитесь инфой, ибо мне самому это интересно.
Да блин просто прочти какие нить доки по time.h все ноги оттуда растут и никакой волшебной палочки нет. Как я уже писал замеры на авм слое необъективные.
>никакой волшебной палочки нет
А хотя.. А вот что насчет UTC? Она ведь где то просчитывается параллельно. Или нет? Понятно что если в ОСи стоит синхронизация с интернетом то UTC пингуется и возможны веббаунд шумы в вычислениях, но поидее она так же параллельно должна считаться на камне, только вот на каком? Ну неужели на центральном?
Чёт ты, по-моему, перебарщиваешь! Даже, если программу запускать без замера, то время же всё-равно процессор будет просчитывать, поэтому этой твоей заморочкой тоже можно пренебречь.
Ну тогда у меня только одна идея. Вкомпилить тестовый кусок в ядро для замеров. Только так можно дать объективную оценку скорости выполнения.
>BPF
Блять я читая этот поток воды их жопы на хабре надеялся что ты что то умное принесешь. Тьфу ты.
Я нашел ответ без трогания ядра посредство kmload например.
Отдельные инструкции (по крайней мере на х86_64) не фетчатся на кешлинии. Зато инструкции функций фетчатся на кешлинии, но если хочется максимальной оптимизации их надо выравнивать по кешам проца. Ну дальше то вы сам знаете.
Крч вердикт такой.
BigO и классические оптимизации больше не работают. Пишите древний медленный код и хардварь сжует его быстрее, чем "оптимизированный".
спасибо
Спасибо, но я, если честно, ничего не понял! Что выгоднее то: функции или макросы?
Если на процах с кешлиниями - функции быстрее макросов, массивы быстрее связных списков.
Если на процах без кешлиний - макросы быстрее функций, связные списки (ака б-три) быстрее массивов.
Анон, спасибо!
причем тут bpf и хабр вообще. задача какая нахуй, твердо и четко?
>Вкомпилить тестовый кусок в ядро для замеров
нахуй что-то вкомпиливать в ядро для объективности замеров, вы ебанутые?
Анон, спасибо!
Сам и перекати, чухан.
Пару дней уже пишу аналог cal/ncal потому что мне ваще посрать на его функции по выводу григорианского календаря или юлианского. Мне нужны заметки по датам вот и все. Но я столкнулся с рядом проблем.
Проблема номер 1 - как бы проще вытянуть из файла структурки? Я пробовал fscanf но этот пидор не возвращает EOF хоть вот обоссысь. Гавно какое то. Я пробовал fgets и потом раскладывать строку по структуре в том числе при помощи atoi() и всякое такое, но это пизда дрочь ебаная, шаг в право шаг влево сегментейшен фаулт.
И вообще вот поскажите если я fgets прочитал в условный char str[], то как мне положить строковый литерал куда нить в другое место, чтобы потом из структуры по тупому чар поинтер на это место поставить и забыть?
Проблема номер 2 - я заебался бороться с АНСИ стандартом. Вот я разметил себе два поля слева и справа одно для календарика на месяц (уже распечатал все красиво) и для всяких там тасков. Но когда я пытаюсь вернуть каретку наверх чтобы напечатать правый блок у меня тупо затираются уже напечатанные строки. Тоесть был например напечатан календарик на 10 строк, делаю MoveUp(8) и остается 2 напечатанных строки календарика. Блять!
Крч есть идеи?
Не подходит. Там по структуре должна лежать строка произвольного размера. Числа числа числа флаги и строка.
Так что fgets самый норм варик с последующим разбором.
Лучше подскажи, вот если например я положу байты из char str[] в локальную хуету char str_copy[], то после удаления локальой хуеты там останется литерал? Ну если я туда поинтер загоню он найдет этот кусок или кусок то же исчезает?
Хотя чот я туплю, можно же салоцировать просто кусок байт какого нужно размера и сразу заебшить на него поинтер.
А как в итоге два текстовых блока напечатать? Опять собирать супердлинную строку и за раз ее ебашить путсом? Бля вот я капец как не хочу этот прием юзать, но пока не вижу решений. АНСИ неадекватно кареткой управляет.
Я не понимаю где блять косяк то? Алоцирую, разбираю строку на детальки (это работает заебись), переключаю поинтер на некст, некст не алоцируется.
ПАЧИМУ БЛЯТЬ
Потому что переприсваиваю. Блять я тупой пизда. Лучше бы я в психолухи пошел.
Похоже я тут единственный постер.
#include <sys/ioctl.h>
//macro
#define _getTermSizestruct winsize w;ioctl(STDOUT_FILENO, TIOCGWINSZ, &w)
#define COLUMNS(w.ws_col)
Отступы проебались. Пик релейтед на юниксах.
Как решаешь проблему написания "подобных" структур данных?
Я сам предпочитаю Си остальным языкам, но в программах то и дело приходится реализовывать множество списков/стеков/очередей/..., которые мало чем отличаются между собой. Естественно само написание доведено до автоматизма, но иметь десяток похожих методов "push" - сомнительная практика. Можно конечно макросами обернуть, но выглядит это не очень.
Имхо, шаблоны в C++ являются самой полезной фичей, которую добавил Страуструп. Причём тот их вариант, который описывается во втором издании "Cpp prog lang" уже достаточен.
Ды хазы, как по мне макросы легче читать, чем шаблоны.
GCC/Clang
А, не, нет сымслв. бит шифты не зависят от эндианов.
Пиздец. Не могу понять чему ты удивляешься. Двинул вправо осталась только левая часть. Пачиму так двачик?
Может быть ты путаешь операции и представление байтов на шине/регистрах/в рам?
Ну так ты почитай. Или хочешь тебе образовательный материал притащу в видивоформате, если читать для тебя сложно.
Это копия, сохраненная 4 августа 2023 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.