Это копия, сохраненная 25 мая 2020 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Пожалуйста, пользуйтесь https://ideone.com/#, https://wandbox.org/ или https://pastebin.com/ для вставки кода, если он длиной больше нескольких строк или содержит [i] или ∗.
Что читать:
- Brian Kernighan, Dennis Ritchie "The C Programming Language": http://www.cypress.com/file/56651/download
- Stephen Prata "C Primer Plus, 6th Edition" (2014): относительно свежая, знает про C89/C99/C11, описывает различия, объемная (около тысячи страниц), годная, с вопросами, упражнениями и ответами. Читать после K&R или до.
- Zed A. Shaw "Learn C the Hard Way" (2015): годное пособие для гуманитариев для гуманитариев!
- Немного примеров хорошего стиля: http://www.oualline.com/books.free/style/index.html
- ООП, например: http://www.cs.rit.edu/~ats/books/ooc.pdf
- Стандарт ISO/IEC 9899:1999 (C99): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf (драфт)
- Стандарт ISO/IEC 9899:2011 (C11): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf (драфт)
- Черновик стандарта ISO/IEC 9899:202x (C2x): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2385.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://github.com/kozross/awesome-c
Онлайн-утилиты:
- https://godbolt.org/ - Compiler Explorer позволяет посмотреть выхлоп компиляторов для введенного куска кода (больше полусотни разных версий компиляторов).
- http://cdecl.org/ - С Gibberish ↔ English помогает читать сложные сишные декларации.
Прошлые треды:
- №51: http://arhivach.ng/thread/510484/
- №52: http://arhivach.ng/thread/529928/
- №53: http://arhivach.ng/thread/529929/ >>1593083 (OP)
Читай чужие исходники. Прочитай APUE для *nix, рихтера и руссиновича для винды, потом вкатывайся в интересующую предметную область.
>Читай чужие исходники.
Мне нужно не как код писать, а философия программирования на Си. Я не понимаю как Си взаимодействует с ОС, как пишут сетевые программы, как пишут кроссплатформенно на Си, вот это вот все.
>Прочитай APUE для *nix, рихтера и руссиновича для винды, потом вкатывайся в интересующую предметную область.
То есть изучать API ОС?
я не читаю русских авторов, всё слишком заумно и сложно постоянно обкладывают всякими ёба-терминами. мания у наших писать всё время книгу каким-то агадемическим языком. западные проще гораздо читаются
> Я не понимаю как Си взаимодействует с ОС
Ты дергаешь либу за функцию, либа что-то делает.
> как пишут сетевые программы
APUE для *nix, Network programming by Jones/Ohlund под винду. Как конкретно организовывать программы, подсматривай у других, ну и книги тоже есть.
>>10827
Где ты увидел русских авторов?
Самому написать что ли. Если взять тот-же clang, походу там есть куча уже готовых тулзов для автокомплишена, парсинга синтаксиса итд. А в качестве апи для гуя gtk, для кросплатформы. И забацать по быстрому идеху своей мечты?
Под винду то? VC/VS закастомь, плагины попиши. Поинтереснее будет думаю. Clang уже со студией совместим кстати, сам на таком билде сижу.
https://pastebin.com/KmqvnGJH
> do not forget about quotes ... comments
> забывает о кавычках и комментариях
Все правильно сделал?
ну это понятно, я так набросок кинул. чисто первое предложение сделал, кавычки, цитаты я тоже сделаю. я имел в виду сам принцип правильно я понял задания или нет? чтобы семантически правльной по смыслу была программа.
По-хорошему [(1]) нихуя не верная программа, но для того, чтобы это обработать, нужно про массивы знать уже хотя можно скобки в int запихнуть побитовыми операциями, на 16 уровней хватит точно.
да понимаю, я.
ну я не знаю массивов пока.. начал язык с нуля сразу с книжки k&r. я думаю что он эти задания даёт с целью закрпления того что я прошёл в первой главе. циклов этих, скобочек, назначения переменных и прочих. думаю у него для массивов отдельные задачи припасены впереди.
Они объявлены уже во второй библиотеке "драйверов", и линковщик все это дело связывает вместе. Таким образом, корневой либе не нужно знать детали реализации, например, устройства хранения данных.
Проблема! Хочу эту хуйню инлайнить. Т.е. если имплементация __driver_storage_block_size возвращает тупо 512 то мне нахуй не нужно, чтобы основная либа мутила вызов функции, чтобы получить 512. Надо, чтобы линковщик сам понял, что надо блять, захардкодить 512. У меня стек по пизде от этой хуйни!
Что делать?
Норм. На самом деле я просто ньюфаня местная и я просто боялся что тебе 19 лет или 20 или 21, что ты младше меня и я такой дегенерат. Но вроде бы пока на своём уровне держусь.
> Надо, чтобы линковщик сам понял, что надо блять, захардкодить 512
Для начала делаешь -flto, если не помогает - тащишь нужные функции в хедеры, делаешь их static inline.
Я так и сделал. Охуенно получилось, только он падла посрезал мне interrupt vector. Ты часом не знаешь, как заставить gcc не трогать .S файл в плане оптимизаций? Ну или не трогать секцию, например.
Я нихуя в этом не понимаю, для меня ассемблер это темный лес. Что такое директивы? Куда тут засунуть volatile?
https://bugs.launchpad.net/gcc-arm-embedded/+bug/1747966 (первое сообщение про KEEP и последнее про порядок файлов).
Ебать-колотить! Передвинул ассемблер в самое начало и все собралось заебись!
Я задал конкретный вопрос. Ты уводишь от темы.
Никто и не заставляет все фичи крестов использовать. Я по минимуму, только сахарок для удобства. А всякие обсуждаемые на C++20 возможности даже не понимаю.
Макака, пошла нахуй. Такие дегенераты не нужны ни в C, ни в C++. Катись обратно в свои скрипты, раб.
Строчка типа (dsfsgh{sdfsd)fsdf} проходит без ошибок, хотя она не кажется мне верной.
Какие инструменты уже есть? Массивы? Циклы? Функции (с рекурсиями)? Указатели с malloc-ом?
Ты не отвечаешь, загрузил твою книгу.
Массивы идут до задания 1-24. Фигнёй страдаешь, сделай массив на 10к элементов, этого хватит на любую адекватную си-программу - вряд ли где будет вложенность хотя бы сотого порядка, а 10к хватит уже совсем почти на всё.
массивы я делал только на уровне char m[10], ну ты понел.
цикл for и while про switch он написал в следующей главе расскажет
ну функции знаю как писать самопальные, про рекурсию знаю(по предыдущему яп) здесь не проходил рекурсии, но фанкции проходил.
про указатели вообще не понял тебя.
>>11326
и что мне этот массив даст? как через массив то это сделать? я не понимаю.
>только на уровне char m[10]
Такого уровня достаточно. Не нужна не рекурсия, ни функции, простого char m[N] хватит.
Что-то типа такого (писал прям на ideone, мог накосячить): https://ideone.com/kgiiid
спасибо, огромное, анчоус. я очень признателен тебе, что ты даже сам полез в эту книгу пока я спал и раскопал там всё проходил ли я. ты очень много времени потратил на то чтобы помочь ньюфане, спасибо тебе ещё раз огромное
спасибо за решение ещё раз, я просто там про const не знал и это всё, но уже загуглил. сделаю по твоему варианту.
Можно убрать все const, они не необязательны и нужны лишь для человека (кожаного мешка).
Алсо, gcc
А, дошло, потому что 4 это скаляр и во втором случая запятая это не оператор, а сепаратор, как при перечислении аргументов. Сорян поцыки
Во втором случае сначала выполняется присваивание, а потом запятая с более низким приоритетом, как и должно быть.
В первом случае вычисляются скобки (с наивысшим приоритетом), в рамках скобок вычисляется запятая, и уже только потом присваивание.
Зачем прикручивать какие-то понятия сепараторов и скаляров, если из приоритетов получается такой же вывод? В твоём примере нет сепараторов, так как нет вызова функций, разве не так?
Постинкремент же должен увеличить x уже после выполнения данного выражения, значит, порядок выполнения должен типа быть такой:
Он видит, что у первого x постинкремент, запоминает, что после выполнения выражения нужно увеличить значение на 1
Видит второй х, который равен 10, как и первый
Дальше два варианта:
1) Выражение закончено, его значением является значение последнего операнда (10)
2) Но там ещё где-то инкремент (11)
А на практике вообще инкрементируется х сразу, как только встречается постинкремент, и значение x в обоих случаях 11, как и выражения
Я хуй знает, почему так...
Да, я тупанул жёстко. Таблицу с приоритетами помню, но меня переглючило и я снизу-вверх приоритеты воспринимал лел давно уже сижу...
Постинкремент выполняется после того как переменная отдала своё значение, а не после выполнения выражения.
Тебе надо поспать. Совсем обпрограммировался уже.
Можешь использовать побитовый сдвиг, наверное
Это сложный вопрос ты медленно но верно засасываешься в бесконечную бездну байтоёбства, до точки невозврата осталось не так много... Пока что ты ещё молодая и шутливая ньюфаня...
https://www.cyberforum.ru/blogs/18334/blog69.html
Читай статью там ответы на твои вопросы.
А у тебя есть дискорд? Дай дискорд! Я бы тоже порешал задачи, можно и обсудить какие.
Пидр
Я, например, пердолюсь с 32-х разрядными ARM, и там желательно использовать 32-х разрядные типы, особенно во всяких алгоритмах и циклах, иначе будут выполняться дополнительные команды на конвертирование в 32 разряда и обратно.
У меня прогресс уже, благодаря анонам и гугл разобрался в интеджерах и одну половину программы написал. но у меня теперь другая проблема: вычислить диапазон float чисел, как это делать я хз
>но у меня теперь другая проблема: вычислить диапазон float чисел, как это делать я хз
float.h
А вообще посмотри стандартную библиотеку C, что бы представление хотя бы иметь. Она не большая.
Тебе, кстати, ещё их вычислить надо, а не только из хеддера вывести. Задание внимательней перечитай.
>Тебе, кстати, ещё их вычислить надо, а не только из хеддера вывести.
вычислить минималки у unsigned чисел, потому что у них минималок нет.
да, я читаю там в книжке есть ссылки на приложения по этим двум бибилиотекам.
потому что я их вычислил же. ты на код смотри. они имели ввиду вытащить константы и где нету констант вычислить нужно.
Мне кажется, здесь старик Ритчи имеет в виду вывести из констатнт и вычислить без использования констант.
> Какие доводы использовать C++ вместо Си
Шаблоны, неймспейсы, constexpr. Особенно последнее.
>>11487
> Зачем в си все эти short, long, long long, double нужны?
В 1990 году кто-то написал код, в котором был 16-битный myint. Из-за этого в 2020 году 64-битный процессор, скрипя и спотыкаясь (pipeline stall) на каждой инструкции старается считать в 16 битах. Вот чтобы эта история осталась фантазией, размеры к примитивным типам не прибивали гвоздями. Потом, правда, осознали, что получилось не очень, и сделали еще int_leastN_t/int_fastN_t, но макаки продолжали тайпдефать инты в фиксированную ширину.
я твой ответ про типы интеджера вообще не понял, анон. слишком я ньюфаня уж ещё для этого всего.
unsigned int i = 0;
while (i + 1 > i) { i++; }
print("unsigned int max: %u\n", i);
Для signed можно закрыть глаза на UB, сказать -fwrapv и сделать аналогично unsigned. Для плавающей точки можно узнать размер мантиссы, найдя момент, когда i + 1 будет равно i + 2, а размер экспоненты получить банальным вычитанием. Хотя я не помню уже, что там в задании требуется.
Да там уже ответили выше, я проебал пост просто. Суть в том, чтобы размер интов придумывали разработчики конкретного компилятора, и чтобы они выбирали размеры, которые проще всего обрабатывать процессору, для которого пишется компилятор.
спасибо, анчоус, частично понял. мне нужно время чтобы осмыслить это.
Вычислить программно?
Предположим, что о внутренней структуре числа ничего не известно (про мантиссу и прочее) и известно лишь что значения доходят до примерно равного значения по модули в положительных и отрицательных. Ещё придётся учесть, что float-ы переполняются.
Я бы вот такое написал: https://godbolt.org/z/S6DGPg (чтобы понять define просто замени type на тип и name на имя функции - я не знаю в каком виде шаблоны си, и потому просто через дефайн сделал много функций - лучше чем ctrl+c/ctrl+v на миллион строк)
К переменной прибавляется добавка пока число остаётся положительным и продолжает прибавлять, и добавка удваивается по тем же правилам. Если переменная становится отрицательной, то значит максимум достигнут и нужно снижать добавку, пока не подберёшься к нужному значению. Если t2-t1==t2 (переменная с плавающей запятой дошла до бессмысленной бесконечности и больше операции с ней не несут смысла), то значит тоже нужно уменьшать добавку. Вроде бы корректные значения вышли.
>>11733
>просто не понимаю как можно коллективно сидеть и решать
Я не предлагаю коллективно сидеть и решать. Просто интересные задачи потом сверить друг и друга, может быть кто-то более интересную концепцию найдёт.
Например, мне интересно посмотреть как ты с комментариями и экранированием символов в строках через \ разобрался, но спрашивать это в треде не уместно, тому что флуд.
>Например, мне интересно посмотреть как ты с комментариями и экранированием символов в строках через \ разобрался
ты имеешь ввиду задачу в которой нужно было удалить комментарии из кода си программы?
А потом ты такой пересобираешь 16-битным компилятором, и твой ответ неверен, потому что UINT_MAX может быть 65535.
я не разобрался. я продолжил книгу читать и дошёл до 2-1 задания сейчас на нём сижу, потом откачусь назад 1-24...
>В 1990 году кто-то написал код, в котором был 16-битный myint. Из-за этого в 2020 году 64-битный процессор, скрипя и спотыкаясь (pipeline stall) на каждой инструкции старается считать в 16 битах. Вот чтобы эта история осталась фантазией, размеры к примитивным типам не прибивали гвоздями. Потом, правда, осознали, что получилось не очень, и сделали еще int_leastN_t/int_fastN_t, но макаки продолжали тайпдефать инты в фиксированную ширину.
Сук, нахуй так жить?! Все эти ебаные киворды, я его рот.... Братан, нахуя вникать во все это байтоебство? Я просто не понимаю. Смысл в чем? Ты же вероятно не пишешь ОС. И даже не пишешь стек сетевых протоколов. Нахуй так жить, расскажи? Какие цели, зачем все эти базворды?
А кто нибудь пробовал складывать два указателя?
> зачем все эти базворды
Какие? Это базовые вещи. Предполагается, что если ты вкатываешься в Си, то до или после этого ты осилил что-нибудь фундаментальное по архитектуре, и хотя бы смутно представляешь, как работает процессор. Ту же "архитектуру компьютера" таненбаума хотя бы.
> нахуя вникать во все это байтоебство
Чтобы писать быстрый код, чтобы делать низкоуровневые вещи. Если тебе не нужно байтоебство - нахуй тебе си?
> Ты же вероятно не пишешь ОС
Зато написал несколько эмулей, например.
Мне вообще 21, я сижу у мамке на шее уже 2 года, из образования только шарага. В итоге как-то решил сделать ВАЙТИ, начал учить питон, там html\css, но проблевался от всего этого гавна. Но вот C почему-то зацепил нравится, его учить хотя я понимаю что занимаюсь хуетой и работы не найду на нём, но мне почему-то настолько уже похуй на ирл что я давно всё на самотёк пустил..
Короче это просто нравится, я вообще знаю только то что на этом языке драйвера сейчас пишут, а даже для ос предпочтение C++ отдают. Может быть я когда-нибудь в C++ вкачусь, но только после Cи и это явно нескоро будет с такими нулевыми знаниями как у меня.
Извиняюсь за вниманеблядство.
Нормальный человек:
>Решите задачу
>Вот
>А так?
>Ммм, падажди-ка, тут так, а тут эдак, ясно. Вот.
Пердоля:
>Решите задачу
>Вот
>А так?
>Э? Что? Ваша задача неправильная и не нужна. Идите нахуй!
>Если тебе не нужно байтоебство - нахуй тебе си?
Потому что могу, потому что хочу, потому что это язык общего назначения.
Хмммм. Понимаю, что это сишный тред. Но вброшу свое охуенное решение https://pastebin.com/WXqNzR4H. Вроде как тут же разница в языке не особо играет роли. Про комментарии забыл, но там тот же принцип вроде как.
Хотя нет, понял в чем фишка комментариев, нужно не учитывать скобки которые в них попали. Ну, это вполне легко, просто проверяем, что последний элемент на стеке открывающих это начало коментария и пока его конец не найдем, ничего в стек открывающих не кладем. У однострочного закрывающим будет '\n', у многострочного */, только нужно не массив символов использовать, а массив строк. Ну или чуть поебаться с символами.
По-моему это всё таки маразам какой-то зачем ритчи такое ебанутое занятие давать? Тот анон всё правильно понял, зачем эти рассчёты того что уже рассчитано вручную?
Спрошу тут.
Короче хочется подноготную изучить получше, т.к. на практике часто бьюсь лбом о том, что не знаю, что под капотом.
С чего лучше начать:
ASMx86
Linux
Таненбаум архитектура ПК?
Вопрос довольно тупой, но на самом деле вводит меня в ступор. Т.к. архитектуру +\-, ну очень начально я знаю.
АСМ без примеров какого нибудь линукса и понимания его ядра может стать несколько не очевидным. (пару асм микроконтроллеров я знаю и знаю что без понимания уровня выше это хуйня).
А линукс - а начальные знания линукса, могут оказаться не тем что я от него ожидаю
>как тут же разница в языке не особо играет роли
Развеселил, лол.
У тебя (у меня твоя) программа падает от строчки "}", если что. С комментариями и строчками самое интересное же, там есть всякие многострочные строки вида "asaf\"a//s\
sdg\\fa"
И то же самое с комментариями, которые /**/
>не знаю, что под капотом
Nand to tetris (он же nand2tetris) гугли - и вперёд! Там как раз весь подкапот: от логического "и-не" через проектирование собственного канплюхтера к написанию и запуску на нём тетриса. Все стадии от и до.
Ещё вариант - купи себе книжку Харрисов Digital Design and Computer Architecture, простенькую ПЛИС-плату с али и всё то же, что выше - фигачишь от "и-не" к созданию компа.
У Массачусетского универа есть курс nand 2 Tetris. Ты начинаешь с одного логического вентиля not and, и начинаешь на hdl создавать логические операторы, биты, регистры, память, алу, целиком комп с переферийными устройствами, потом пилишь виртуальную машину с ассемблером и компилятор си под нее.
Не знаю насколько ещё больше можно узнать что под капотом.
Курс платный, но можно спиратить.
мимокрестовик
Лол, great minds think alike.
>>12953
Слишком глубоко копнули, я по совместительству электроникой и микроконтроллерами занимаюсь, так что мне нужно не настолько глубоко и конкретно х86, причем было бы круто в современном контексте с практическими примерами.
Т.е. интересует какие регистры обычно каким образом дрочатся, что в них лежит, как реализуется соглашение о вызове, переключение контекста и прочая хуйня.
Я потому в линь и полезть думаю.
Да, скобки в данном случае никак не меняют приоритет.
>>12780
> зачем эти рассчёты того что уже рассчитано вручную
Задание:
> by printing appropriate values from standard headers
and by direct computation
Хотя там скорее всего сдвиги имелись в виду.
>>12973
Таненбаум, потом любая книжка по асму для x86 (посмотри только, чтобы не с доса начиналось - все эти сегменты и int 21h тебе в жизни вряд ли пригодятся, и понимания не прибавят, особенно в x86-64).
>зачем эти рассчёты
Эти расчёты для того, чтобы понять представление чисел разной разрядности и почему у них именно такие пределы.
> Развеселил, лол.
Ну ведь серьзно тут разницы особой нет. Там стеки, тут стеки. Мне просто лень было си вспоминать.
> У тебя (у меня твоя) программа падает от строчки "}", если что
Я просто чет не подумал что кто-то передаст такую строчку.
Быстренько переделал, чтобы и комменты поддерживало. Можно будет потом нормально переписать, чтобы такой хуйни с кучей ифов не было.
https://pastebin.com/GkKjyZqd
>никак не отображена фича x86 класть старшую часть результата умножения в dx?
Это забота не си, а компилятора - си этого вообще ни разу не обязан отображать. Напиши ассемблерную вставку на полторы строчки или используй long long же.
>>13144
>Там стеки, тут стеки.
Я бы не стал использовать стек в реальной задаче, например. Идеалогически тут нужен стек, но намного эффективнее по памяти и быстродействию использовать массив. В случае переполнения заводить ещё один или просто массив+стек - вряд ли большой уровень вложенности будет в типичном коде.
Ты же понимаешь во сколько десятков раз твоё решение с дополнительными стеками и другим выделением-освобождением памяти, регулярками и другой дичью будет менее эффективнее одного прохода с массивом и несколькими переменными-флагами для комментариев и скобок? Это же просто дичь невероятная, прикручивать регулярку сюда.
Давай я склею или найду кучу исходников и проверим время по фану? В шарпе есть возможность учитывать расход памяти с учётом внутренних затрат твоих стеков и регулярок? Просто в холостую (без выхода раньше времени в случае ошибки) запустить на крупных файлах (дефайны могут сломать всю малину), при этом тестовые строчки вроде "}" оно должно верно проверять, естественно.
Ответь в 53 (прошлый) тред, чтобы не мусорить в этот тред, если интересно.
> Я бы не стал использовать стек в реальной задаче
> намного эффективнее по памяти и быстродействию использовать массив
Ну это толсто даже для этого треда.
Реализация Stack в .NET (как и у любых других вменяемых людей):
> private T[] _array;
Да, не намного, верно.
Именно поэтому, если использовать стандартный плюсовый стек (на деке), то для 100 элементов он вызывает 2 new, а для 1000 - 10 new и 1 delete. И потом после использования нужно будет ещё всё это очищать. Для вектора ещё хуже. А куча медленная, если есть возможность обойтись без неё - лучше так и сделать. Не знаю что это за тип в шарпе, но вряд ли он работает лучше без внешней информации о количестве элементов в общем случае.
Я просто поехавший, не обращай внимание.
Для 100 элементов рукописный костыль обгоняет стандартный стек на деке в 7 раз (на векторе в 11, и даже для единоразового вызова malloc в 3), для 1000 - 3 (5), для 100000 - 1.2 (3).
>>13255
А какие должны быть?
Такое внутреннее представление выбрали.
https://ru.wikipedia.org/wiki/Число_одинарной_точности
Анон, что-то куда-то не туда ты, кажись, рулишь! Прям как я в своё время. Тоже считал, что "слишком глубоко копаю", а в результате просрал кучу времени. Сейчас жалею, что таки не начал "слишком глубоко" копать. Оно, кстати, оказалось намного проще, чем изначально думал.
>я по совместительству электроникой и микроконтроллерами занимаюсь
Ну, я тоже этим занимаюсь. Точнее, микроконтроллерами в контексте мехатронства.
>так что мне нужно не настолько глубоко и конкретно х86
Фундаментальная ошибка у тебя тут. Тебе на примере какой-нибудь простой - лучше, учебной - архитектуры нужно понять, как оно в принципе всё устроено и работает. Шагнуть к частностям типа конкретных не-учебных архитектур будет совсем несложно.
>причем было бы круто в современном контексте с практическими примерами
Мне кажется, это будет херь типа "покажи приёмчик". Ты нахватаешься частностей, а фундаментального понимания в голове так и не будет.
>Т.е. интересует какие регистры обычно каким образом дрочатся, что в них лежит, как реализуется соглашение о вызове, переключение контекста и прочая хуйня.
О, вот это классика! Подозреваю, что ты взялся за ассемблер и относишься к нему, как к обычно-языку типа си, джавы и т.д. А на изучение асма как раз нужно заходить со стороны цифровой схемотехники. Поверь умудрённым собственной глупостью анонам.
Итого: Не еби мозга и не пытайся обмануть жизнь! На примере "детской" архитектуры пройди это всё: от уровня логических вентилей до высокоуровневого программирования. И не читай Таненбаума этого сраного! У него книжка обо всём и ни о чём.
Про вещественные числа тебе скинули ссылку, а в целочисленных всё гораздо проще.
Можно на примере char разобрать. Предположим, что char имеет размер 1 байт, тогда unsigned char будет иметь диапазон значений от 0 до 255. От 0 потому, что unsigned не имеет отрицательных значений и это минимальное значение байта когда во всех разрядах 0 (0х00 в шестнадцатеричной СС, 0000 0000 в двоичной СС). До 255 потому, что это максимальное значение, которое можно представить одним байтом в котором во всех разрядах 1 (0xFF в шестнадцатеричной СС, 1111 1111 в двоичной СС).
В signed char самый старший бит отвечает за знак, 1 - это отрицательное число, 0 - положительное.
-128 == 1000 0000 в двоичной СС
-1 == 1111 1111 в двоичной СС
0 == 0000 0000 в двоичной СС
127 == 0111 1111 в двоичной СС
Для других целочисленных типов с размерами 2 байта, 4 байта, 8 байт и т.д. всё аналогично.
Господи, когда вы начнете полный контекст читать. Писал выше, на примере детских - знаю все это. На AVR асме писал проги, на других 8бит асмах пишу вставки.
Мне интересна именно практическая х86 ака серьезных процов с защищенным режимом и их взаимодействие с ОС.
Интересно сколько здесь юзеров в треде. Наверняка не мало. Так вот, вы что-нибудь уже написали? Хочется увидеть реальные проекты. Какой смысл изучать язык ради изучения. Где работающие программы?
В питоне модно сделать исполняемый файл, который будет работать на других ПК? Или обязательно надо питон ставить каждый раз?
можно
есть всякие py2exe, python freeze и всякие другие
но они все устроены так: берется интерпретатор и засовывается во внутрь бинаря
крч полная хуйня, на питоне лучше desktop аппликухи не писать возьми c#
Сказали же блядь, С#.
Ncurses просто.
>isalnum
Аллаху акбар.
Пиши названия нормально блядь, а не как дебичи, что стандартные функции писали у них были на то причины, что все равно не делает им чести
хоть бы код свой сначала проверил прежде чем кидать.
>>13595
>а в каких случаях нужно использовать эти unsigned, short и лонг
Ну signed, unsigned в зависимости от того, нужны ли тебе отрицательные числа или нет.
А про short и long.
Да, что хочешь то и используй. Главное, чтобы результат выражения/операции попадал в диапазон значений типа. Обычно просто int используют и всё. Если тебе нужны будут специфичные типы ты сам это поймёшь (это скорей всего будет связанно с оптимизацией по памяти, по скорости выполнения, специфическими структурами данных и т.п. Пока тебе рано ещё об этом думать).
И лучше посмотри stdint.h из стандартной библиотеки и возьми за привычку использовать типы оттуда, потому что там разрядность гарантированна стандартом.
учите си в 2к20, дак открывайте исходный код modern си проэктов и читайте его, к пример гугловскую фуксию..
удачи ..
анон я сделал, определение интедежеров по типу переполнения, ручное вычисление. щас скоро код скину. с floataми пока всё туго, не понимаю нихуя. скоро буду к вам приставать с ними.
https://pastebin.com/rHpxn65x
https://pastebin.com/Q20Bmgcz
Вот, анчоусы. Решил задачу 2-1 из k&r теперь и с ручным вычислением диапазанов целых типов. Там вычисления в районе 10-20 секунд идут подождите, вывод не сразу будет. Этот метод переполнение же называется, да?
>>11904
Анон, твой код бесконечный цикл создаёт. Не работает, он.
Осталось только с floatами разобраться
Я запостил свой код чтобы вы оценили как вам.
>И лучше посмотри stdint.h из стандартной библиотеки и возьми за привычку использовать типы оттуда, потому что там разрядность гарантированна стандартом.
я возьму это на заметку, анчоус. спасибо, но потом. меня сейчас интересует строго книга k&r её пройду и если там этой библиотеки не косунь, потом ещё твою посмотрю.
нет, я медленно всё переварию. здесь мне очень много помогают и кидают ссылок и я всё это читаю. пока я ещё до твоего пост даже не дошёл, анчоус.
а смотрел твой код и после незнакомой библиотеки закрыл вкладку. потому что я учусь по книге мне итак нелегко, а здесь ещё в нагрузку всякие незнакомые библиотеки о которых я вообще не знаю. я уже писал уже неоднократно что меня интересуют только решения при помощи инструментов описанных в книге на тот момент когда появилась задача.
извини, анчоусы, но варианты с незнакомыми мне функциями, библиотеками и прочим с чем я ещё не знаком я не рассматриваю пока.
Она не нужна. Просто float и double не достаточно, потому я ещё 128-битную плавающую запятую прикрутил для проверки.
Вот без неё. Там нет библиотек, и max_float я раскрыл без дефайна, можешь только на него смотреть проигнорировав другой код. max_float превращается в max_int заменой float на int без изменения другого кода.
https://godbolt.org/z/vyrk8E
ну не совсем уж без всего continue и <stdlih.h> мне тоже незнакомы. но я попытаюсь разобраться.
><stdlih.h>
Не нужен, случайно оставил.
>continue
Синтаксический сахар, во всех случаях можно заменить на цикл без него: https://ideone.com/8BYmnI
Ещё добавил чтобы на каждом шаге значения переменных выводились для long long и для float, чтобы было понятна суть алгоритма.
спасибо, анчоус. буду смотреть.
спасибо, идеально. мне там всё понятно. буду теперь на основе этого разбираться и высирать свой кодэ, спасибо ещё раз. скоро решение скину как с floatами. а потом вернусь 1-24 со скобками допиливать
> изучение асма как раз нужно заходить со стороны цифровой схемотехники
Это совершенно лишнее, если у тебя не embedded. И даже в таком случае некоторое время можно без этого понимания жить.
> как к обычно-языку типа си, джавы и т.д
Это и есть обычный язык. Для программиста x86 ничем не отличается от виртуальной машины этой самой джавы. Даже если ты полезешь в конвейер и ниже.
анон, а как работает пустой цикл for(;;) без аргументов? я что-то не понимаю. читаю сейчас твой код и не могу понять как пустой for работает. там же условие должно выполняться чтоб он работал а его нету.
Можешь заменить на for (;1;) или while(1). Просто бесконечный цикл до return-а.
Всё ещё не уверен, что это хорошая (полезная) задача - 1.24 в разы более программистическая, чем какая-то фигня, где нужно знать про специальные значения по типу inf, про количество значащих запятых (1e40+124e20 строго равно 1e40, что может быть не очень очевидно) - всё это на стадии, когда ещё даже не знаком с continue/break точно лишь замусорит голову, лучше что-то полезное изучить.
>Можешь заменить на for (;1;) или while(1). Просто бесконечный цикл до return-а
спасибо, я уже провери у себя. да это просто цикл бесконечный, просто в первый раз с синтаксисом проебался.
>Всё ещё не уверен, что это хорошая (полезная) задача - 1.24 в разы более программистическая, чем какая-то фигня, где нужно знать про специальные значения по типу inf, про количество значащих запятых (1e40+124e20 строго равно 1e40, что может быть не очень очевидно) - всё это на стадии, когда ещё даже не знаком с continue/break точно лишь замусорит голову, лучше что-то полезное изучить.
Всегда можно будет вернуться с более большими знаниями и переделать. В любом случае лишним не будет. Сегодня желатлеьно 2.1 доделать, а потом 1-24
а ты ещё функции вначале не описываешь. в k&r они сперва строчку функции делали, а потом уже её саму писали в конце. надеюсь ты понел о чём я
разобрался, анчоус, в алгоритме твоём. прикольный, сам придумал или где увидел когда-то? анон, а вот когда я делал +1 постоянно это же переполнение называется, да?
спасибо, анон. огромное возьму на заметку. алгоритм хороший ты мне подсказал, я теперь его буду везде применять когда нужно будет узнать максимально возможное кол-во чего либо.
а вот здесь в библиотеки флоатов, много различных вариантов их все нужно выводить и рассчитывать? я честно говоря даже не каждый из них понимаю...
отклеилось.
Тому что это был код для целых, и под минимальным подразумевалось отрицательное с максимальным модулем, а не число больше нуля с минимальным модулем.
Для дробных стоило бы вовсе другой алгоритм сделать, чтобы для 300 степени не требовалось под 300k шагов, а log(300)*k шагов.
https://ideone.com/LEgATu
Можно заметить, что значение получается ниже чем -38 степень. Там идут так называемые денормализованные числа с пониженной точностью (умножение на 0.75 не изменяет значения в последнем шаге), про которые можно вовсе не знать, если ты не связан напрямую с вычислительными методами.
анон, я пока книгу продолжу читать и на упражнения забью, т.к. у меня уже мозг тупо не соображает. может быть я потом вернусь к ним. ты реально тут мне так всё загибаешь, слишком сложно уже
Почему у меня UINT_MAX и ULONG_MAX в <limits.h> имеют значения -1? gcc
Потому что я тупой, всё, дошло до меня. Пздц, стоило только в тред пукнуть... извините
Короче, знаете, как в <limits.h> определены UINT_MAX и ULONG_MAX? 0xffffffff и 0xffffffffUL
Я всё понимаю, но ничего не понимаю. Почему, если константу-адрес максимального unsigned int'a просто превратить в unsigned long-константу, должны получится разные числа? И как мне вывести само число printf'ом? Эта задача заставляет ебаться меня вовсе не с тем, что предполагал автор задачи, мде...
Ну, не "определены", наверное, это же именованные константы, я не знаю, как они и где хранятся, но это неважно
Для laba1 чисто поебать
Сейчас заметил ещё такую хуиту:
unsigned char i = -13 "печатает" i как 243, как и положено
НО unsigned int оставляет -13, хотя, по идее, должно быть, как с char'ом
Меня эти байтоёбские перипетии с ума сведут, объясните, умоляю...
>должны получится разные числа
Уточню, что я понимаю, почему они разные с U потому что представление разное, дополнение до 2, вся хуйня, а почему L как-то его меняет с тем же количеством байт, я не понимаю
>И как мне вывести само число printf'ом?
%d для signed, %u для unsigned. Ещё можешь написать (long long)n и вывести его через %lld, чтобы гарантированно.
printf не знает тип, который ты передаёшь. Ты можешь туда хоть float засунуть под %d, и он напечатает float предполагая что переданные биты - это биты целого числа; естественно выведенное значение не будет иметь ничего общего с числовым значением флоата.
Бля, объясни что ты делаешь и что у тебя получается, в коде желательно, словами ты не умеешь
Вот это тебя смущает? Что только unsigned char работает в соответствии с ожиданиями?
https://ru.wikipedia.org/wiki/Printf
Ищи в поиске по статье "продвижени". Продвижение типа. Там даже конкретно про unsigned char указано, вроде бы.
>Мне интересна именно практическая х86 ака серьезных процов с защищенным режимом и их взаимодействие с ОС.
Там внутренняя кухня так меняется каждый год, каждое новое поколение, что в /hw/ у амуде-интело-срачеров в режиме 24/7/365 жопы горят, каких подробностей ты хочешь?
В х86 настолько помойка в системе инструкций что там существуют аж 3 команды (int 80h, sysenter, syscall в 64-битном режиме) делающих одно и то же.
> практическая х86 ака серьезных процов с защищенным режимом и их взаимодействие с ОС.
Взаимодействие через прерывание и передачу команд.
Взаимодействие с устройством из юзермода, в nix, например, идет через крайне замороченную и дырявую абстракцию типа "специальный файл" обычными fprint fscan , но когда нужно сделать что то странное типа настройки передать - то через системный вызов ioctl
А зачем в линуксе развели эту бадягу, с устроством-файл и этими "тут играем, тут не играем а тут ioctl"
Есть ли способ узнать размер константы? strlen() не подходит, нужен настоящий размер, а там в середине могут быть нули. Компилятор же знает, есть ли способ вытянуть это знание?
>Разыменовывание в char дает его размер - 1.
Ой, действительно, это же не указатель на массив. Нет, тогда не получить по buf его размер, делай sizeof("abcde").
>делай sizeof("abcde")
Так получается литерал-сирота без ссылок на него.
Попытался накостылять решение. Какого хрена???
Почему у меня на двух разных компиляторах, микрософта и борланда эта скотина конвертирует в указатель, выдавая "4", а на сайте нормально размер литерала "6"?
https://ideone.com/VIRj03
>Так получается литерал-сирота без ссылок на него.
Ну ты так его создаёшь. Хочешь знать размер, делай массивом, а не указателем.
>Таких строк много, нужно копипастить
Копипасти. В чем проблема?
>define нельзя переопределять.
Зачем его переопределять? Каждый дефайн на один литерал.
>Вопрос был про получения размера литерала, а не массива.
А что не так то? Какой размер тогда должен быть по твоему? Даже с терминальным нулем по середине нормально измеряет.
Мне кажется, ты не понимаешь что такое копипастить код когда нужно выполнять несколько одинаковых действий. Обрати внимания, что код одинаковый, кроме собственно литерала, чтобы можно было добавлять и удалить произвольное количество действий простой копипастой и ничего не ломалось.
Мда.
Так вот, литерал - это уникальная константа. Поэтому и дефайны должны быть на каждый дефайн свои
#define YOU_LITERAL "you"
#define ARE_LITERAL "are"
#define DUMBER_LITERAL "dumber"
Поскольку в сях нельзя включать директивы препроцессора внутрь других, то для этого пользуются инклюдами.
#define LITERAL "one"
#include "printsize.inc"
//в конце можно #undef LITERAL
#define LITERAL "on"
#include "printsize.inc"
Здорово. Спасибо за хитрость и дополнение.
Чтож, как я и подозревал, ты не понимаешь что такое литерал. Например, 5 это буквально число пять. Ты же пытаешься работать с ним как с переменной.
Безымянные литералы массивов нельзя присваивать одной и той же переменной несколько раз. Как результат, копипастить не получится. Хотя, выше запостили трик со скобочками, тоже вариант.
Чувак, был запрос на помощь в решении конкретной задачи, простой и ясной. Умные люди помогли найти решение, а ты погрузился в отрицание "почему эта задача неправильная и не нужна", типичный недоумок.
В том виде, как ты сформулировал, действительно неправильная и не нужна. Скорее всего ты действительно ламер который делает какую-то ненужную чушь не тем инструментом.
Почему он посыпался на строке, выделенной синим?
Адресовал случайно, вопрос всем, конеш
Кто куда посыпался? Читай про двоичную систему счисления. Какбе нельзя в ней точно выразить деление на 10. (Вроде бы потому что у 5 и 2 нет общего делителя)
Пойду применю свой мегамозг в попытке понять, чё происходит
Лень расписывать все научно, ну как хранятся флоаты в двоичном виде? Это некое число mantiss*2exp
Но под мантиссу выделено фиксированное число битов.
Соответственно в какой-то момент у тебя число перестанет в него влезать. Младшие биты мантиссы потеряются, а множитель мантиссы продолжит расти.
Грубо говоря, было 11111111b x 64, умножаем на 10, там должно было бы стать что то вроде 010011111011b x 128, но в 8 бит это не влезет, поэтому придется порезать мантиссу до 8 старших бит 01001111b и увеличить экспоненту до 1024, в результате мы получаем 162816 вместо 163200
Иными словами шаг между соседними числами будет расти с ростом числа кратно степени двойки, поэтому и вылезет противоречие с десятичными знаками.
Float не подходит для точного поцифрового хранения числа, se la vi.
Ночью с ней пердолился, сделал просто (unsigned int) -1 и забил хуй
Какой я ламер и какой вопрос глупый нет не имеет значения вообще. Понимаешь, был задан вопрос. Ответов, В ПРИНЦИПЕ может быть только два:
1. Это невозможно.
2. Решение.
Разговор о неправильности задачи и переводе на другую, В ПРИНЦИПЕ не может начаться пока не получен предыдущий ответ. Потому что, только тогда можно (либо/либо):
1. Перейти на другую задачу ввиду невозможности решения предыдущей.
2. Сравнить два решения, старое и новое, и если новое лучше, ТОЛЬКО ТОГДА перейти на него.
Говорить же, что "другая задача лучше", когда не решена предыдущая, это абсурд. Пустое кукарекание дебила, вытащенное из жопы.
Потому что float ограничен по размеру и не годится для вычислений. Даже сам язык об этом говорит. Любая дробная константа, например 1.5, это double, float же можно сделать только специально ограничив размер как 1.5f. Короче, float не нужен, за исключением случаев когда действительно именно он нужен по спецификациям.
>Аноны, как забивать гвозди микроскопом?
>Лол, микроскопом не стоит забивать гвозди, и вообще в наши дни лучше заменить гвозди на закручивание саморезов
>Неет, ответов В ПРИНЦИПЕ может быть только два
>Это невозможно
>Решение как забивать гвозди микроскопом
Как скажешь.
double тут ничем не поможет, ты столкнешься с той же проблемой, просто на пару десятков циклов позже.
>double тут ничем не поможет
>тут
Тут нет проблем, вычислений нет, тупо опыт по ломанию переменной.
А я говорю про использование для вычислений, там только double, с float напорешься на косяки в обычных вычислениях.
"Выбор", "лучше" подразумевает сравнение - наличие минимум двух вариантов. А у тебя только один, но но утверждаешь что лучший всё равно. Это вера, следствие фундаментальной тупости отдельного человека. Тот, кто предпочитает верить, а не думать, это дебил.
А я тебе говорю про использование для вычислений, не используй double, он ничем не поможет будет так же криво, все равно понадобится библиотека для bigint/bignumber а то и символьных вычислений. На крайняк строки.
Твоя проблема называется проблема XY. Пока ты не объяснишь, что именно ты хочешь сделать, а только говоришь с помощью чего, никуда продвинуться невозможно. Если тебе нужны строки и их длины, то может оказаться проще вообще генерировать .h файл где будут дефайны и для того и для другого, так и переводить программу на другие языки легче. А может проще взять c++ и нагородить там компайл-тайм строк на шаблонах.
Автор вопроса ИТТ, я немного изучил по вашим наводкам этот вопро и вот што я из этого понял:
Он поплыл при прибавлении к числу ста миллионов, как мы видим. Т.е, при сложении (base 10):
11 111 111
и
100 000 000
происходит какая-то залупа, которая добавляет к числу единицу. Фактически это т.н. floating point rounding error, то есть, десятичное число по основанию 10
1 111 111 111
Не может быть представлено на бинарном уровне (т.е. по основанию 2) как конечная десятичная дробь -- она будет иметь период. Комплюктер, чтобы сделать её конечной, округляет её, выходит число на единицу больше. Я не собираюсь считать это в лоб, потому что мне поебать, но на гипотетическом уровне происходит то, что я сейчас сказал. Т.е. это могло быть и меньшее число в другой арифметической прогрессии.
Дальше идёт тупо накопление погрешностей округления (пикрил). ПОТОМ в какой-то момент заканчивается место в мантиссе числа, и n младших разрядов представления числа по основанию 10, соответственно, выражаются через экспоненту, которая записывается во младших битах, поэтому там тупо нолики хуячат. А потом просто уже переполняется максимально возможное число, разрешённое компилятором и, возможно, при этом архитектурой процессора, но это я не ебу, очевидно, чё там происходит, но он кидает в тебя бесконечность. Всё
Никак, char* не сохраняет размер.
Если хочешь размер - напиши char buf[]="", тогда в тебя в типе сохранится и его можно будет через sizeof получать, что в любом случае придётся сделать, если нужно печатать строку через printf.
Я бы вот так сделал: https://ideone.com/TBunV4
printf отказывается печатать строку, даже если явно указать что там 12 символов, но символов 12. Выглядит лучше, чем define/undef, но лишние переменные.
>>16718
У флоата 7-8 значащих цифр, у дабла 15-16. Что такое значащие цифры сам найдёшь.
Вот код: https://ideone.com/ZEj7su
Ты прав наверное, просто помню, как-то раз понадобилось, и с float вылез косяк, а double его убрал. Понимаю, что для калькулятора не пойдет, только подумал, что в обычной программе не требуется прям чисто-пречисто.
Алсо, пусть это примерно предоставит возможность понять, на какой ответ я рассчитывал, а то тут проблемы с коммуникацией частенько, как я понял
Вроде все так.
Твоя проблема называется:
>Я не знаю ответа на вопрос и искать его не хочу, но признавать свою тупость не желаю, поэтому буду агитировать за отмену вопроса. Нет вопроса - нет проблем, я всё знаю, нигде не ошибаюсь.
Исповедь идиота.
— Двач-медач, вот у меня почему-то раны вокруг рта…
— Так ты ж ешь с ножа. Ложку попробуй.
— Ложкоблядь закукарекала. Ложкой мне неудобно.
— Тогда йодом помажь, лалка.
— Двач, а почему я суп так медленно ем? И мне очень неудобно.
— Потому что ты ножом суп ешь? Ложкой ешь.
— Ложкобляди не нужны! Бамп! Еще варианты? Бамп!
— Ну отхлебни из тарелки тогда.
— Ебанутые...
— Двач, почему на меня в ресторане так странно поглядывают?
— Потому что ты с ножа ешь!
— Каждый раз одно и то же, что за дебильные анонимусы. А другого объяснения нет?
— Может и есть, но это не важно. Важно есть твердое вилкой, а жидкое ложкой.
— Кажется, я совсем не понимаю мира и не гожусь для этой жизни.
— Да все с тобой нормально, просто возьми ложку, когда принесут суп.
- ПРОСТО! аххахахах! ПРОСТО! Ахуительная история. Угу. ПРОСТО блять. Спасибо, идиоты, за совет, блять.
— Двач, двач! Мне так больно, у меня кровь течет! За что мне это?
— Чем суп ел, дебилушка?
— Ножом, конечно.
— А ложку не пробовал взять?
— Почему анонимусы так безжалостны ко мне, а еще двач-помогач?! Это невыносимо!
— Ложку взять не пробовал?
— Нет!
— А что тебе помешало?
— Я не хочу об этом говорить. Всё. Тред закрыт. САЖИ ТРЕДУ САЖИ. Вайп!
— Знал бы ты, двач, как я хочу макарошек!
— У каждого своя судьба.
— Как ты думаешь, анон, когда-нибудь у меня получится поесть макарон? Я ведь не хочу ничего особенного.
— Так свари макарон, возьми вилку и ешь.
— Да? Хорошо, я подумаю.
— Двач, и как люди манную кашу едят и не режутся?
— Ложкой, блять!!
— А чего ты ругаешься сразу? Я ж нормально спросил...
— Анон, поговори со мной.
— Я обедаю.
— Двач-медач, вот у меня почему-то раны вокруг рта…
— Так ты ж ешь с ножа. Ложку попробуй.
— Ложкоблядь закукарекала. Ложкой мне неудобно.
— Тогда йодом помажь, лалка.
— Двач, а почему я суп так медленно ем? И мне очень неудобно.
— Потому что ты ножом суп ешь? Ложкой ешь.
— Ложкобляди не нужны! Бамп! Еще варианты? Бамп!
— Ну отхлебни из тарелки тогда.
— Ебанутые...
— Двач, почему на меня в ресторане так странно поглядывают?
— Потому что ты с ножа ешь!
— Каждый раз одно и то же, что за дебильные анонимусы. А другого объяснения нет?
— Может и есть, но это не важно. Важно есть твердое вилкой, а жидкое ложкой.
— Кажется, я совсем не понимаю мира и не гожусь для этой жизни.
— Да все с тобой нормально, просто возьми ложку, когда принесут суп.
- ПРОСТО! аххахахах! ПРОСТО! Ахуительная история. Угу. ПРОСТО блять. Спасибо, идиоты, за совет, блять.
— Двач, двач! Мне так больно, у меня кровь течет! За что мне это?
— Чем суп ел, дебилушка?
— Ножом, конечно.
— А ложку не пробовал взять?
— Почему анонимусы так безжалостны ко мне, а еще двач-помогач?! Это невыносимо!
— Ложку взять не пробовал?
— Нет!
— А что тебе помешало?
— Я не хочу об этом говорить. Всё. Тред закрыт. САЖИ ТРЕДУ САЖИ. Вайп!
— Знал бы ты, двач, как я хочу макарошек!
— У каждого своя судьба.
— Как ты думаешь, анон, когда-нибудь у меня получится поесть макарон? Я ведь не хочу ничего особенного.
— Так свари макарон, возьми вилку и ешь.
— Да? Хорошо, я подумаю.
— Двач, и как люди манную кашу едят и не режутся?
— Ложкой, блять!!
— А чего ты ругаешься сразу? Я ж нормально спросил...
— Анон, поговори со мной.
— Я обедаю.
Чем автоматически доступ мимо массива найти? Его нет, но мне кажется, что может быть, а считать в голове сложно, я что калькулятор?
>Чем автоматически доступ мимо массива найти? Его нет, но мне кажется, что может быть, а считать в голове сложно, я что калькулятор?
Ты по-русски сначала писать научись, мысли свои выражать, а там и с массивами приложится всё.
Я не думаю, что ты способен мне помочь, но объясню попроще. Есть массив int foo[10]. Мне надо найти, если вдруг где-то в программе есть bar = foo[11], или baz = foo[10]. Программа не валится с sigsegv, значит сейчас этого нет, но может быть при определенной комбинации параметров это может случиться. Нужна программа, которая может найти такие параметры, или сказать, что таких параметров 100% нет.
ну в Си вообще плохо всё с проверками границ массивов. Некоторые параноики пишут макросы(функции) - обёртки, которые проводят рантайм проверки. Ещё тебе могут помочь всякие статические анализаторв кода. Но общая задача статического анализа кода на такие ошибки равносильна решению задаче останова, так что 100% не будет тебе.
>bar = foo[11]
У меня ide выдаёт предупреждение от такого.
Посмотри что такое valgrind, например - даже если тебе нужен не он, с него выйдешь на схожие инструменты.
Уфф, мой начальник что то подобное на плюсах делал.
В общем, для начала надо обернуть создание таких массивов в функцию или макрос (new же вроде тут нет) да и доступ лучше сделать не через [] а через геттер.
Суть в том чтобы создавать массив больше размером, и снизу и сверху. И заполнять его контрльными данными. Например
55 AA 55 AA 55 AA 00 01 02 03 04 05 55 AA 55 AA 55 AA
А в геттере проверять что данные не совпали с контрольными. Конечно там будут ложные срабатывания, но хоть что-то.
Еще нагуглил что если размеры известны то что-то может найти статический анализатор, например опция -fsanitize=bounds
Не, ну классно. Взял, расширил мой вопрос до статического анализа, и сказал, что на этот вопрос ответа не существует. Спасибо.
>>17387
>valgrind
У них даже на википедии написано, что именно это он не умеет. Да и вообще я просто небольшой текстовый анализатор хотел, а не рантаймовый. В рантайме, как я уже сказал, всё и так работает.
>>17388
Да это понятно, что можно, но мне просто найти
foo[bar]
for (int i; i<=bar;bar++)
{foo=3};
даже аллоки без фри искать не надо.
>У меня ide выдаёт предупреждение от такого.
Ну и да, естественно, foo[11] и компилятор находит. А foo[bar ⛧ bar - 3 ⛧ baz],
Макаба, перестань есть мою [ i ]
Попробуй загнать в статический анализатор. PVs Studio например.
#include <stdio.h>
#include <string.h>
int main() {
char test1[50] = "2ch pomozhet/ ne pomogay podumoy /vsegda";
char p_start, p_end;
// for(int i = 0; '\n' != (str = getchar()); i++);
p_start = strcspn(test1, "\");
p_end = strcspn(test1, "/");
printf("p_start = %d\n", p_start);
printf("p_end = %d\n", p_end);
for(int i = 0; i < p_start-1; i++) {
printf("%c", test1);
}
for(int i = p_end; i <= '\0'; i++) {
printf("%c", test1);
}
printf("\n");
return 0;
}
ООП на С для тебя странность?
Ты не понял, я писал о том, что он реализовывал это в C++ (переопределяя new/delete)
>Не, ну классно. Взял, расширил мой вопрос до статического анализа, и сказал, что на этот вопрос ответа не существует. Спасибо.
>Да и вообще я просто небольшой текстовый анализатор хотел, а не рантаймовый. В рантайме, как я уже сказал, всё и так работает.
ты не очень умный. я тебе объяснил, почему вопрос не имеет ответа на "100 процентов", твой "небольшой текстовый анализатор" эквивалентен задаче останова. Потом дал два практичеких приближения. но как я уже говорил, твоя проблема не массивах и сишечке, а в неспособности символы переводить в смыслы и обратно.
Даня Крюгер, ты?
Если тебя интересует (не рантайм)проверка выхода за границы массива по константным индексам, то тебе кланг например, сам выдаст ворнинг. Если по индексам, которые хитровыебанно вычисляются - то это эквивалентно задаче останова. напиши интерпретатор брейнфака или любого другого тьюринг полного языка, пускай есть переменная j, в начале там 0. ты периодически выполняешь по шагу своей программы в интепретаторе, а потом выдаёшь на печать значение массива foo[j]. если интерпретируемая программа заканчивается, пишешь в о 12. Так вот если бы твоя простенькая статическаая проверка существовала, ты бы решил задачу останова таким нехитрым образом.
но мне кажется, ты толлишь тупостью.
Двачую. А то может у него вообще размер пользователем вводится, тогда вообще можно тушить свет.
> дефайн везде подкладываю
Пиздец. Держи забытые технологии древних: #define countof(array) (sizeof(array) / sizeof((array)[0])) только с указателем не вызови случайно
Ага, и везде вместо говорящего дефайна использовать макрос, который ещё каждый раз в рантайме будет считать значение из констант. Охуенно, производительно
Если у тебя компилятор не от хлебушка, то на нормальном уровне оптимизации заменится на константу (для не ВЛА).
for (int i = 2, j = 2; i < len; i++)//можно объявить j здесь
{
int j = i; //а можно здесь
}
Сорян, затупил на несвежую голову. Очевидно, что если объявлять в for, то она только 1 раз объявится и будет сохранять значение на все итерации, а если внутри, то с каждой итерацией значение будет перезаписывать на i.
Если не брать в расчёт оператор continue, то цикл
for (чёто1; чёто2; чёто3) { хуйня };
Эквивалентен
чёто 1; while(чёто2) { хуйня; чёто3 };
Кстати, мне компилятор не разрешает объявлять переменную внутри for, хз как вы ето делоете
На си никто не пишет.
C99?
На класс похоже. Опередили время.
У тебя разметка поехала. Непонятно что в коде.
Но вроде все правильно, ты искал слеш - нашел первое вхождение слеша.
Если ты имеешь в виду найди позиции обоих слешей, то можно делать что-то вроде
p_start = strchr(str, '/');
p_end = strchr(p_start+1, '/');
Естественно тут надо проверять что p_start не вылезает за границы строки.
>>18580
VLA нинужны, для всего остального sizeof гарантированно считается на этапе компиляции, с любым уровнем оптимизации. И да, countof(unique_names) гораздо понятнее, чем всякие NUNQNM да, почему-то экономить буквы любят именно адепты подхода "задефайним размер массива где-нибудь в жопе"
>>18588
Кого ты наебать пытаешься? У одного байткод (и да, UBOUND был в старых бейсиках?), у второго дебаг-сборка.
>>18968
> Естественно тут надо проверять что p_start не вылезает за границы строки
Оно NULL вернет, если что. Но там не нужны никакие strchr, нужно просто завести флажок и идти циклом по строке. По / менять состояние флажка. С взведенным флажком мы символы пропускаем, со сброшенным - копируем.
https://pastebin.com/jVwxcRR4
Сорян шо сразу на пастбин не выложил
Ну я ищу две строки "/" и "/"
p_end мне выдает тоже шо и p_start, счас снова прочел описания функций и понел шо я не правильно понял их назначения, блят вот я слоупок.
Здравым ли будет алгоритм искать сначала например слеши и потом проверять нужную звездочку с необходимой стороны?
>VLA нинужны
Так то самый удобный способ работать с динамическими двумерными(многомерными) массивами.
Этот вопрос тут поднимался много раз. Вкратце: если у тебя VLA неизвестного размера, ты всегда можешь выделить слишком много и получить переполнение стека, которое по-нормальному хуй обработаешь. Если ты заранее знаешь максимальный размер, то тебе не нужны VLA - ты можешь сразу выделить массив этого размера на стеке. Если ты не знаешь и не можешь предсказать размер, тогда у тебя есть malloc(), ошибки которого, в отличие от VLA, можно худо-бедно обработать. Все это касается в том числе и alloca() - нужно сильно подумать перед тем, как ее использовать.
>Кого ты наебать пытаешься этой годнотой? Я лучше говна пожру.
Сам себя наебал и доволен. Дожили.
>Что за VLA?
Нестатические массивы:
int i = get_random_number();
int a;
Такого нигде нет, кроме какой-то новой версии именно Си (в плюсах тоже нет).
Массивы обычно статические, в объявлении размер должен быть только константой.
>Почему бы не использовать связные списки для этого?
Потому что вкатывальщикам так проще. Лепишь тупо массивы везде, и оно работает на уровне лаба1, не нужно больше ни о чем думать.
У GCC/MinGW такое прокатывает.
>кроме какой-то новой версии именно Си
Этой "новой версии" сто лет в обед. С99 называется.
>>19519
>Вкратце: если у тебя VLA неизвестного размера, ты всегда можешь выделить слишком много и получить переполнение стека
Положняк такой: не нужно использовать VLA для явного выделения массива на стеке. Но VLA очень хороши для маллоканья двумерных(многомерных) массивов, передачи многомерных массивов в виде аргументов в функции. Обычный способ маллокать двумерный массив - либо делать ручную арифметику(БУЭЭ!!) либо делть массив указателей на указатели, маллокать в цикле, освобождать потом тоже в цикле(БУЭЭЭ!!!11)
Двумерный массив n x m выделяется так с помощью VLA.
int (ж mas)[m] = malloc (sizeof(int) ж m ж n);
или
int (ж mas)[m] = malloc (n ж sizeof mas[0]);
но последний способ технически UB (в этом месте в стандарте по-ебанутому написано)
потом обращаешься
mas[j] = hui;
как к обычному двумерному массиву.
освобождаешь
free(mas);
Замечу, что в тот момент когда VLA описывается. фиксируется его размер, в смысле, если мы после того маллока поменяем m, поведение массива не поменяется.
а объявлять сразу VLA на стеке - да, плохая затея (впрочем я очень сомневаюсь, что проблемы могут возникнуть, если делать это в пределах нескольких кб)
А, ок, спасибо. Ну тоже хорошая вещь, в яве такое прокатывает, почему бы и в си не?
>Обычный способ маллокать двумерный массив - либо делать ручную арифметику(БУЭЭ!!)
>так с помощью VLA
>int (ж mas)[m] = malloc (sizeof(int) ж m ж n);
>sizeof(int) ж m ж n
А это что, не арифметика, или может НЕ ТА арифметика, лол?
>>19612
>в яве такое прокатывает, почему бы и в си не?
Вот именно, тут кроется огромная ловушка для подобных макак. И из за того, что "прокатывает" они так ничему и не научатся и будут писать неправильный код, даже не подозревая об этом. А когда потом где-нибудь программа от этого выпадет, они скажут: "си - нестабильное говно, вот на моей джаве всё заебись".
Точно. С одномерным и так работает, а про многомерный не подумал, что в типе нужно хранить еще размер массива. Статический можно объявить, а динамический без VLA нет.
Окей, убедил, имеет некоторый смысл.
Чиво бля?
[code]
int main() {
for (int ii = 1; ii < 6; ++ii) {
for (int i = 1; i <= ii; ++i) {
putchar('$');
}
putchar('\n');
}
return 0;
}
[/code]
>какие там компиляторы for perdoliya есть
пиши в терминале
gcc govno_proga.c
чё это вообще означает, "для пердоли", он должен сам за тебя код писать?
Таки вышло эту хуйню запилить, данные отправляю обычным GPIO bit-bang, написанном на ассемблере для исключения влияния оптимизаций компилятора, пайплайна процессора и прочей хуйни. Принимаются же данные с помощью счетчик+DMA на другом пине, который тоже подключен к SWIM пину стмки (отправлять и отправлять данные на одном пине одновременно ну никак не выйдет).
Так вот, есть ли на си какие-нибудь либры нестандартные чтобы подобные графики как пикрил принтить? разумеется в консоле рисовать его мне нахуй не надо это маразм.
https://pastebin.com/9WvRhej9
https://pastebin.com/4ax0NV1V
первое - собсно ПРОДУКТ (ух бля)
второе - тестовый клиент
я ебал
Да нисколько, просто ковыряю (раз в два месяц, бля), как свое дите проблемное. Насосусь хуев на настоящей работе, вечером зайду на полчасика "пофиксить" и дальше забиваю.
Хотя изначально говорили заплатят, но мне сейчас похуй
Проблемный макрос. Так "debug_print("message");" - не работает, нужно указать второй аргумент - "debug_print("message", i);" - тогда пашет. Можно как-то сделать чтобы оба варианта работали?
>#define debug_print(fmt, ...) do { if (DEBUG) fprintf(stderr, fmt, ## __VA_ARGS__); } while (0)
Сойдет, спасибо.
Вот могу я обьявить функцию так: void funk(struct a){...}
И могу так: void funk(struct &a){...}
Сама структура является указателем: typedef struct zopa a;
Вопрос: какое из двух объявлений будет самым эффективным по памяти? Или разницы вообще нет?
Ебал я в рот эти сраные звёзды *.
Если у тебя уже
>typedef struct zopa a;
То ты нигде не должен писать funk(struct &a), а должен писать funk(a entity)
>>>typedef struct zopa звезда_ебаная a;
Это означает, что вместо struct zopa звезда_ебаная ты должен писать a.
>И в gcc запись &а тащит.
Ты скорее всего не понял, откуда она там взялась и что означает. В определениях функций вообще так
void funk(type &a){...}
быть не может в С. Это сиплюсплюсный синтаксис, который называется ссылкой.
>А чо за entity?
Просто слово, чтобы обозначить структуру, или переменную, или функцию. То, на что можно указать. В
int k = 4;
k будет entity, переменная типа int.
>>25253
Вот кароч: https://ideone.com/QoA13D
>>25228
Блин, и правда, похоже что это фишка плюсов... Но вопрос про память остается открытым
Я плохо объяснил, что такое entity, и ты не понял. Это никакой не термин, так что просто не используй его.
Массив функций объявить нельзя, потому что функции разного размера, а массивы состоят из элементов одного размера.
>Блин, и правда, похоже что это фишка плюсов... Но вопрос про память остается открытым
Спрашивай в с++ треде, я не знаю.
Функции это код, массив структура для хранения данных, так что массив функций сделать не выйдет, но можно сделать массив указателей на функции.
Все гениальное (и портабельное, в отличие от трюка с ##) просто: #define debug_print(/∗fmt, ∗/...) do { if (DEBUG) fprintf(stderr, __VA_ARGS__); } while (0). Найди два отличия. Алсо, if (DEBUG) плохой тон (если это не переменная, конечно), надо делать #ifdef DEBUG. Банально потому что иначе какой-нибудь компилятор может высрать тонну предупреждений про unreachable code.
Ok, попробую
массив указателей на разные функции можно, если у них одинаковые сигнатуры (типы параметров и тип результата), ну это просто следствие того, что все элемнты массива должны быть одного типа.
Самый простой способ - кастить к uintptr_t, но это формально UB. Правильный способ:
1) Ты собираешься вызывать эти функции, поэтому ты по определению знаешь их типы. И если типы разные, кладешь их в uinon:
typedef int IntFuncType(int);
typedef double DoubleFuncType(double);
typedef union { IntFuncType ∗as_int; DoubleFuncType ∗as_double; } FuncPtrType;
2) Возможно, что тебе понадобится запоминать еще и тип:
typedef struct { FuncPtrType ptr; enum { INT_FUNC, DOUBLE_FUNC } kind; } FuncPtr;
3) Ну и складываешь:
FuncPtr pointers[10];
pointers[0].ptr.as_int = abs;
pointers[0].ptr.kind = INT_FUNC;
pointers[1].ptr.as_double = fabs;
pointers[1].ptr.kind = DOUBLE_FUNC;
Разумеется, все это можно обернуть в макросы, а макросы в _Generic.
> Алсо, if (DEBUG) плохой тон (если это не переменная, конечно), надо делать #ifdef DEBUG
У меня так и записано, то я пример со стековерфлоу скопировал.
Твоя магия почему-то не работает, ругается на синтаксис да и я такого рода запись вижу впервые, выглядит странно
error: expected parameter name, found "/"
#define derr(/ fmt, /...) fprintf(stderr, __VA_ARGS__); stop();
> да и я такого рода запись вижу впервые
Да это обычный многострочный комментарий, лол. А ты между / и ∗ пробелов понатыкал, еще бы оно работало. Имелось в виду "убери fmt из аргументов, оставь только __VA_ARGS__", а комментарий - напоминание читающему о том, каким именно должен быть первый аргумент макроса.
Ну это очень не очевидно было учитывая отображение на борде.
Способ крутой конечно, как я только сам до этого не додумался, спс.
Откуда вы такие лезете, блять?
1-wire - низкопроизводительная и простая хуита для датчиков, спроектированная специально чтобы иметь возможность крутиться на медленных мк; SWIM несопоставимо сложнее и быстрее.
Для 1-wire ни счетчик, ни DMA не нужны, можно отправить сигнал по гпио и сразу же брать и ебать гпио инпут регистр в цикле.
В SWIM, помимо проблемы большой частоты, еще в некоторых случаях нужно получать входной сигнал с стмки и в то же время отправлять сигнал.
хоршо, спасибо большое. а можно через визуалку(визуал студио) прикрутить на сишную программу gui?
>>26778
Я любитель, но вот как я себе это представляю
Создаёшь массив двухмерный - ссылка одномерная на блок памяти.
Там для DrawArrays надо и координаты двухмерные и массив на цвета
Создаёшь этот массив с координатами и прозрачными цветами
Потом в цикле согласно функции закрашиваешь каждую точку
Возможно есть и либы, которые это проще рисуют
>Создаёшь этот массив с координатами и прозрачными цветами
>Потом в цикле согласно функции закрашиваешь каждую точку
Пиздец нахуй.
ну ладно, я так глянул open gl там впринципе можно даже 3d игры писать. помню ретурн вольф на нём был. ладно, спасибо. щас пойду осваивать.
а можно gui формы через визуалку на си программу прилепить чтобы она консольный вид не имела?
>а можно gui формы через визуалку на си программу прилепить чтобы она консольный вид не имела?
Можно, я использую glut, он для создания окна, он значительно проще прикручивания окна для винды, просто текста меньше.
GLFW альтернатива, я её ещё пока не использовал, но англ сайтах пишут, что она круче glut
https://github.com/google/skia/blob/master/experimental/c-api-example/c.md
Но да, с GUI у сишки все традиционно хуево. Если у тебя винда, можешь на Windows API нарисовать, это относительно просто. Можешь вообще осилить слинковаться с gnuplot.
>>26800
> я использую glut
> GLFW альтернатива, я её ещё пока не использовал
Как там в 2000х?
>>26796
> а можно gui формы через визуалку на си программу прилепит
Создаешь .rc-файл, рисуешь диалог, потом DialogBoxParam, все.
> я сам не знаю.
Ты сам написал - glfw. Но рисовать на OpenGL двадэ графики линиями это такое себе. Например, glLineWidth уже овердохуя лет как "сломана" в не-legacy контекстах.
>>26814
Если тебе на один раз - рисуй через GDI и не еби себе мозг. Примеров в сети овердохуя. Вот рандомный: http://www.cplusplus.com/forum/windows/227328/
>Но рисовать на OpenGL двадэ графики линиями это такое себе
Точками же, это с моей точки зрения максимально просто и понятно.
Я просто с 2013 на freeglut и удивлён чего это его все так поносят. Что с ним не так, кроме старости?
это для 2д графиики лучше подойдёт?
Контекст у тебя какой? 2.1? glBegin/glMatrixMode и вот это все? А так, хуже glut только aux, а с glfw работать приятно, он для людей.
>Контекст у тебя какой? 2.1?
Хы, да.
>glBegin/glMatrixMode и вот это все?
Нет, glDrawElements или glDrawArrays
По мне так нормально, благо всё это глубоко и прописывается однажды, я без проблем сделал настройки в которых меняется разрешение экрана, даже камера проблем не вызвала, речь о 2д гамессе.
Управление, да, но решение нашёл.
Однако я нашёл LearnOpenGL, так что скорее всего перекачусь на него, потому что я малость повоевал и сделал свой аналог дельты.
Что тебе не нравится? Собираем массивы фукций, со дня на день уже ООП прикрутим.
Этот товарищ тебе тоже не особо поможет.
Хочешь просто - пиши на шарпах, даже не придется другую IDE качать.
шарпы мне не нужны, спасибо.
да я вот сомтрю в визуалке есть gui для c++ его заюзать может?
Этот товарищ уже посоветовал Skia и GDI из Windows API. С тех пор график уже можно было десять раз нарисовать.
Я уже изучаю. спасибо, анчоусы. решил что буду на с++ писать использую gui от визуалки.
>>Этот товарищ
В смысле с++ ему не поможет.
>>27926
Ты хотел просто нарисовать, я тебе про шарпы говорю про той причине, что там есть в коробке, например, Chart - подавай массив точек в него и у тебя уже будет нарисован график, который тебе конструктор форм в два клика сделает.
Но ты сам выбрал писать всю логику заново на плюсовом гуе, где это более заебно.
Напомните кто-нибудь, как быстро и наиболее эффективно, посчитать количество единичных бит в байте?
Что-то вроде:
>n = (n>>1)&0x55 + (n&0x55);
но это не то...
((a & (1 << 0)) >> 0) + ((a & (1 << 1)) >> 1) + ((a & (1 << 2)) >> 2) + ((a & 1 << 3)) >> 3) + ((a & (1 << 4)) >> 4) + ((a & (1 << 5)) >> 5) + ((a & (1 << 6)) >> 6) + ((a & (1 << 7)) >> 7)
Оно каждый бит считает.
>>28099
Пффф, ещё лучше.
Вот, нашёл, на хабре - в три инструкции:
https://habr.com/ru/post/276957/
>n = ((n>>1) & 0x55) + (n & 0x55);
>n = ((n>>2) & 0x33) + (n & 0x33);
>n = ((n>>4) & 0x0F) + (n & 0x0F);
Есть чё нить более эффективное для произвольных длин?
Скажем, задача, подсчитать количество единичных бит в большом - байтовом массиве.
Уж лучше тогда цикл. По крайней мере, развернуть его компилятор и сам может. И даже на popcnt осилит заменить.
Я имел в виду, что оно каждый бит пробегает: https://rextester.com/IAXZKO9143 , а потом складывает.
8 итераций цикла для числа 255
Там ниже ускоренные варианты есть. Правильное решение такое: тестить в рантайме, есть ли popcnt, и если он есть, юзать его (лучше интринсиком, но можно и ассемблерной вставкой), а на случай, если нету, сделать лукап-табличку (которая тоже есть и по моей ссылке, и по твоей на хабре) для байта и бегать по ней.
Аноны поясните вот этот эффект
>>405430
>>405476
>>405477
Почему там не получается без volatile?
Потому что компилятор соптимизировал твою it нахуй в while(it). Программа может туда попасть из while(1) только если it==1, никаких других действий между этими моментами нет, значит it всё ещё равно 1.
Поигрался с фоагами и компиляторами на https://godbolt.org, не нашёл такой комбинации, которая оставляла бы первую проверку и съедала бы вторую. Но всё равно считаю, что такое возможно и именно это происходит.
Оно не оставляет первую проверку (ну как я понял из вопроса). Оно не смотря на то, что переменная изменяется, считает ее неизменяемой и равной 0. Видит while и просто ебашит while(true);
Судя по описанию.
Я так понял, у него в нужный момент он мигает, а вот потом уже не пищит, или что он там задумал сделать после while(it);
Вот сгенерил тебе пример на AVR, т.к. по себе знаю он такой же херней страдает.
https://godbolt.org/z/7j5vTU
Асм там довольно человекочитаемый.
>Я так понял, у него в нужный момент он мигает, а вот потом уже не пищит, или что он там задумал сделать после while(it);
Да я протупил. У него действие 2 должно дрочится пока кнопку не нажмет.
К слову сгенерилось не такое же, но похожее - первый раз проверка i выполняется, а потом оно тупо подвисает.
Причем если выполнено i - подвисает дроча do_something
А если не выполнено - будет до посинения дрочить do_something_else
Т.е. код генерится в:
if(i) {
do_something_else++;
while(1);
}
else {
while(1) do_something++;
}
Небыстрофикс.
Если выполнено i - один раз выполнит do_something и зависнет.
Если не выполнено - до посинения дрочит do_something_else
if(i) {
do_something++;
while(1);
}
else {
while(1) do_something_else++;
}
Словил кринжульки-танцульки с этого кривого английского вкатывальщика
>не более чем за 4 итерации.
И в чём выигрыш и эффективность? Ты делаешь кучу операций за итерацию, плюс к этому сверху полируешь это всё умножением (которое, в принципе, можно заменить на iterations << 1). Я чёт очень сильно сомневаюсь, что это эффективней, чем просто в цикле проверять пока в байте есть единицы.
Недавно решил в катиться в си, но столкнулся с проблемой что мне нужно указывать в этих скобках число большее единицы
Может есть какая нибудь фича чтобы не писать каждый раз по 20 раз "++"?
Элитная программа, работает только у каждого второго.
Двачую, хотел написать.
[ [123, 34543, 3454, 'str'],
[3453, 43534, 345, 'str'],
]
как мне создать подобную структуру на си
типо знаю про существование стурктур, enum, union, но всё ли ето вместе использовать мне.
типо
https://pastebin.com/KXQ3iAmf
нужна подсказка как сделать многомерный mixed array
void* твой друг для разнородной херни.
Но в твоём примере, вроде, обычный массив структур, тока ты скобки квадратные забыл после объявления там.
Правильно ли я сделал? И теперь чтобы инициализацию сделать мне надо типо конструктора написать? типо что куда ложить? Блет надо снова перечить справку в кернигана
https://pastebin.com/EY244Dnu
Руководствовался этим
https://stackoverflow.com/questions/18577404/how-can-mixed-data-types-int-float-char-etc-be-stored-in-an-array
Если тебе надо, чтобы в одной ячейке массива хранилось несколько типов, то тебе надо использовать массив структур Скорей всего это тебе и нужно , например:
https://godbolt.org/z/4c7UXh
Если тебе надо разные ячейки массива интерпретировать как разные типы, то нужно использовать, то что ты нашёл на стаке. Но ты походу не так понял, судя из твоего примера. Я пофиксил твой пример. https://godbolt.org/z/YTzSzG
Тут сложно в тексте объяснить, короче говоря, ты с помощью enum константы определяешь тип данных который хранится в определённой ячейке и соответствующим образом её обрабатываешь.
Массив союзов ему нужен и доступ по указателю. Ты хуйню не оптимальную предлагаешь какую то.
typedef union{
void addr;
uint32_t as_int;
char* as_string;
}my_union;
my_union array_of_unions[16];
Эти дескрипторы для всех девайсов почти одинаковые, есть хотя бы мысль на что смотреть? На endpoint, али как?
А мышка может? Я вот только вчера пробовал моргать светодиодом CapsLock и вычитал что на USB для этого каждый производитель каждой клавиатуры должен делать поддержку специальной залупы, на которую понятно, все хуй клали и в итоге нигде не работает.
> которая, в свою очередь, меняла бы цвет
И не надейся. Нестандартная хуйня, может реализовываться кучей разных способов, особенно в программируемых игровых мышах (там вообще пиздец). Возьми USB сниффер любой и посмотри, как родное приложение делает.
>>29863
> все хуй клали и в итоге нигде не работает
Чо, правда? Оно еще в 1.1 было, и везде работает. Попробуй вот так проверить: https://pastebin.com/raw/q082MYZk А вот напрямую переключить у тебя не получится, потому что винда (если у тебя винда) запрещает без дров работать с системными устройствами ввода.
Для капслока? Нахуй? Я имел в виду, что напрямую через libwinusb клавиатурой управлять не получится. А чтобы просто поморгать не влияя на ввод, существует IOCTL_KEYBOARD_SET_INDICATORS.
Ладно, хорошо, спасибо.
После C99, и в C++, return 0 можно не писать. До этого хз, возможно не UB а implementation defined.
> может реализовываться кучей разных способов, особенно в программируемых игровых мышах
Спасибо за совет со сниффером, теперь мне более понятно, какие байты за что отвечают при передаче данных на мышь.
Теперь самое интересное, через какую функцию передаются RAW данные в libusb. libusb_fill_bulk_transfer() может?
http://libusb.sourceforge.net/api-1.0/group__libusb__asyncio.html#gad4ddb1a5c6c7fefc979a44d7300b95d7
А теперь внимательно посмотри на три строчки ниже. Поэтому нет, тебе нужен control transfer, а не bulk. И да, если эта хуйня через set report работает, то это совсем даже не костыль.
Я не могу найти функцию set report в libusb, попробуй найти сам в доках. Я сам склоняюсь к control transfer, но будет ли это работать, хуй знает.
Set report - это запрос из спецификации HID. Вот тут посмотри: https://www.usb.org/sites/default/files/documents/hid1_11.pdf (страница 62). И оттуда же:
> Feature and Output reports must be initiated by the host via the Control pipe or an optional Interrupt Out pipe.
Я бы на твоем месте хоть краем глаза, но просмотрел спеку целиком.
Спасибо за помощь :)
Теперь все работает спокойно через libusb_control_transfer совершенно спокойно, могу менять цвет на моей мыши и скорость их смены и режимы.
Теперь можно будет прихуярить что-нибудь для изменения DPI и можно прикрутить GUI ко всему этому, с ползунками :)
Интересно, но вот от примеров кода глаза вытекают, особенно шокирует предложение в некоторых случаях для краткости не использовать фигурные скобки, что ещё больше усложняет процесс чтения кода.
> не использовать фигурные скобки, что ещё больше усложняет процесс чтения кода
Программистам на питоне расскажи. Фигурные скобки используют постоянно не потому, что читаемее, а потому, что можно случайно сделать пикрил. Конечно, если бы все люди пользовались IDE, проблемы бы не возникало, но вот когда у тебя обычный текстовый редактор, то при попытке дописать второй стейтмент, тебе нужно самому не забыть поставить скобки, а не забыв, еще и курсором побегать туда-сюда. Проще поставить заранее.
>но вот когда у тебя обычный текстовый редактор
Ах линуксоиды!
Ну ничего! Есть же всякие геану и прочия редакторы!
Кстати, я в основном использую 2010 ВС, там нету такого, чтобы что-то автоматом подставлялось, я как автомат всё делаю, а вот в 2019 уже это дело есть, удобно.
На деле же я по сути убеждаюсь в необходимости и верности развития языка С в С++, а так же в том, что ему действительно не нужно ничего больше.
Так же удивляет, что почему-то в С++ при обучении тыкают в лицо cin и cout, когда есть более удобный и логичный printf, странно.
Ну и блядские строки символов вместо string, ммммм, чуть что не так и исключение.
>>30954
Смотря на чём писать, я просто забил и проверяю на ВС 2010, мне сойдёт.
>Так же удивляет, что почему-то в С++ при обучении тыкают в лицо cin и cout, когда есть более удобный и логичный printf, странно.
printf это си, а не плюсы, он не понимает классы. А еще printf это целое минное поле подводных камней почитай википедию, страшнее
>Ну и блядские строки символов, ммммм, чуть что не так и исключение.
строк. А плюсы и классы сделаны как раз для избежания подобного. Так что в плюсах преподают потоки совершенно правильно.
> это целое минное поле подводных камней
Да хотя бы одно только то, что параметры форматирования у потоков перманентые, сразу нахуй перекрывает все очевидные неудобства printf. Какая-нибудь говнолиба сделает cout << hex , а обратно вернуть забудет, а потом ты такой cout << 120, и все нахуй взрывается, потому что на выходе не 120, а очень даже 78.
Манюнь, ты пишешь какую то дичь, а вот от принтфов повзрывалось буквально программ на миллиарды.
Интересная информация, но не относится к сказанному, да и даже если пиздеть на эту отвлеченную тему, неправильный вывод это не UB и чтение не той памяти.
> чтение не той памяти
Для этого крестопотоки не нужны. Достаточно было просто не пихать пользовательский ввод первым аргументом.
на помню шо хочу сделать подобный список списков на питоне
[ [123, 34543, 3454, "str"],
[3453, 43534, 345, "str"],
]
Я не правильно инициализирую числа, строка записывается, у меня каша от юнионов структур и перечислений, юнионы где то читал шо такая же структура только ссылается на один участок памяти
https://godbolt.org/z/ChrHYE
Заебал. Тебе уже написали, что тебе нужна структура, а юнионы тебе не нужны. Юнионы тебе понадобятся, когда ты захочешь, чтобы любой элемент мог быть любого типа.
еще раз ветку перечитал, вроде понел, спасибо анон
Такое нужно специально писать ради троллинга. А остальные шероховатости решаются автоформатированием в студии по нажатию пары кнопок.
Атрибуты на выравнивание, интрины, терминология (фетчи, перфетчи, етц.).
Уклон скорее в понимание, чем именно в гцц.
Да, только что сам подорвался, беру свои слова обратно. Впрочем, я итак использую cout и cin, printf мне показался удобным.
Ты -Wall-то включил?
printf("E\n");
вот здесь что сперва происходит printf или ++i. По-моему printf я так понял что ++i делается после каждого выполнения тела цикла. Я прав?
выполняем выражения это я так понимаю тело цикла выполняется, а потом уже count да? спасибо за баивую картиночку, понял.
Я не знаю. Я ещё ничего даже не открывал. Ну просто я помню по программированию что документацию сложно читать если у тебя отсуствует представление об этом.
Получи представление тогда.
Щяс потыкал, да согласен, лёгким движением мышки всё настраивается, но чому оно на електроне то?
Тому, что на пердоликсах из графических интерфейсов только браузер.
Qt Creator официальный редактор, конечно ты должен в него, если собираешься серьезно заниматься Qt
Codeblocks и Geany обычные хорошие IDE, если ты хочешь гуй
Vim и VStudio для поехавших задротов, проще поставить имакс со всеми фишками из коробки и не ебать мозг
Бамп
Ребенок, а что было нужно до появления вскода, подарка от майкрософт? Он же только недавно вышел.
CodeLite, мне норм.
блят зря я вброс сделал, сорян аноны
Открой треды хотя бы двухгодичной давности, там ещё были адекваты, а посты вроде Я ПОЛЬЗУЮСЬ ВСКОД А ТЫ.. или ЗАЧЕМ НУЖЫН СТРУКТ просто игнорировались
Практика показала, что адекватам здесь скучно, и они все свалили. А игнорировать посты тебе и сейчас никто не запрещает.
Что ты до вскода доебался? Там обсуждали серьезную проблему выравнивания кода в ифах. Я считаю что статический анализ надежнее, чем как кто то предложил что студия сама везде скобочки расставит.
ты ебанулся?
Не пойму твоих рассуждений. Вот в студии можно нажать кнопочку и работает, а еще там решарпер есть сверху. А что такое "статический анализ"? Гдн это, что нажать? В перде? Извините, не надо такое.
> А что такое "статический анализ"?
Это когда компилятор вместо компиляции или параллельно с ней внимательно смотрит на исходник и говорит, что код говно, и автор мудак. С пруфами, разумеется.
> Гдн это, что нажать?
cl /analyze (есть в виде кнопочки в студии), scan-build (он же clang --analyze), единорог, ну и прочие убогие цппчеки и сплинты, про которые вспоминать стыдно.
Так бы и сказал что ты писатель laba1. Забыл нажать форматирование в студии = самолет упал, кому такое нахуй надо? Анализатор настраивается один раз, запускается при каждой сборке.
>scan-build (он же clang --analyze), единорог, ну и прочие убогие цппчеки и сплинты, про которые вспоминать стыдно.
Это, что пердолить консольку, а потом глаза ломать об высер в неё же? Не понимаю, какой смысл. Покажи гифку или видео как ты этим пользуешься. А то у меня впечатление, что это всё настолько бла-бла, что на практике упоминать в конкретике.
>>32674
Какой анализатор? Что настраивается? Давай конкретно. А пока у тебя ничего нет, только пустая брехня. Я конкретно сказал про студию и решарпер. От тебя не слышу такой же конкретики что использовать, для чего и как.
> Вроде была речь про ИДЕ, как следствие понимание редактором кода
Речь была о >>30944 неправильно расставленных скобках. IDE умеет их авторасставлять, и на приведенном пике, когда ты bar начнешь писать, скобки у if появятся. А вот если код уже написан, или вот эта автоматическая вставка не сработала по каким-то причинам, IDE тебе больше ничем помочь не может. Между тем, в твоем коде баг. Для поиска этого и других, гораздо более хитровыебанных багов помогает статический анализ (ну и чтение кода человеками тоже, разумеется).
Скобки автоматически появляются через строчку выше из за отстцпа через строчку ниже? Занятно. У меня такого нет и если бы было, отключил. Текст должен вставляться только после текущего положения и срямо после него, а не прыгать через строчки и тем более назад, это само по сабе генератор багов. Больше похоже на питонодебила, который хочет натянуть на си свои дурные привычки, где отступы это главное, а скобки лишь следствие. Какой-то жирный троллинг в си треде. Да и вообще фича ненужной сомнительности , а развели столько разговоров.
блять съеби нахуй с треда ёбаная тварь уже заебал своими смехуечками гнида ёбаная блядь
нет, ты
Посмотри хотя бы на (псевдо)syscall'ы
Ты можешь писать в программе OK / EXIT / CRASH с опциональными числовыми преобразованиями или тупо вговнокаживать 0 / 1 / 2 с комментами рядом, что это syscall
Структы какие-нибудь в этом случае излишни
enum необходим чтобы показать какие значения может принимать та или иная переминная и никаких других кроме тех что в Enum.
Для удобства. Забей хуй, когда в си прокачаешься до определённого уровня сам поймёшь. Enum это необязательная фича.
Так в Си же тип не проверяется? Там вроде неявный каст. enum class это только в c++11
тогда такое же назнчание как у #define
Для сравнения, в c++
Не проверяется. Никаких кастов нет, enum - это какой-нибудь сорт int (по факту всегда signed int). Но ты можешь прочитать код и увидеть, что именно ожидается.
0x это же не элемент его? это просто индикатор что число шестанадцатиричное, так?
я ньюфаня, на 43- странице книги k&r
Лол. На этой замечательной ноте можно закрывать тред.
ого, сам ОП ответил, ну я типо отписался от етого треда, а на новый канешно подписалса!
Это копия, сохраненная 25 мая 2020 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.