Тред, посвященный прародителю всех С-подобных языков и по совместительству единственному идеальному /clang/
Аноним27/05/23 Суб 12:16:50№27134281
Тред, посвященный прародителю всех С-подобных языков и по совместительству единственному идеальному и всесторонне годному средству программирования как на системном, так и на прикладном уровне.
- Очевидный GCC. - clang: оче годно, батя рекомендует. - Intel C++ Compiler: оптимизации, тысячи их. - Visual Studio 2017 Community Edition: внезапно этим стало можно пользоваться, особенно с тулсетом clang/C2. Поддержка C11 на уровне "есть все, что тебе понадобится в реальном проекте плюс кривая библиотека". Анализатор кода в комплекте. - Pelles C (шиндоуз онли): поучиться, вкатиться в C11 (стандарт полностью реализован, имеются в том числе threads.h и прочие stdatomic.h), но количество багов в оптимизаторе и редкие апдейты напрочь отбивают желание собирать этим что-то сколько-нибудь серьезное. - TCC: очень маленький компилятор с багами и поддержкой C99. С ключом -run умеет компилировать код в память и запускать его, что позволяет писать скрипты прямо на сишечке.
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)
- 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?
>>2714871 Как же у скриптомакаки печёт то!! Любо дорого это лицезреть! Очень много книг про фундаментальные алгоритмы, про криптографические алгоритмы, про низкоуровневое устройство компьютера, про кибербезопасность когда будут написаны на этих ваших растах и цыгах, вот тогда и приходите. А сейчас извольте в первую очередь изучать язык Си, чтобы не быть скриптомакакой, коей вы являетесь.
>>2714926 >Как же у скриптомакаки печёт то!! Старпер, у тебя галюны после валидола начались? >Любо дорого это лицезреть! Пока лицезрел, пустил подливу. >Очень много книг про фундаментальные алгоритмы, про криптографические алгоритмы, про низкоуровневое устройство компьютера, про кибербезопасность когда будут написаны на этих ваших растах и цыгах, вот тогда и приходите. Делирий или маразм. >А сейчас извольте в первую очередь изучать язык Си, чтобы не быть скриптомакакой, коей вы являетесь. Мания величия оподливившегося маразматика.
>>2714947 Да, я знаю, анонче. Это я больше не для него ответил, а для "юнцов" этого треда, которые могут повестись на этот его дегенеративный скрипто-макакный байт.
>>2714947 О, одинэсник из соседского корпуса пришел на помощь своему собрату по Альцгемеру. Похвально. >>2714949 Хуя самомнение у старпера, которому даже войд стары не помогают справится с утечками подливы.
>>2714871 Из-за чего такая разница в производительности между растом и це? С чем это связано? Я думал раст это просто безопасная надстройка над си. Ну и ещё не понятно, по какому признаку измеряется производительность.
>>2715046 Забей!! Это уебанский тест!!! Тем больше упрошений (для человека), тем больше приготовлений нужно сделать компьютеру, т.е. тем больше машинных инструкций нужно выполнить, прежде чем дойти до самой программы.
>>2715289 Что за шутки такие скрипто-макакные, которые нужно объяснять, и говорить, что это на самом деле шутки? Может, просто ты обдристался и тебя обоссали, и может больше так не надо делать в этом треде?
>>2714732 >Это винда? Какой компилятор? Можешь показать код?
Это убунту, компилятор gcc, код прикладываю: https://pastebin.com/ENdcGLDy Это я просто в отладчике edb дизассемблю и изучаю Си.
>>2714777 >Смотри cc -OS -o - с метками и коментами от клопилятора.
Можешь это разжевать, пожалуйста? Прикладываю новые скрины с адресами. На пике 2 отчётливо видно, что мы прыгаем на адрес 00005653:bd280424, как раз тот адрес, что и указан в rax, только без двоеточия.
>>2715443 Нет, в этом треде подсказали, ну не прям подсказали, а был спор насчёт того, что в итоге получится (i = i++ + i++, при изначальной i равной 5), и там чел задиассемблил и всем всё стало ясно и спор прекратился. А я в этот момент как раз пыжился над одной функцией, и всё никак не мог понять, как она робит. Поэтому я также задисассемблил её и мне всё стало ясно. Поэтому я временами дизассемблю различный код на Си, когда непонятно, либо, когда (как в этот раз), просто интересно как оно работает на уровне машинных команд.
>>2715516 >иногда компилятор такое может сгенерировать Хз, это явно не про этот случай. Я уже несколько раз пересобирал код, и дизассемблированный код ничем не отличается, только в тех местах, что я менял. >Звучит неплохо. Вообще, если заинтересуешься этим способом, то советую отладчик ddd, если ты на линуксе. В нём, под основным окном с сурсом Си, можно включить окно с машинными инструкциями, и видеть, при каждом шаге на Си, на какую инструкцию прыгает твоя программа. Т.е. ты можешь чётко видеть границы твоего кода в машинных инструкциях. Плюс ddd построен на gdb, поэтому можно ещё и навык пользования gdb прокачивать. Правда, в этом отладчике ебала с отображением инфы в регистрах, в памяти, в стеке, поэтому я первым делом "разграничиваю" код, а потом иду в edb (когда не хочу ебстись с командами gdb), чтобы присмотреться к нему более детально.
>>2715344 Мне кажется, что я допёр до того, что делает gcc со switch/case: сначала он присваивает каждой инструкции адрес, затем он создаёт таблицу куда заносит разницу между и самой инструкцией и началом таблицы, которая должна выполнится при условии в switch. Расстояние между ячейками в таблице равно 4 байтам. В этих ячейках располагается отрицательное значение, которое соответствует разнице между инструкцией, которая должна выполниться по условию, и началом таблицы. Начало таблицы с адресами всегда располагается после ф-ции main, поэтому и в ячейках таблицы располагаются отрицательные значения. Т.е. мы сначала узнаём то, что у нас получается в условии (т.е. в моём случае месяц), далее мы полученный результат умножаем на четыре, прибавляем к указателю на начало таблицы, берём из нужной ячейки необходимую разницу, затем мы расширяем её знак до 8 байт и прибавляем к началу таблицы. Теперь понятно, почему мы два раза прибавляем разные значения к одному и тому же адресу.
Мне кажется, что я допёр до того, что делает gcc со switch/case: сначала он присваивает каждой инструкции адрес, затем он создаёт таблицу куда заносит разницу между самой инструкцией, которая должна выполниться при условии в switch, и началом таблицы. Расстояние между ячейками в таблице равно 4 байтам. В этих ячейках располагается отрицательное значение, которое соответствует разнице между инструкцией, которая должна выполниться по условию, и началом таблицы. Начало таблицы с адресами всегда располагается после ф-ции main, поэтому и в ячейках таблицы располагаются отрицательные значения. Т.е. мы сначала узнаём то, что у нас получается в условии (т.е. в моём случае месяц), далее мы полученный результат умножаем на четыре, прибавляем к указателю на начало таблицы, берём из нужной ячейки необходимую разницу, затем мы расширяем её знак до 8 байт и прибавляем к началу таблицы. Теперь понятно, почему мы два раза прибавляем разные значения к одному и тому же адресу.
Сидел я в Стиме искал во что бы подрочить и увидел хентай, ну думаю можно и так. Зашёл на порнолаб посмотреть что там по играм и вижу игры десятилетней давности на QSP, скачал и тут как стало противно от этой деревянном и, меня то на скиллбоксе научили красиво кнопки двигать. Ну думаю ща переделаю все на жабаскрипт провославный, а эта поебень на вашем дедовским написана. Так вот как срать? Где программа начинается и где заканчивается, как найти то что является компилятором для этого поделия. Вот в жабаскрипте все просто в вебпаке так и написано ЕНТРИ ПОИНТ, а тут не понимать. https://github.com/QSPFoundation/qsp
Сегодня в хедере случайно заметил глобальную переменную struct foo { ... } х_fieldname; Это я пару лет назад вытянул определение из другой структуры, чтобы поднять читаемость. Сука. И главное, никто не может предупредить о таком. 100% легальный С.
>>2714871 >П - производительность. Видос не смотрел, но вангую классику растоблядей. >код на Си написан через очко >код на расте вылезан и используется специальная структура данных под задачу
Господа, поясните че за нах Передаю в функцию в качестве параметра указатель на структуру 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
>>2718238 Это для случая, когда с первого элемента выводить нужно. Если с нулевого, то ничего дополнительно указывать не требуется. Тут >>2717113 всё расписано.
>>2718258 Понял. Бтв щас проверил, если создать массив из 8 элементов типа char и заполнить первую половину случайными символами, а вторую половину оставить как есть, то puts выведет только первую половину, хотя \0 я в ручную не добавлял. Пробовал два варианта, инициализировал через char mas[8]; и char mas = (char ) malloc(sizeof(char) * 8); а потом первым 4 элементам массива присваивал значение. Печатает только то, что я присвоил почему-то.
Анонсы помогите советом. Какую IDE лучше использовать под Linux? Скачал я от JetBrains -> Clion, но эту херню уже не купить из РФ (или может какие не замороченные варианты приобрести лицензию?). Единственным более менее нормальным вариантом под Linux я так понимаю остается VS Code? Вывод я сделал исходя из популярности, хотя сам не особый поклонник VS..но куле делать.
>>2722779 ага, да. большинство фич "изкаропки" мне нах не сдались. кроме кодкомплетинга, древа файлов и консоли от иде никогда ничего не было нужно. для дебага использую valgrind и немного gdb. все иде что я пробовал пиздец тормозные (даже с моими 20гб озу). плюс у каждого языка есть свои, а вим один
>>2723845 Та я и так без плагинов (единственный плагин, который юзаю это дубликат скобок, кавычек и апострофов) программы пишу в виме. Правда, они у меня пока не особо большие (100-200 строчек).
>>2736298 > В стандарте не прописано переполнение, поэтому это UB. Переполнение беззнаковых четко определено. Сравнение интов происходит беззнаковое, если одна сторона беззнаковая.
начал учить си, вообше не могу понять смысл констант. Типа, если я в самом коде, не даю возможностей для изменения переменной при запуске программы, она ведь и так не изменится. Зачем тогда нужны константы?
>>2737074 Костыли компилятора для сокращения ошибок программиста, к самому исполняемому коду это не относится. Вот взять например строковые литералы: "тут текст", это адрес на память только для чтения, если случайно туда напишешь, может быть ошибка нарушения доступа (access violation). Поэтому, при попытке присвоить простому (не константному) указателю строковый литерал, компилятор ругнется. Короче, защита от дурака, просто компилятор нянчится ругаясь на типовые ошибки, хотя это конечно может быть не ошибка, а сделано намеренно, но тогда уже сам себе хозяин.
>>2737201 > к самому исполняемому коду это не относится. Справедливости ради, глобальная константа (число пи) будет одна на всю программу, а копии литерала могут оказаться во многих объектниках и в бинаре, если компоновщик не дозуя умный.
>>2737222 Разговор был вроде про константы. Нет константной памяти куда нельзя писать, нет константных указателей по которым нельзя писать, таких вещей не существует. Память бывает защищена и выдаст ошибку при обращении, но само обращение всегда возможно, не бывает такого что нельзя.
Поэтому константы это лишь маркеры на уровне исходных текстов для программиста, к коду это не относится. Ошибка констант это не ошибка кода, а просто защита от неправильного (по мнению программиста поставившего маркер) использования кода. Это просто маркер для себя, как например закладки в тексте. Вот ты читаешь книжку и расставил закладки, но в книге, в рассказываемой истории которую ты читаешь закладок нет, это метаданные чисто для читателя, для удобства чтения только. Так же и константы, в коде их нет, это мета-костыли на уровне редактирования кода только.
>>2737924 ничего не будет происходить, в том же си можно спокойно менять константный указатель, а это значит что в исходных текстах констант не существует
>>2737959 Да, анонче, ты прав! На уровне машинных команд конст ничем не отличается от обычной переменной (пик 2), только компилятор ругается, когда ты пытаешься записать в область памяти, которая выделена под конст (пик 4).
>>2737980 >>2737988 Я просто заёбся каждый раз у себя же спрашивать разрешение (вписывая пароль). Это, когда есть чёткая система, то можно сидеть под своим пользователем, а когда ты изучаешь, исследуешь новые программы, новые техники, то ебля с правами демотивирует.
>>2737851 > Нет константной памяти куда нельзя писать, нет константных указателей по которым нельзя писать, таких вещей не существует. Молодой падаван, ты еще не видел МК и ДСП.
>>2715872 >код на расте вылезан и используется специальная структура данных под задач мне всегда казалось что обратное это ошибка на равне с высратым на свет творчеством питухониста впрочем наверное просто нормально написать код на расте тут приводилось в качестве противовеса высратому на свет творчеству питухониста но на языке си я обрыгал сам себя, спасибо мне, расходимся тут не на что смотреть
>>2730041 полагаю как минимум твой Cell[][] это символ в который ты пытаешься запихать строку "#" а в строке 2 символа, тобишь это массив символов, наверное еще с новарнингами пишешь, а так бы компилер тебе сказал что ващет негоже так класть одно в другое
почему на 24 строке мне кидает варнинг и просит кастануть поинтер к моему типоразмеру (6 байт) если целевое поле структуры такого же типоразмера (6 байт) ведь поинтерам без разницы какой тип данных в них пишется или читается, им важен типоразмер, сколько байт за раз мы читаем или пишем так вот почему варнинг то? не обращайте внимания, это учебная программка по структуркам для одной девочки, которая учит си
>>2738074 Да, анонче, понимаю, что это нехорошо, но пока меня это не напрягает. Может ещё посоветуешь что-нибудь, что можно сделать, чтобы некоторые программы (например, ddd) работали бы нормально под обычным пользователем, а не только под рутом?
>>2739074 Я запускал и с помощью sudo, и в файлу sudoers ковырялся, но всё равно что-то не получалось. Отладчик под моим пользователем как-то криво работает, а под рутом всё норм. И так, кста, не только с ddd. Мб, я криворуко всё это настраиваю.
>>2739146 На уровне компилятора -- нет, в лучшем случае есть костыли, которые детектируют опечатки и всякие очевидные ошибки вроде = вместо ==, но они обычно работают в виде подсказок и за тебя текст не редактируют. Может можно сделать их более агрессивными, типа чтобы они при сохранении файла исправляли, есть же форматтеры, которые при сохранении файла запускаются. Но это все равно хуевая практика, лучше поставить линтер и смотреть что он пишет перед запуском кода. В IDE линтер по дефолту должен быть включен.
Этот цикл остановится на 4-м шаге (когда u и v будут указывать на 4), но почему, после завершения цикла, u и v будут указывать на следующие (за 4-кой) элементы массива?
>>2739251 Ладно, не буду вас мучать! Операторы первым делом берут адрес следующего значения lea rdx, [rax+4] и записывают его по адресу, где хранится указатель, а только после этого сравнивают текущие значения, после чего, если они не равны прыгают в начало цикла. Поэтому и получается, что на выходе из цикла мы имеем указатели, увеличенные на единицу.
постфиксные операторы сначала отдают значение а потом вычисляют инкремент таим образом int i = 0; printf("%d\n",i++); //напринтил бы 0 а после принта i = 1 printf("%d\n",++i); //напринтил бы 2 а после принта i = 2
а вообще мне кажется я сам догадался в чем варнинг в поле структуры висит массив, а по механике у массива то же есть поинтер типоразмером в одну ячейку (1 байт это же чары) и крч он волнуется что типоразмер ячейки массива не совпадает с типоразмером поинтера который смотрит на массив
>>2739473 ты всегда можешь делать асмавставки для мануального управления, если тебе не нравится как работают эти операторы просто напоминаю
>>2739239 еще хотел сказать пару слов в книге Крнигана и Ритчи как раз есть галава где обсасываются строчные лагоритмы над массивами чаров, ну там апперкейсы ловеркейсы и все такое и как они устроены на каких принципах так вот довольно легко понять что внутри чаров или интов или других переменных лежат только нолики и единички, по сути как ты эти нолики и единички представляешь зависит только от тебя, можешь работать с символами как с числами напрямую например char c = 'a'; c = c + 20; printf("%c -> %d\n",c,c); // выводим с как символ и с как число
>>2739473 Анон, в корне ничего не меняется, только в регистры, которые в последствии сравниваются помещаются не указатели, а числа. Но суть остаётся той же: мы сначала в 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, и если не равны, то прыгаем в начало цикла.
>>2739675 не, понятно что сожрал, ведь код запощен без ошибок и со всеми явными кастами, в нем нет ворнингов но если убрать каст к типу поинтера в 24 строке будут варнинги, я про это писал компилер не знаю какой в икскоде, гцц наверн то же с99 стандартом копилит с11 нет в икскоде ну в моем нету
>>2739979 OpenGL жешь а для рисования нативных окошечек и оконных приложунек windows.h еще когда то давно я писал на Qt, но я бы не назвал это графической библиотекой, скорее это обертка над плюсами для упрощения всякой кастующейся фигни по типу обработки событий по дескриптору
а вообще философия си как бы намекает - сделай сам себе тот же транслятор CSS или Lua или MD или любого другого самописного скриптового языка при помощи которого ты опишешь графику в окне консоли или в окне виндов мэнеджера
в защиту такого способа я бы хотел напомнить что все 3 набора библиотек под жабку абсолютно нерелевантны до тошноты
вообще, если заводить разговор о рисовании графики будь то псевдографика в консоли, или полноценный рассчет лучей с аппаратным ускорением - во всех вариантах фундаментом построения будут всего две вещи: умение рисовать точку и умение рисовать линию. если с точкой все предельно понятно, то вот с линией не все так однозначно
да и вцелом мнение о том что в консоли пишутся какие то учебные программы а настоящие проекты это только работа с пикселями - неправда. на самом же деле разница лишь в средствах отображения вашей графики, в консоли аналогами пикселей будут служить символы (конечно со своими особенностями, символы консоли не квадратные и разрешение консоли то же не квадратное, поэтому для корректного отображения например круга или сферы нужно будет это учитывать). аналогично написать графику можно вообще не используя монитор, например через контроллер электрощитка здания, где аналогом пикселей будут служить окна на фасаде и включенный или выключенный свет в помещении. в общем зависит только от вашей фантазии.
но так или иначе написать тот же рейтрейсинг в псевдографике это задача того же уровня как и написать рейтрейсинг в полноценной игре, все рассчеты абсолютно такие же до момента вывода на "экран", разница начинается как раз в слое обработки при выводе на то или иное устройство вывода
а почему заменяются буквы в слове Word, если условие if не выполняется ни для одного элемента массива? по идее он же должен был вернуть то же самое, что я и ввёл, без шифровки
>>2740179 Неа. Это особенность компилятора новарнинги короче. К примеру, если ты создашь массив, и выведешь его в неправильном диапазоне, он будет выдавать случайные символы юникода в произвольных местах
>>2739473 Кстати, анон, если интересно, то вот так выглядит условие с префиксными инкрементом/декрементом. Отличие в том, что переменные увеличиваются/уменьшаются и полученные значения сравниваются, т.е., если с постфиксными инкрементом/декрементом сначала идёт запись текущего значения в регистр, после чего увеличенное/уменьшенное текущее значение записывается в область памяти переменной, и уже после этого происходит сравнение текущих значений, то в условиях с префиксными выражениями происходит сравнение сразу увеличенных/уменьшенных значений.
>>2740123 объясните мне кто нибудь почему массив на пике проинициализирован вот так? почему 'Z', } что это за пустое пространство после символа Z? это компилируется как '\0' ? наверное нихуя ведь нужно явно фигануть туда 0 или \0 как символ
ну я не буду придираться к методу инициализации, можно было канеш просто строкой инициализировать массив с авторазмером например
Alphabet[] = "XYZ";
или повесить поинтер на сегмент текста где будет висеть константная строка например так
char* Alphabet = "XYZ";
просто держать в голове что у строки в конце допсимвол '\0' вотличие от натурального массива символов
дальнейшая работа с этим ничем не отличается, точно так же в Alphabet[0] будет лежать 'X' если вытаскивать в виде символа
но я не понимаю что за пустое пространство после Z что это означает?
>>2741064 20ти байтовое целое можно пушнуть в канал вывода при помощи поинтера с шириной шага 20 байт, в стандарте таких длинных типов нет поэтому что то навроде такого будет
typedef struct { _Bool b[20]; } pointer;
pointer p = &a;
printf("%lld\n", p);
но я не уверен, %ll умеет в вывод long long'a но не в 20битное целое, а тот же puts пушит только строки, а у тебя в задаче число
интересная задачка на самом деле, пойду поломаю голову как на экран вывести число, с хранением и записью/чтением чисел так то проблем нет особых
>>2741070 Нет такого, насколько знаю, слышал только, что некоторые компиляторы могут в 128битные числа, но это не 20байтовое все ещё, есть либы для работы с очень большими числами, так называемая длинная арифметика, на этом мои знания заканчиваются
>>2741071 крч я думаю на регистрах просто не хватит памяти чтобы вычислить 20ти байтное целое так что все равно надо костылить и проще всего наверное накостылить через строки раз уж вопрос с выводом на экран всяких там гиперчисел песчинок на пляже омаха
>>2741073 Нужен цикл, в котором через арифметику указателей мы берём единицы и нули из памяти 20-ти байтного числа и складываем их в переменную. Каждые 8 шагов (через байт) приводим эту переменную к десятичному виду и это число выводим. Только из-за литтлиндиана цикл надо начинать с конца.
>>2741173 Проще, конечно, использовать особенно принтфа, которая позволяет вывести 10 байт, т.е. в переменную загоняем арифметикой указателей 10 байт, приводим к десятичному виду, и после выводим.
>>2741173 Мужик, а ты сколько программируешь вообще ? У тебя курс информатики в школе был или ты троллишь так охуенно? Просто с твоих постов жир течёт пиздец как, ты либо не очень шаришь за математику, либо охуенный тролль, а таких тут не надо, все таки жизнь новичкам портить не надо, а то некоторые на арифметике указателей Си бросают
Не хочу ебать свой ССД, но требуется загрузить файлы с телеграмма на гугл диск, можно ли это сделать путём выгрузки файла в оперативную память, а позже загрузить ее из оперативной памяти на гугл диск? Файлы размером в пределах 1,5Гб
>>2741173 Я не буду предлагать, но ты реально думаешь что у нас число, ты его засунул в 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);
>>2741430 у тебя ашипка %llu распечатает байтпоследовательность как ансигнеды а число ты засунул в сигнеды чаров ну и про 8 байт из 20ти мы уже тут обсуждали
вообще вот касательно 20байтовой задачи я думаю а вот плюсы не могут пушнуть в канал вывода такую байтпоследовательность? ну типа cout << xp; ??? прост если могут то почему бы не покопать как cout реализован в плюсах и не переложить на си рельсы
>>2741719 не, последний символ это '\0' символ конца строки обработка строк на этом принципе и основана ты пихаешь в функцию адрес начала строки и функция без определения размера уже знает что в конце строки будет символ \0 и читать надо до него например puts(conts char x) так работает да и спецификатор %s притэфа так же обрабатывается
в других вариантах переброса массивов в функцию ты вынужден передавать размер массива, функция изнутри не знает насколько большой твой массив, но только не со строками
>>2741744 принтани sizeof(Text) а еще можешь принтануть числовой вариант каждого символа и сравнить с табличкой ASCII юникодов чтобы понять чо там в строку запихалось
>>2741796 окей это ентер, ты оказался прав, мои поздравления а еще поздравляю тебя, ты только что научился делать юнит тесты и можешь не постить каждый вопрос сюда а провести тестирование самомстоятельно
>>2713428 (OP) Сап программач, хочу поделиться болью. Я очень много пишу на сишке, ну и я вообще люблю низкоуровщену и поэтому на ней зарабатываю: bare metal, Linux kernel modules и прочее. На работе до определенного времени спокойно писал bare metal на сишке, потом коллектив выступил за переход на плюсы, но со стилем написания исходников «си с классами» — против этого я не выступал потому что не видел в этом смертельного. Замечу только то, что у нас нет практики постоянного code review, потому что у нас небольшой коллектив и просто нет ресурсов на регулярной основе такое делать. Когда мы использовали плюсы в си-стиле стало чуть чуть удобнее, как минимум, объекты собирали методы в свою сущность. Но недавно начался полный пиздец, потому что человек, который имеет большое влияние на коллектив предложил перейти на самые последние плюсы (темплейты, концепты, хорошо я отговорил от std::string и std::vector). Архитектура полностью пошла по пизде, темплейты теперь везде нахуй, в некоторых местах архитектура была поменяна только для того чтобы «так удобнее написать на темплейтах», интерфейс тоже стал ужасным, а сейчас я сижу на созвоне и слушаю как челы спорят о том, как лучше написать концепт. И мне было бы похуй, если мне давали делать мои низкоуровневые вещи (на уровне регистров), но нет, реализовывай наши криво написанные концепты (некоторые концепты написаны только ради того чтобы концепт был). Говоришь им что написанные концепты говно и это перетекает в 2-3х часовой созвон с обсуждением как правильно написать концепт. На вопрос: «как концепты и темплейты помогут мне реализовывать низкоуровневые интерфейсы (uart, spi и прочее)» — но кроме: «ну можно будет статически проверить некоторые куски кода» — я ничего не слышал. За то время, что я убил на все это дело, я бы покрыл все тестами, написал эмулятор и крутил бы систему днями и ночами на x86. В общем просто хотел высказать.
>>2741934 Да, классы то же самое, только методы находятся в пространстве имен класса, а твоя функция sendMessage попадёт в область видимости текущего файла. А темплейты (именно статический полеморфизм) нереализуемы на чистом си
>>2741974 а... ну хотите полиморфизм тогда страдайте чо я могу сказать ооп паттерны вот это вот все говно с фабриками и вечным дебагом корявой наследственности жопы из говна а не говна из жопы, это же лучше чем pure c в котором ничо нельзя реализовать нахуй его вообще придумали говно какоето лол для дементивных как тут скриптомакака пишет
>>2741991 А что вы имели под темплейтами, если не полиморфизм? Еще темплейты удобны для задания параметров класса, которые не будут меняться в рантайме, например, буфер определить длину кэшурующего буфера для юарта: uart_class<256> foo(...);
>>2742087 Тебе лучше в асм-тред сходить, и вообще почитать/покодить на асме, если хочешь понять что такое память, как устроена память, как управлять памятью.
Раз речь зашла о памяти, то задам ньюфажный вопрос. Вот работал я с памятью только на уровне malloc(), calloc(), read() или write(), не превышая килобайта используемой памяти ща раз. А как с ней работают в больших приложениях, которые жрут по несколько гигов, типо всяких игровых движков и прочего?
>>2742356 >А как с ней работают в больших приложениях, которые жрут по несколько гигов, типо всяких игровых движков и прочего? А никак. Индусы просто засирают память, пока не придумают чипы мощнее.
>>2742356 Пишут полезные обертки - пул, из которого выделяют разные объекты для уровня, а потом целиком его уничтожают (защита от утечек) - стек (вариант предыдущего) - пул для объектов одного размера (скорость+экономия памяти)
>>2744288 Спасибо, еще вопрос: как напечатать символы массива, что бы один из них был большего размера чем остальные? Типа маленькие точки а потом огроменная
аноны может вопрос нубский будет, я просто никогда еще не писал с поддержкой вычислений на гпу, но вот хочу спросить если я объявляю registered float несколько штук, то на регистрах какого чипа они будут сидеть? на цпу или на гпу? и есть ли механизм как ручками выбрать нужные ргистры если допустим я хочу просчитать флоаты именно на гпу чипе?
>>2713428 (OP) Сап Аноны, я тут придумал очередной сюжет игры и друг мне предлагает закодить её на Си. Есть ли годные библиотеки которые бы позволили это делать быстро и легко? Я одно время пытался сделать игру на жс и знатно поел говна. В итоге забил. Потом ещё был небольшой опыт на джаве, там чуть лучше даже намного лучше, но тоже пришлось как следует поебаться с библиотекой и её установкой. Короче стоит ли браться за Си? Из целей вкатиться в этот замечательный перспективный язык и сделать хоть простенькую игру.
>>2744420 ебашь хоть на ассемблере всем поебать можете еще рассмотреть такие варианты игра на фортране игра на паскале игра на делфи игра на окэмле игра на руби
в любом случае язык лишь инструмент достижения целей, а си хорош тем, что для него нет нерешаемых задач
я вот подумываю над собственной реализацией гита потому что гит во первых тупой во вторых подпиндосский и хочу монолитный сервис, а значит либо ебаться с переносимостью, либо выбирать жабку
скорее всего я выберу жабку просто потому что на веб баунд нагрузках нет каких то заебов по скорости вычислений, а значит можно взять любое медлительное говно, главное чтобы приложунька везде работала, ну а это про жабу
но почему в играх не использовать си? там то как раз нужны сверхбыстрые вычисления в первую очередь, а переносимость уже вторична
>>2744420 >сделать хоть простенькую игру Ну это ты можешь сделать на Си, а что-то более красивое и сложное лучше кодить на плюсах из-за большого кол-ва библиотек под игры на плюсах. >в этот замечательный перспективный язык Чел, ты должен понять, что Си это отвратительный язык, единственный плюс которого это zero runtime. Всё остальное, что пишут, особенно всё, что связано со стандартами выше С89, это ебантизм, потому что есть более удобные высокоуровневые языки программирования, с которыми пытаются конкурировать стандарты С99 и выше. Поэтому, если ты не собираешься писать высокопроизводительные программы (всё что связано с драйверами, ядром ОСи, пизданутые числодробилки, где две альтернативы - Си со стандартом не выше С89 или ассемблер), то в Си можешь не вкатываться, либо ты можешь полгода-год потратить на ассемблер и Си (именно в таком порядке), чтобы лучше узнать то, как устроен компьютер. Этих знаний тебе будет более чем достаточно, чтобы освоить любой ЯП. Всё остальное, что будет иметь противоположную точку зрения от той, что я тебе привёл, что тебе будут писать местные петухи это от лукавого.
>>2744454 Чел, ты серьёзно? Регистр точки хочешь сменять, типа переводить точку в нижний и в верхний регистр? Короче, мой тебе совет это пойти загуглить, разобраться самому как напечатать "огроменную" точку, а потом прийти сюда и объяснить нам это.
>>2744639 >>2744313 >как напечатать символы массива, что бы один из них был большего размера чем остальные? Типа маленькие точки а потом огроменная Давай, чтобы тебя не продолжали троллить сразу отвечу. Увеличить размер шрифта только одного символа из всей строки ты не сможешь, потому что такой функции в терминале нет. Размер шрифта меняется сразу для всей строки, поэтому у тебя остается несколько вариантов: - смотреть эскейп последовательности для своей ОС и эмулятора терминала, а потом просто выводить нужный символ жирным шрифтом. - если у тебя строка состоит из символов в нижнем регистре, то выводить нужный символ в верхнем регистре. При этом стоит учесть, что для символов никаких регистров не существует.
>>2744739 А как, кстати, вывести то "огроменную" точку? Это получается, что нужно же её из каких-то элементов соединить? Или нужно окрашивать часть экрана?
>>2744743 Что значит огроменную точку? Ты задачу подробней опиши. Можно составить массив символов по нарастанию яркости и использовать его, например, ".,-:;c3#@". Но, думаю, что для твоей задачи это не подойдет и тебе нужно просто символ юникода вставить.
>>2744751 Да я вообще мимироходил. Не знаю подробностей задачи. Просто стало интересно как вывести "огроменную" точку. Как я понимаю из вопроса анона про эту задачу, что у него идёт ряд точек, сначала энное кол-во обычных точек, а после этого кол-ва нужно вставить точку, которая будет больше обычных, скажем, раза в 4.
>>2744757 >Просто стало интересно как вывести "огроменную" точку. Как я понимаю из вопроса анона про эту задачу, что у него идёт ряд точек, сначала энное кол-во обычных точек, а после этого кол-ва нужно вставить точку, которая будет больше обычных, скажем, раза в 4. Если для вывода используется терминал, то произвольно увеличивать отдельные символы не получится. Это тебе не ОпенГЛ, где можно умножить вектора на скаляр и изменить размер обьекта. В данном случае можно: использовать другие символы(т.е. заменить огромную точку на что-то похожее), рендерить изображение в памяти, а затем выводить его на экран(т.е. создать большую точку из маленьких точек), использовать жирный шрифт.
>>2744759 > рендерить изображение в памяти, а затем выводить его на экран(т.е. создать большую точку из маленьких точек) Примерно так и предполагал. Понял, анон, спасибо!
Рубрика ответов чат-гпт: В кодировке Юникод символы представлены шестнадцатеричными числами, называемыми кодовыми точками. Жирная точка, также известная как точка среднего веса, кодируется в Юникоде и имеет следующий код: 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, и вы увидите вывод жирной точки в кодировке Юникод в вашем терминале.
Обратите внимание, что поддержка Юникод-символов может зависеть от включенных шрифтов и настроек вашей терминальной программы.
>>2745485 Ну, мне он помогает, потому что я могу смело дизассемблить любые непонятные мне функции, и, читая дизассемблированный код, лучше понимать, как эти ф-ции работают.
Не понимаю как работают эскейпы. Во всех мануалах пишут что \b это бэкспейс, но принтф "0\b1" печатает 01. Еще пишут что \a это звуковой алерт, но он чота не звучит. Еще пишут, что \r это возврат каретки, возврат куда? Он просто с новой строки печатает как будто это \n.
В общем я ничо не понял. Объясните. Или эти эскейпы только на настоящих терминалах работают и мне надо блять купить стойку AT&T чтобы работала эта параша ебаная?
Задача напечатать символ, стереть, напечатать другой. Хочу попердолить псевдографику но не хочу раздувать хистори консоли всеми кадрами отрисовки, лучше стирать символ и печатать заного.
>>2745612 \r точно работает. Он возвращается в начало и можно поверху старой строки хуярить. Так делают все эти прогрессбары соснольные.
> Задача напечатать символ, стереть, напечатать другой. Хочу попердолить псевдографику но не хочу раздувать хистори консоли всеми кадрами отрисовки, лучше стирать символ и печатать заного. https://tldp.org/HOWTO/Bash-Prompt-HOWTO/x361.html
>>2745642 А в каких системах эти анси трюки работают?
>\r точно работает. Он возвращается в начало и можно поверху старой строки хуярить. Так делают все эти прогрессбары соснольные. Блять мой эмулятор терминала игнорит эту хуйню.
>>2745697 Да ничо не сложно. "0\r1" выводит 0 и 1 на разных строках. Я же говорю как \n Ладно пойду попердолюсь, чота работает не так как должно работать.
Окей я разобрался. В эклипсе эмулятор консоли (наверное как и в любой студии) не умеет в эскейпы. Родная консолька все стирает как и положено. Алярмы отменяются. Спите спокойно, жители моря.
>>2746444 Хммм А вот цвета не работают в родной консольке.
Я имею ввиду ANSI секвенции. Для курсор позишина все гуд printf("\033[%d;%dH",L,C); отлично отрабатывает. А вот обертка для цветов не отрабатывает. Сама ANSI строка задается как \[\033[<COLOR>m\] и в нее на место <COLOR> мы записываем например 0;32 (это зеленый цвет) Но как бы я не пердолил эту ANSI строку она печатает символ '[' заместо переключения цвета. Вот теперь я думаю мой эмулятор zsh не поддерживает цветовые секвенции ANSI и надо пердолить в tty например без гуев.
>>2746696 В общем я не знаю. На хабре пишут все гуд, в мануале пишут все гуд только для x-term'a. Но вот моя палитра "цветов" для zsh. И цветов я тут не наблюдаю.
В общем я думаю это проблема в эмуляторе, именно этот zsh не умеет в цвета и все тут. Болд, регуляр, лайт - пожалста, даже бэк залью если надо (правда только в черный), но вот цвета фигушки.
Ну и как мне блин написать реализацию cmatrix для этой залупы? Цветов то нет!
>>2746716 какой аррей? пиздец конечно у тебя разметка уебанская, как будто у тебя дисплей из складного метра (пикрилейтед) состоит у тя гетчар читает в ц, а потом если ц не 0 тогда ++ все 10 индексов аррея нахуя тебе это я не ебу, но ты так написал
ну судя по принтам ты там какие то символы должен считать я хз
>>2746729 а чо это такое на скрине? пхп какой то крч я не знаю где ты наебался анон, надо было юнит тесты хуярить на каждом шаге чтобы быть в курсе правильно у тебя считает вот здеся или нет, а ты походу нахуярил логику и ща будешь дебажить ее, удачи потыкай шаги вайла в дебагере
>>2746732 хотя с интами не должно прокатывать операция нот (!) это операция над булевыми и наверн надо кастарунть инт к улам прежде чем юзать булевы операции !(_Bool)found или просто флаг нормально объявить как булевый
вот я думаю теперь над твоей задачей, ну точнее не совсем над ней а над тем что 4 байта для хранения символа это дохера
вот на моей машине например юникод символы и вообще числа в интах ложатся в первый байт, потом после переполнения закрывается второй байт и так далее слева направо
и я тут думаю если в первом байте инта лежит символ, то как записать в оставшиеся 3 байта число повторений (ну допустим мы уже отладили улагоритм подсчета)
допустим трехбайтным поинтером я могу пихнуть в инт число и извлечь обратно это не проблема а вот как подобрать нужный сдвиг по адресу? пока что не могу придумать ничего кроме как ходить по инту однобайтным поинтером до второго байта и уже с его позишена перехватывать адрес в трехбайтный для записи/чтения
>>2746740 >надо свою матешу туплю надо просто локальный инт создать, прочитать в него три байта которые лежат в инте массива справа от байта в котором лежит символ затем заплюсовать локальный инт затем записать три левых байта из локального инта на место трех правых байтов инта массива где лежит символ в первом байте
бля дохуя операций и ваще ритчи писал что есть машины с двухбайтными интами, так что такое решение через чар поинтер даже лучше
Аноны, помогите разобраться, пожалуйста! Столяров пишет, что в Си отсутствуют средства ввода/вывода, а всевозможные printfы и scanfы - это библиотечные ф-ции, которые сами написаны на Си. Так вот, где в заголовочном файле stdio.h (и где искать этот заголовочный файл в убунте, там есть несколько заголовочных файлов stdio.h) мне прочитать код этих функций? Просто интересно как это реализуется средствами самого языка.
>>2746835 Могу ошибаться, но код ты посмотреть скорее всего не сможешь. Ты можешь посмотреть используемые библиотеки в директории /usr/lib, например. Используемые библиотеки у скомпиленного исполняего файла можно посмотреть через readelf, а используемые системные вызовы через strace.
>>2746835 >и где искать этот заголовочный файл в убунте, там есть несколько заголовочных файлов stdio.h Ты можешь посмотреть код библиотеки stdio.h, но ничего полезного кроме внешнего вызова ты там не найдешь. Основная реализация находится в системной библиотеке libc( glibc в linux), поэтому копай в эту сторону. Исходники можно найти в интернете.
>>2747120 >Мои догадки про то что именно этот zsh не умеет в цвета оправдались Это не проблема zsh, потому что оболочка этим не занимается, плюс она является ПОСИКС совместимой. Это у тебя эмулятор терминала цвета не выводил, потому что функция отключена была.
>>2747384 >Кто то может расшифровать? Это макрос или чо? И как оно работает? Ка Попытаюсь обьяснить как я это вижу, так что могу быть не прав. Это вариадик функция. Первым аргументом передается обязательная часть(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); пикрил
>>2747027 2 байта инт был на 16-ти битных машинах, на 32-х битных машинах инт вырос до 4-х байтов, в 64-х битных машинах инт размер не поменял и остался быть 4-х байтным.
>>2747615 Да ничего страшного, мы все тут сидим и умничаем друг перед другом. Дэнис Ритчи сам написал что надо не забывать делать сайзофы инта потому, что есть машины с двухбайтными интами. Я это не придумал.
Можно ли как то в сишнике инкапсулировать прототипы функций? Ну вот допустим я заинклюдил хидер и там лежать фукнции всякие. Можно ли как то сделать так, чтобы я не мог из мейна напрямую юзать функции, а только через обертки публичные? Ну крч как инкапсулировать то? Статик не решает эту задачу.
>>2748654 А если допустим не инклюдить, а компилить в отдельный объектный файл и потом уже мейком собирать? Тогда поидее статик ограничит область видимости до объектника и все. Разве нет?
>>2748152 В глаза долблюсь, сори >>2737970 Нубский вопрос по второму пику. Почему компилятор компилирует мертвый код и почему раз уж он его компилирует, то не делает свертку констант? В javascript этот же код будет условно одной строкой REX.W movq rax,0x600000000
>>2748884 >мертвый код Что значит мёртвый код? Это код, который показывает как выглядит программа, что на пике 1, в виде машинных инструкций. >REX.W movq rax,0x600000000 Я так понимаю, что интерпретатор джээс использует макросы, т.е. эта строчка, которую ты привёл, на самом деле, на каком-то этапе развёртывается в код, который похож на пик 2, поэтому и такое различие.
>>2749116 >Что значит мёртвый код Это код который никогда не выполнится или который ничего не делает. По идее компилятор должен понять что main не несет никакой полезной нагрузки и просто выкинуть этот код. >Я так понимаю, что интерпретатор джээс использует макросы Не, это как раз строчка скомпиллированого кода аналогичной функции на js, компилятор видит что мы просто складываем статичные числа и заменяет две операции a = 3; b = a * 2; одной операцией b = 6; Просто стало интересно почему С компилятор не делает аналогичную свертку. Может надо флаги какие-то задать?
>>2749226 Не странно. По умолчанию код должен быть такой какой пишешь, а всякая самодеятельность компилятора ведет к багам, поэтому это опционально под твою ответственность, если что сам себе злобный буратино.
>>2749226 В этом и мощь языка Си, потому что оптимизация это лишняя память, плюс лишние такты, которых может не быть на устройстве, под которое пишется код.
>>2749246 Уже давно на копеечном ембедде мощи больше, чем тебе надо, хуярят иотовые питоны и жабаскрипты. Это тебе к дедам на лавочке послушать про байты и такты.
>>2749472 Банкомат, который занимает, как минимум, кубический метр, и всегда подключён к сети, сравниваешь со шлагбаумом, "голова" которого не больше 0,008 кубического метра... Всё с тобой ясно, скрипто-макакыч.
>>2749481 Задачи банкомата может решать мк за полтора бакса, но функционал проверен комиссиями, стандартами и прочими капитализьмами. Купить полтора тонны сертифицрованного мусора дешевле, чем заниматься этим с нуля. Вообще, задачи бизнеса важнее твоей технической хуйни. Как только ты это поймешь, так перестанешь быть ойти-мальчиком, а станешь солидным господином. Но ты не поймешь, т.к. ты наёмный работник, а не господин.
>>2749488 Одна из задач бизнеса это максимизация прибыли, что включает в себя, также разумные траты на технические средства, которые могли бы обеспечить выполнение той задачи, которая на них положена, а это означает, что не нужно тратить много денях на доп. оперативную память и процессор с несколькими сотнями мегагерц, чтобы обеспечить быструю и не "лагающую" работу интерпретатора питона, на котором так приятно кодить скрипто-макаке, которую я нанял. >Задачи банкомата может решать мк за полтора бакса Чёт я сомневаюсь, что безделушка за полтора бакса сможет потянуть оптимизацию пайтона или жээс, так ещё и обеспечить "приятную" работу с сенсорным дисплеем.
>>2749501 Существующий мусор это дешево и работает с колёс, что и нужно бизнесу. Можно делать с нуля на будущее, но это противоречит философии постсовкого бизнеса, у которого суть получить прибыль здесь и сейчас, пока что-то не наебнулось. И это вполне разумно, не так ли?
>>2749521 Хочу до тебя донести, что твоя технологическая целесообразность очень редко пересекается с бизнес целесообразностью, для которой тебя нанимают. Тебя наняли выкопать яму, а для чего её копают и какими средствами это не твоего ума дело, если тебя об этом не спросили.
>>2749529 Изучать си и предоставлять услуги, или вкладывать деньги и получать услуги. Но ты не годишься ни для того, ни для гругого, по-моему. Ты из тех водителей троллейбусов, у которых какие-то фантомные амбиции. Да, любой хуй в постсовке имел окно, чтобы чего-то добиться. Сейчас этого нет. Сейчас в постсовке выжить это уже заебись, если у тебя есть возможность выехать и работать таксистом это уже замечательно. Не всем получать заработок на уровне потомственной ренты. Чисти трубы и живи достойно, сука, хули ты выебываешься?
>>2749547 >И это вполне разумно, не так ли? Скрипто-макакыч разорвался!!! Ладно, анон, хватит флудить в этом треде. Если хочешь позаниматься хернёй, то иди в б, и там загоняй свою философию, а нормальные ребята и так понимают, что из-за автоматизации, скоро и светофоры станут "умными", а для этого их нужно будет подключать к сети, чтобы мощные серваки, которые обладают овердохера памятью и суперпроизводительными процессорами, выдавая "красивое" окошко уведомляли оператора (скрипто-макаку), что в том или ином месте прогнозируется затор, следовательно он должен в "красивом" окошке переключить режим работы светофора. Но вот, чтобы светофор, своим маленьким микроконтроллером, понял, что скрипто-макакыч хочет преключить режим его работы, и нужны будут такие ребята, как я, и как многие из этого треда, которые напишут под этот маленький мк код на Си. И таких светофоров, шлагбаумов, турникетов, и т.д, и т.п. с каждым годом будет становиться всё больше и больше. Поэтому, анонче, флуд в б, а здесь только сишный, с ассемблерными вставками, хардкор.
>>2749529 Да лучше уж Си дрочить в свободное время, чем какой-нибудь лисп или еще хуже хаскелль. Хотя лисп еще минимально интересен за счет интерактивности, но это давно и в Питоне с Джулией есть. А в Джупитер и C++ запилили уже.
>>2749719 Да я хз откуда такая ненависть к Си! Это афигенный язык, благодаря ему и ассемблеру, я просто лучше стал понимать компьютер, да и благодаря этим знаниям, даже мой код на питоне стал красивее, лаконичнее, быстрее, просто потому что я теперь понимаю как бегают байтики в компьютере. Плюс к этому теперь ещё и логические операции со сдвигами обрели какой-то внятный окрас, просто я понимаю, что эти операции гораздо проще выполнять процу, да и благодаря этому теперь ещё и математика для меня совсем другой окрас обрела.
>>2749226 Это как раз логично, а не странно. Например для криптографии полезно размазать управляющие команды всяким мусором, чтобы очередной кулхацкер джиэсбибизян по дизасемблу не смог накодить кейген для очередной денувы.
>>2749769 >Да я хз откуда такая ненависть к Си! >Это афигенный язык, благодаря ему и ассемблеру, я просто лучше стал понимать компьютер Именно отсюда. Раз си помогает лучше узнать компьютер, его ненавидят те, кто ненавидит компьютеры, не хотят ничего про них знать. Большинство не хочет лезть разбираться в кишках компьютера, им надо наоборот, чтобы было проще, меньше думать, меньше делать, чтобы тык и стало заебись, чем дальше от компьютера, тем лучше, они стремятся к языкам более высокого уровня, более далеким от настоящей архитектуры железа.
>>2749980 Так уже придумали скратч. Зачем они теряют время на пустословия в топике морей, когда можно лампово чиллить на хайлевел джипег бейзед ультрапоредж лангуаге? Вопрос риторический, повторяю вопрос риторический.
>>2749968 Нет, денег больше не стал получать. Но и программированием занимаюсь не потому что тут все 300 кк/наносеки, а потому что мне это интересно, потому что я получаю некое эстетическое удовольствие, когда написанный мною код делает то, что я запланировал. А Си и ассемблер я стал изучать, потому что, кодя на питоне, компьютер для меня так и оставался магией, даже пытаясь освоить книги по его архитектуре. Или у тебя, дебича, всё меряется деньгами?
Аноны, что это такое? Зачем в этом примере приводить к типу uint64_t на пике 1? Мой код на пике 2 не принимает и выдаёт ошибку на пике 3, причём всегда после после 2^30. Собственно, вопрос в чём я не прав?
>>2750723 ну вот у меня теперь вопрос к знатокам. почему компилер идентифицирует единичку как инт? наверное зависит от флагов компила? ну логичнее же представлять единичку как ансигнед чар, чем как инт, а с флагами омпила наверное он еще и мог бы предугадать что ты тут подразумеваешь ансигнед лонги и представить единичку как ансигнед лонг (или ансигнед лонг лонг, наразных машинах это разные типы)
Тема про open и бинарные файлы.
Аноним02/07/23 Вск 15:25:40№2751027327
Добрый день. Изучаю Си. Так вышло, что в моём понимании fopen вызывает open и что-то потом делает.
Собственно вопрос: как open может открыть бинарный файл? Вот fopen("bla_bla_bla","rb") позволяет читать бинарный файл, fopen("bla_bla_bla","wb") записывает в бинарный (и создаёт, если его нет), а как такое проделать с open?
Мои попытки записывать через open+write приводили к появлению текстового файла.
не могу понять почему на пинус так и не накодили аналог conio.h с индикатором kbhit неужели кбхит ненужен? а если и так тогда через какие средства мне накодить самый обыденный интерактив: for(;;){ if(kbhit()){ switch( c=getchar() ){} } }
>>2751752 точнее нет не так вопрос должен звучать. вопрос должен звучать вот как - существует ли какое либо кроссплатформенное решение по замене гетча через кбхит? ну я не знаю, может читать байты из буфера консоли можно и на пинусе и на шинде одинаково (в чем я сильно сомневаюсь, команд лайн это какая то каляска по лекалам павершелла а не копия)
>>2751925 >>2751928 ну не знаю, я не буду дебажить твой код, но я не вижу у тебя мат окургления флоатов до интов, походу ты просто отрезаешь дробную часть
Объясните плз, как работает обратный вызов, для чего его вообще использовать? Сделал пару примеров с указателями на функции, где в функцию передается указатель и потом по очереди в цикле по указателю вызываются разные функции из массива указателей на функции. Но как при этом себя ведет поток управления? Пишут, что он идет в обратную сторону, потому и обратный вызов, но я не могу этого понять. Как работает стек при использовании обратных ввзовов тоже не понятно.
>>2752928 радиус это константа, на какую константу не умножай, с каждой следующей итерацией, они всё сильнее и сильнее тянутся к центру вплоть до сингулярности Вот как это выглядит (чем больше угол поворота, тем быстрее сплющатся)
>>2752943 Такие алгоритмические задачи надо делать на подходящем языке, как питон или бейсик. Вот когда отладишь алгоритм, тогда можно его переносить на си. Иначе непонятно, то ли у тебя в алгоритме косяк, то ли ты наступил на сишные грабли по незнанию языка или неосторожности, как например выход за пределы массива или неправильная арифметика чисел.
>>2752979 Бог дал человеку инструменты дебага, но человек не перестал млеть от мыслей о высоком уровне, и тогда Бог обозлился на человека, и сделал его скрипто-макакой.
>>2752979 Единственный язык, который нужен дополнительно, это ассемблер (nasm, так с ним много рарных книг), и то на уровне, чтобы ты мог читать дизассемблированный код. Знаешь Си и ассемблер, можешь дебажить, плюс правильно дизассемблить (как бы с элементами дебага, главное, чтобы можно было ходить по дизассемблированному коду по шагам), значит можешь приступать к фундаментальным алгоритмам. И поверь, ни одна книга, сайт, статья, препод, т.е. ни один источник информации, откуда ты будешь черпать её, посвящённый любому высокоуровневому ЯПу, не расскажет тебе о фундаментальных алгоритмах столько, сколько ты сам сможешь выудить, используя связку си-асм-дизассм-дебаг. А огрехи в понимании этих алгоритмов будут стопроц., потому что в их структуре (особенно, если используется любой высокоуровневый ЯП) столько уровней абстракции, что ебанёшься!!!
>>2753451 Да, ты кондовый снулист, который думает, что если он начнет прорабатывать букварь, то станет дохуя писателем-философом. Не станет. Будет дристать такими максималисткими выпадами в сторону всех подряд, пока не стухнет окончательно.
>>2753454 >прорабатывать букварь Скрипто-макакыч, ты пойди хотя бы один уровень абстракций пойми!! Как букварь, где описаны лишь символы, т.е. атомарные частицы языка, можно сравнивать с целыми языками, на которых написаны целые системы? Дебич, хватит здесь дристать! Просто пойми уже наконец, что ты ни за что не освоишь рекурсию на питоне, пока не посмотришь на то, как она выглядит на уровне машинных команд (на самом деле ничего сложного). Если ты до сих пор не осилил рекурсию, мы не виноваты. За что ты нам тут постоянно срёшь тупостью?
>>2753500 > > Будет дристать такими максималисткими выпадами в сторону всех подряд, пока не стухнет окончательно. Сколько лет, сколько лет прорабатываешь?
>>2753509 Что там искать, это главный инфоцыганский термин. Любого овоща можно вкатить в зарабатывание миллионов, но именно С НУЛЯ. Потому что у него нет никаких знаний, он НОЛЬ. А тут проработает вопросик с Анатолием Пиздунковым и уже ПРОФЕССИОНАЛ.
>>2753507 Ты типа ругаешься на то, что это долго? На самом деле, прорабатываю может полгода, даже меньше. Пара месяцев ушло на то, чтобы понять, что Си без асма не осилю, потом пара месяцев ушло на то, чтобы осилить асм на уровне, чтобы можно было бы читать дизассемблированный код. И сейчас прошло ещё, наверное, пара месяцев, когда я дизассемблю всё, что мне не понятно, продолжая изучать Си. Ясен пень, что всё это не без перерывов, тому что 24/7 не могу уделять Си, но то, что после освоение асма обучение ускорилось и улучшилось это сто процентов.
>>2753883 Чёт ты переборщил с тупостью! Ты бы хоть оглавление этих книг прочитал, а потом оглавление книги Вирта, и тогда понял бы, что это суть одно и тоже (практически). Только тут примеры на Си, а у Вирта на Паскале. Видать из-за жары сегодня и скрипто-макака с цепи сорвался, и другие аноны подтупливают...
>>2753774 Не могу понять, зачем нужны эти книги? Просто выложили бы исходники на гитхаб и всё. Зачем мне как дебилу перепечатывать с книжки? Что в башке этих идиотов творится?
>>2754949 Так, стоп. Переменный размер в каком смысле? Вот есть например японское предложение(условно), каждый символ будет(так же условно, я не знаю сколько там конкретно байт на символ используется) 2 байта, но тут вдруг в этом предложении встречается слово, написанное на английском, то есть умещается в 1 байт каждый символ. Это слово английское тоже будет на каждый символ 2 байта занимать, или тут будет какая-то вуду магия и в данном случае будет уже 1 байт? То есть половина предложения из 2 байт, а другая из 1?
>>2755200 просто это не совсем стыкуется с тем что я читал до этого. вот например я инициализирую переменную char, но пока не присваиваю ей никакое значение. Для неё выделяется ровно 1 байт (или ровно два байта) количество байт не может увеличиться или уменьшится после присвоения. Если в тексте есть символы не из аски, то компилятор заранее как то должен об этом узнать и кодировать всё двумя байтами. Если нет, то и смысла в двух байтах нет и на всё выделяется только один байт. \Что из этого неверно?
Как можно получить доступ к видеокарте чтобы отрисовывать пиксели? Я хочу для своих нужд написать простейшую графическую библиотеку, чтоб она точки да линии рисовала. Находил только гайды по SDL, но мне лень её изучать, хочу свою написать.
>>2755297 А так надо смотреть исходники mesa наверное. И кстати тебе действительно легче свою написать, чем изучить готовое, годами проверенное решение? оптимистично
аноны а вот такой вопрос допустим есть какие то данные (похеру пусть числа будут) как их организовать чтобы поиск по ним был максимально быстрый?
с одной стороны самый быстрый поиск проходит по б-три, но с другой стороны есть префетч сортированных массивов ну так и что быстрее то в итоге?
с одной стороны оопэшники переписали всю стдлибу под копи он райт для быстродействия, а с другой стороны соверменные железки диктуют откат к классике и оопэшники снова переписывают свою шарманку под классику с которой уходили
блять у меня реально зогошиза с этой хуйни начинается, храдварщики сознательно откатывают технологии на 50 лет назад иил чо?
>>2755666 >храдварщики сознательно откатывают технологии на 50 лет назад иил чо? Какие еще "технологии", лол? Все "технологии" были созданы для обхода костылей железа. И половину проблем, которые решают "технологии", можно было решить, отказавшись от x86 в свое время, но срыночек и нужные связи выблядков из intel порешали , поэтому имеем, что имеем.
>>2755675 >>2755677 а при чем тут костыли? бинарные деревья какой костыль железа обходят? за тайм ты делаешь шаг по массиву или шаг по поинтеру, а теперь хардварщики начитерили и за тайм ты либо делаешь шаг по поинтеру либо 10 шагов по массиву
>>2755675 >проблемы можно было решить, отказавшись от x86 в свое время... >"Весь старый мир мы разрууууушим! До основааанья, а затееем! Мы наш, мы новый мир построооим! С чистогоооо листаааа!" Слыш, тупое говно, это называется деградация, взять и заруинить достижения прошлого, откатившись в болото недоразвитости. Переписывальщики херовы, каждого такого пидараса надо клеймить как дегенерата и больше ни к чему не подпускать, кроме работы дворником и мойщиком полов, да и то с осторожностью, и там умудрятся нагадить всё испортив.
>>2755693 Шиз, деградация - это когда еще в 90х годах ты знаешь о том, что твой продукт говно и продолжаешь его пилить. Вот сейчас инцелам полная пизда, потому что лимита по нанометрам достигли, а расширяться больше некуда, архитектура говно, о чем, повторюсь, знали еще в конце прошлого века и другие компании решали эту проблему, но срыночек порешал.
>>2755698 слыш хардарщик билять хватит говно мне в жопу заливать атвичай пачиму ультрасовременные бинарные деревья с логарифмическим биг оу работают медленнее чем скуфидонские массивы с линейным биг оу
а ну к стенке становись, из за тебя проебываем алгоритмы
>>2755700 >пачиму ультрасовременные бинарные деревья с логарифмическим биг оу работают медленнее чем скуфидонские массивы с линейным биг оу Ты же сам ответил на свой вопрос постом выше. На одинаковой железной базе выбор правильного алгоритма или структуры данных могут зарешать, но если на уровня железа есть прикольные фичи, то можешь хоть обосраться со своими алгоритмами. Это вопрос уровня "Почему программы дидов, которые оптимизировали код сотни часов, лагал, пердел и свестел, а модный и молодежный питончик даже при сортировке пузырьком работает быстро?"
>>2755698 >рыночек порешал Я про то и говорю, раньше был качественный профессиональный софт, а сейчас браузерные высеры из говна и палок. Софт деградирует не по дням, а по часам, все плюются. Деграданты отбрасывальщики старого переписыватели дорулились, всё изгадили и опустили на днище.
Как наглядный пример, посмотри на линукс. Уже 40 лет пишут графическую среду, но всё никак не напишут. Каждый раз выкидывают старое и переписывают по новой, и каждый раз становится только хуже и хуже.
>>2755710 так я тебя и спрашиваю нахуя вы откатываете технологии взад дебилы вы дремучие рептилоиды сука с нибиру иншала вертел нибиру тваю маму рот наоборот
>>2755716 Какие технологии назад, шиз? Раньше ты пользовался хуйней Х, чтобы обойти косяк копроархитектуры. Теперь это пофиксили и ты пользуешься Y. А все твои технологии в ИТ остановились в развитии где-то в 80-90х. С тех пор ничего прорывного и фундаментального не изменилось. Даже современные ЯП пиздят фичи из старых и малопопулярных языков и выдают за неебаца прорыв.
>>2755719 сука ты чо меня бесишь рептилоид ты хоть раз назови блять этот косяк который обхиодит костыль в виде бинарного дерева тупая ты хуета блять дремучая заладил про костыли и пояснить нихуя не можешь выйди нахуй с треда
>>2755713 >Я про то и говорю, раньше был качественный профессиональный софт, а сейчас браузерные высеры из говна и палок. Софт деградирует не по дням, а по часам, все плюются. Деграданты отбрасывальщики старого переписыватели дорулились, всё изгадили и опустили на днище. Когда у меня приступы такой шизы находят, то я ставлю старую винду(хотя бы xp/vista(про линукс тех времен даже говорить не буду)) на некропеку из чулана и начинаю пользоваться. Сразу пропадают все эти манямысли про НАСТОЯЩИЙ софт дедоф. Это не более чем искажение восприятия и ностальгия.
>>2755720 >ряяя не смейте делать процессоры быстрее Лол. Причина подрыва, шизло? У тебя горит попа с того, что материальный мир побеждает твою идеалистическую хуйню? Если кто-то запиливает ускорение определенных операций на физическом уровне, то очевидно, что они будут работать быстрее всего остального. Наверное, если создадут такой процессор, который сможет нативно исполнять ФП код, то у тебя вообще анус треснет?
>>2755728 Какой вопрос, выблядок? Ты кроме своего рявканья ничего не с силах сказать. Сначала удивился, что физическая оптимизация оказывается эффективней программной, а потом из-за этого порвался и начал всех рептилоидами обвинять, которые как оказалось манямирок дегенерату сломали. Воистину долбоеб.
>>2755721 >я ставлю старую винду(хотя бы xp/vista(про линукс тех времен даже говорить не буду)) на некропеку из чулана и начинаю пользоваться Перевожу на человеческий язык: дегенерат пытается запустить хром под хр, тот не запускается, бабах, говно нинужно кал, виндоус11 фарева, во имя святого гугла, аминь
Какое там искаженное восприятие, когда биологический урод без мозгов, у которого восприятие реальности отсутствует за пределом одноклеточной браузеропараши и насасывания корпорации-барину.
Я правильно понимаю, что в такой структурке, если я буду выделять память динамически под data, то у меня при выводе contents будет выыводиться адрес, смещенный на 8 относительно наачла структуры?
Педерасты, объясните, почему сысоев выбрал размещение sentinel где-то в левом месте а не в самой структуре ngx_rbtree_t. Т.е. у него sentinel лежит всегда в каких других местах. Какой в этом смысл?
>>2756993 Причем тут троленг? Я тебе скинул вполне доступную реализацию getchar, дальше можно самому найти все что надо. Думаешь в glibc ты что-то найдёшь? там написано все так, чтобы любопытные глазки ТОЧНО НИЧЕГО не смогли понять, вот и гпл весь
>>2756996 меня интересует реализация гетчар а не его дефайны оберток над обертками так что это был траленг с твоей стороны ладно толку от вас все равно нет пойду дальше копать
>>2757116 смотря как создавать счетчик если создаешь вне цикла - можешь задумываться о размерах памяти если создаешь внутри фора - похеру локальная переменная будет уничтожена сразу как только цикл закончит работу
>>2756995 Ты тупой, если е читаешь чужие исходники и не умеешь их понимать. Исходинки великих людей. Замолчи и выйди из треда. От тебя толку нет. Ты ничего полезного в тред не приносишь
>>2757218 >Скрипто-макакыч Докажи, что ты не скриптомокака, глянь исходники величпйщего nginx'а, уверенно занявшую свою нишу от скромного автора, который даже не пиарил его. Потому что код - гениальный. Или ты вопросы только увроня char не char можешь пояснять?! Я же сказал, если ты мимо - то иди назуй просто, не отвечай на сообщения, которые тебе не нужны. Нахуй такие гниды как ты засираете инет своими комментыми нулевыми?
>>2757257 Пояснить не могу, потому что я только учусь. А ты, уёбок, если хочешь что-то серьёзное узнать, то разговор надо начинать не с ёбнутых обращений, а просто с хорошо поставленного вопроса; тогда, возможно, аноны сочтут, что ты достоин ответа.
>>2757264 Если ты только учишься, тогда хуле встреваешь в разговор. А моё обращение отсеивает дебилов, которые ждут на дваче (да и ваще в инете) этикета. А вопрос простой, хуле sentinel для красно-чёрного дерева расположен не в самой структуре дерева ngx_rbtree_t
да просто игнрьте этого даунидзе девопса пришел тут срать в тред своей хуетой заместо того чтобы начеркать себе юмл диаграммы такие тупездни достойны только информационной изоляции
>>2756857 алсо макросы гетчара и путчара вкомпилены намертво и голой реализации в стдлибе не будет реализацию можно было бы найти в исходниках гцц или силанга, но мне лень кажется прочитать сигналы на ножках проца гораздо проще, чем ковырять исходники компилера
на случай если анон захочет сам реализовать кбхиты
>>2757301 >>2757305 вообще это HAL ядра, тот самый нативный кусок позволяющий остальные части ядра, такие как например ретранслятор адресов или диспетчер процессов сделать более переносимыми
в поисках реализации я нашел пару статей с самописными ядрами и танцами вокруг IRQ_handler и каких то самописных потоков по образу цикличных буферов но мне проще называть такую структуру двусторонней очередью
однако такие танцы мне не нужны, я не форкаю ядро и не пишу свое, поэтому не стал сильно вчитываться
так что буду колдовать на асмовставках свой кбхит да я знаю что на стаковерфлоу лежит готовая реализация кбхита свой гетчар/путчар свои потоки
Есть прога с байтоеблей. Она падает в какой то момент. Дебагер не подключается по причине того, что исполняемый файл слеплен из разных исходников. Для дебага хочу писать printf ("text\n"); fflush(stdout); но программа падает и ничего не выводит
двач, допустим я через принтф несколько строк вывел как вернуть всё на первую строчку и запробелить что бы всё типа удалилось (обьясните, как обьяснили бы своей училке по русскому)
>>2759228 >бойся 228 когда пудришь носик ты печатаешь в консоль символы туда где стоит каретка | есть юникод управляющие символы последовательности секвенции как удобнее \b вернуться назад на 1 символ и \r вернуться в начало строки есть анси если твой терминал умеет жрать анси есть написанные на основе этих штух библиотеки, например curses https://www.ibm.com/docs/ru/aix/7.2?topic=concepts-curses-library ну и конечно же есть ответы в гугле )
>>2760056 Сук в голос... Я понимаю, что у инцеллов g при любом раскладе стремится к бесконечности, но мне интересен ответ самого автора цикла.
допустимое число функций.
Аноним09/07/23 Вск 20:02:34№2760116462
Добрый день. У меня теоретический вопрос. В результате реверса специально сделанных программ мне удалось прийти к предположению, что число функций в c в рамках одной компиляции ограничено. К примеру пусть имеется такая программа: int f1(){} int f2(){} int f3(){} ... int fN(){} int main(){}
Теперь вопрос: Какое наибольшее значение N в такой ситуации? Я правильно понимаю, что какой-нибудь gcc не будет работать при достаточно большом N?
>>2760116 Во-первых, первоклассному траллю, на мой взгляд, мешает сажа пикрилл один. Во-вторых, кол-во функций всегда можно загнать в константу ОСи плюс один шурупишь о чём я? В-третьих, могу сделать смелый вывод - ты наиглупейшая скриптомакака, которая пытается траллить тред умных ребят, а потому...шёл бы ты отсюда подальше, дебич, пока обоссаны, у тебя, только карманы за щеками
>>2760190 >Тут старперы любят вонять, как они байты ебут Ахахах, узнаю почерк "любимого" скриптомакаки! g чему равно? >>2760196 Ещё раз, дебильнейшая скриптомака, у тебя второй цикл имеет условие: >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))
Так о чём ты хочешь ещё узнать, дебич? Ты пытаешься троллить в стиле майндфак??? Но из-за твоей тупости у тебя это не получается, скриптомакакыч. Хотя, то, что ты задал интересно с точки зрения внимательности, следовательно, "когнитивки".
>>2760216 Пиздос! Потому что в где-то в программе "объясняется" что такое g, Либо, работает не так, как изначально планировал ты, когда писал программу.
>>2760223 Я имею ввиду, что ты конч!! Какое ещё двойное умножение, блять???? У тебя явное деление на g. Короче, дебич, кидай код на пастебин, где нельзя будет обвинить макабу.
>>2760260 Здесь тоже мусор находится. D в этом коде вообще ничего не присваивается. Единственное что можно предположить, что какой-то конченый компилятор занулил стековую переменную(что очень маловероятно), к тому же в коде в функции main() типа нет, 89 стандарт какой-то. Тролляка со своей говно laba1.c завайпал тред, поздравляю
Здравствуйте. Нашел одну программку(https://github.com/henrypp/memreduct/tree/master), ради интереса захотелось разобраться в исходниках и вижу тут такое(пик1), в проекте идет какой-то относительный путь, видимо, текущего проекта(не работал под вижлой), но на гитхабе то этих исходников нет, я если загружу эти исходники, то у меня не будет этих файлов, которые используются в программе. Как ее собирать-то тогда? бред какой-то
>>2759791 Анон, а что ты имеешь в виду под байтиками, на которые ты хочешь влиять? Очевидно, что влиять ты можешь, отталкиваясь от кол-ва итераций, где "1" это переменная b, которая у тебя уменьшается на 14 в первом цикле, а "2" это уже введённая мною переменная, которая считает кол-во итераций во вложенном цикле. А вообще твой внутренний цикл выглядит так - пикрилл один. Участки кода, которые я выделил, зависят от переменной g, поэтому ты можешь ею манипулировать, чтобы не вводить доп. переменную. И, кста, у тебя какая-то бестолковая первая итерация (можешь глянуть на пикрилл один) на переменную d.
>>2760650 >Не b, а с. b нужна для второго цикла. Ну это да, просто у тебя b приравнивается с уже в условии фора, следовательно, т.к. фор начинается с проверки условий (т.е. нет никаких инициализаций), то первым делом программа прыгает в участок кода (машинного), где происходит проверка этого условия, т.е. получается, что первым делом b присваивается с уменьшенная на 14, и дальше уже программа исходит из этого. А так да, уменьшается на 14 с.
>>2760667 >Указание типов и соблюдение разметки это смузи хуйня чтоли? Да ладно тебе! Это было весело. Если бы я вчера самогоном не нахерячился, то всё уже вчера решил бы (заместо того, чтобы писать вчера тут пьяную хернь), а так этот код мне сегодня даже снился в каком-то лютом, пьяно-угарном сне.
>>2760683 Анон, давай ещё что-нибудь подобное неси сюда.
>>2760683 При чем тут питон, когда речь о читаемости. Ты же, что бы ответить на пост, воспользовался гринтекстом для разметки. Почему это не стоит делать в коде для читаемости?
Подскажите , пожалуйста, есть ли в C перегрузка функций? Я раньше думал, что нет в чистом 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 ГБ. Я прав или где-то ошибаюсь?
>>2762680 да я и сам люблю хлебнуть кефирчика с ягодами под макарошки с сосисками ой прости, переведу на ваш да я и сам люблю полакомиться смузи под напоритан
>>2762734 какие спецификаторы? спецификатор области видимости сообщает компилятору область видимости спецификатор регистровости сообщает компилятору желание присобачить переменную непосредственно на регистр спецификаторы знаков сообщают как следует читать старший бит спецификаторы длины сообщают компилятору о модификациях длины байт для чтения записи данных чо там еще есть?
>>2762746 это "гнезда" для форматного ввода/вывода чтобы туда подставлять переменные я не копал реализации форматных вводов/выводов, но думаю там что то по типу войд поинтера который кастуется к типу который вычисляется из форматной строки например %d вычислит что нужно кастануть к (int*) типа того
>>2762746 Форматные специкаторы. printf не знает тип переданных переменных, он видит только кусок памяти на вершине стека, где эти переменные одна за другой + выравнивание. scanf там видит только ряд указателей на что-то.
а вообще если тебе надо принтануть строку то можно и гораздо легче делать например
printf("%s", a); puts(a);
без всяких там вайлов и проверок на символ конца строки к тому же например компилятор считает две строки записанные друг за другом одной строкой а твой алгоритм так считать не будет
Вот такой вопрос назрел. Функция ведь где то хранится, правильно? Ее так сказать исполняемый код загружается в рам? Тоесть она сама по себе занимает место в раме? А если функцию реализовать макросом? Макрос так же занимает место в раме? Имеет ли смысл переписывать функции макросами вообще? Часто встречаю фул листы макросов в юниксовых микропрограммах, которые заменяют простые двустрочные функции. Зачем это сделано? А если например больше строк замакросить? В чем профит так сказать?
>>2765297 Могу ошибаться, но таким образом ты инлайнишь код, чтобы не вызывать каждый раз функцию. То есть, этот макрос просто подставляет записанный код на место его использования.
>>2765409 Потому что в строке есть символ конца строки. Слово из 5 букв Hello если записывать посимвольно имеет длину 5 байт, а если как строку то 6 байт.
>>2765409 потому что sizeof возвращает размер массива в байтах, а строка это массив символов, ограниченных нулем. Размер строки заранее известен на этапе комплияции, так, строка "Hello world!" на самом деле является "Hello world!\0"
>>2765399 >>2765377 Да нечего тут объяснять. Вот цитата из книги Ван Гуйа про программирование на ассемблере, из которой можно понять, что макросы выгоднее тогда, когда есть очень большое кол-во вызовов одной и той же ф-ции, следовательно, код становится объёмнее, но зато производительнее:
При многократном использовании в программе одного и того же набора ин струкций можно создать функцию и вызывать ее каждый раз, когда необхо димо выполнить эти инструкции. Но для функций характерно снижение про изводительности: при каждом вызове функции поток выполнения переходит к вызываемой функции в некоторой области памяти, а после ее завершения возвращается обратно в вызывающую программу. Вызов функции и возврат из нее требуют определенного времени. Чтобы избежать подобных проблем с производительностью, можно вос пользоваться макрокомандами (или просто макросами – macros). Как и функ ция, макрос представляет собой последовательность инструкций. Макросу присваивается имя, и когда нужно выполнить этот макрос в коде, вы просто указываете его имя, возможно, сопровождаемое аргументами. Важное отличие от функции: во время ассемблирования везде, где в исход ном коде встречается «вызов» макроса, NASM заменяет имя этого макроса на набор инструкций, записанных в его определении. Во время выполнения не происходит никаких переходов и возвратов, потому что NASM уже вставил машинный код во всех необходимых местах. Макросы не являются функциональным свойством языка ассемблера Intel, но эта функциональность предоставляется NASM (или другой версией про граммы ассемблирования). Макросы создаются с помощью директив препро цессора, и NASM использует макропроцессор для преобразования макросов в машинный язык и вставляет инструкции машинного языка в соответствую щие места в коде программы. Макросы позволят улучшить скорость выполнения кода, но они увеличива ют объем кода, потому что во время ассемблирования инструкции из опреде ления макроса вставляются в каждую локацию, где используется макрос.
>>2765436 >Ну а вот применительно к современным процам как оно? А хз! Надо эксперементнуть! Написать простенькую программу, которая будет вызывать овер9000 раз одну и ту же ф-цию, а потом ту же прогу, которая подставит овер9000 раз один и тот же макрос в код, и запустить эти проги через какую-нибудь утилиту вроде time.
>>2766064 То же об этом думал. Но замер времени на эвм необъективный когда прога исполняется в авм слое. Объективные замеры могут быть на слое самой ОС.
Ну или самый близкий к объективному замер - читать регистр в котором хранится число тактов, надеясь на то что проц параллельно не будет тратить такты на какой то другой процесс.
>>2766065 >надеясь на то что проц параллельно не будет тратить такты на какой то другой процесс. Ну тут же математика, которая позволяет просто вычесть, либо прибавить кол-во тактов.
>>2766105 Я имею в виду, что у той же утилиты time кол-во тактов, которая она тратит на запуск программы всегда одинаковое, т.е. этими тактами можно пренебречь, суть же в том, что time запустила процесс (записала куда-то время запуска), а после того, как процесс вернул управление time вычла из времени окончания процесса время начало процесса. Правда, я не знаю точный алгоритм этой утилиты, но логика подсказывает, что алгоритм должен быть подобный, т.к. в такой реализации эта утилита не лезет в сам процесс и не мешает его тестировать. Если кто-то знает как робит time, то поделитесь инфой, ибо мне самому это интересно.
>>2766162 Да блин просто прочти какие нить доки по time.h все ноги оттуда растут и никакой волшебной палочки нет. Как я уже писал замеры на авм слое необъективные.
>>2766184 >никакой волшебной палочки нет А хотя.. А вот что насчет UTC? Она ведь где то просчитывается параллельно. Или нет? Понятно что если в ОСи стоит синхронизация с интернетом то UTC пингуется и возможны веббаунд шумы в вычислениях, но поидее она так же параллельно должна считаться на камне, только вот на каком? Ну неужели на центральном?
>>2766195 Чёт ты, по-моему, перебарщиваешь! Даже, если программу запускать без замера, то время же всё-равно процессор будет просчитывать, поэтому этой твоей заморочкой тоже можно пренебречь.
>>2766196 Ну тогда у меня только одна идея. Вкомпилить тестовый кусок в ядро для замеров. Только так можно дать объективную оценку скорости выполнения.
>>2766213 Я нашел ответ без трогания ядра посредство kmload например. Отдельные инструкции (по крайней мере на х86_64) не фетчатся на кешлинии. Зато инструкции функций фетчатся на кешлинии, но если хочется максимальной оптимизации их надо выравнивать по кешам проца. Ну дальше то вы сам знаете.
Крч вердикт такой.
BigO и классические оптимизации больше не работают. Пишите древний медленный код и хардварь сжует его быстрее, чем "оптимизированный".
>>2766764 Если на процах с кешлиниями - функции быстрее макросов, массивы быстрее связных списков. Если на процах без кешлиний - макросы быстрее функций, связные списки (ака б-три) быстрее массивов.
>>2766690 причем тут bpf и хабр вообще. задача какая нахуй, твердо и четко? >Вкомпилить тестовый кусок в ядро для замеров нахуй что-то вкомпиливать в ядро для объективности замеров, вы ебанутые?
В общем аноны, у меня трабол. Пару дней уже пишу аналог cal/ncal потому что мне ваще посрать на его функции по выводу григорианского календаря или юлианского. Мне нужны заметки по датам вот и все. Но я столкнулся с рядом проблем.
Проблема номер 1 - как бы проще вытянуть из файла структурки? Я пробовал fscanf но этот пидор не возвращает EOF хоть вот обоссысь. Гавно какое то. Я пробовал fgets и потом раскладывать строку по структуре в том числе при помощи atoi() и всякое такое, но это пизда дрочь ебаная, шаг в право шаг влево сегментейшен фаулт.
И вообще вот поскажите если я fgets прочитал в условный char str[], то как мне положить строковый литерал куда нить в другое место, чтобы потом из структуры по тупому чар поинтер на это место поставить и забыть?
Проблема номер 2 - я заебался бороться с АНСИ стандартом. Вот я разметил себе два поля слева и справа одно для календарика на месяц (уже распечатал все красиво) и для всяких там тасков. Но когда я пытаюсь вернуть каретку наверх чтобы напечатать правый блок у меня тупо затираются уже напечатанные строки. Тоесть был например напечатан календарик на 10 строк, делаю MoveUp(8) и остается 2 напечатанных строки календарика. Блять!
>>2775375 Не подходит. Там по структуре должна лежать строка произвольного размера. Числа числа числа флаги и строка.
Так что fgets самый норм варик с последующим разбором.
Лучше подскажи, вот если например я положу байты из char str[] в локальную хуету char str_copy[], то после удаления локальой хуеты там останется литерал? Ну если я туда поинтер загоню он найдет этот кусок или кусок то же исчезает?
>>2775384 Хотя чот я туплю, можно же салоцировать просто кусок байт какого нужно размера и сразу заебшить на него поинтер.
А как в итоге два текстовых блока напечатать? Опять собирать супердлинную строку и за раз ее ебашить путсом? Бля вот я капец как не хочу этот прием юзать, но пока не вижу решений. АНСИ неадекватно кареткой управляет.
Ну и в чем я не прав? Я не понимаю где блять косяк то? Алоцирую, разбираю строку на детальки (это работает заебись), переключаю поинтер на некст, некст не алоцируется.
есть какой нибудь однострочный метод определения ширины консоли? по символам всмысле. да я в курсе там буферы хуюферы, подключи курсес и не парься хуярься. а есть вот 2 строки ебаных мне больше ничо не надо кроме как знать ширину по символам в момент захода в мейн
Как решаешь проблему написания "подобных" структур данных?
Я сам предпочитаю Си остальным языкам, но в программах то и дело приходится реализовывать множество списков/стеков/очередей/..., которые мало чем отличаются между собой. Естественно само написание доведено до автоматизма, но иметь десяток похожих методов "push" - сомнительная практика. Можно конечно макросами обернуть, но выглядит это не очень.
Имхо, шаблоны в C++ являются самой полезной фичей, которую добавил Страуструп. Причём тот их вариант, который описывается во втором издании "Cpp prog lang" уже достаточен.
Есть вопрос по поводу порядка байт. В памяти переменная u будет представлена как 0xddccbbaa, почему при сдвиге вправо на 16 бит мне выдает 0xaabb, как если бы это было big endian?