Тред, посвященный прародителю всех С-подобных языков и по совместительству единственному идеальному и всесторонне годному средству программирования как на системном, так и на прикладном уровне.Пожалуйста, пользуйтесь 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_Chttps://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)
>>1610778Читай чужие исходники. Прочитай APUE для *nix, рихтера и руссиновича для винды, потом вкатывайся в интересующую предметную область.
>>1610795>Читай чужие исходники.Мне нужно не как код писать, а философия программирования на Си. Я не понимаю как Си взаимодействует с ОС, как пишут сетевые программы, как пишут кроссплатформенно на Си, вот это вот все.>Прочитай APUE для *nix, рихтера и руссиновича для винды, потом вкатывайся в интересующую предметную область. То есть изучать API ОС?
>>1610795я не читаю русских авторов, всё слишком заумно и сложно постоянно обкладывают всякими ёба-терминами. мания у наших писать всё время книгу каким-то агадемическим языком. западные проще гораздо читаются
>>1610809> Я не понимаю как Си взаимодействует с ОСТы дергаешь либу за функцию, либа что-то делает.> как пишут сетевые программыAPUE для *nix, Network programming by Jones/Ohlund под винду. Как конкретно организовывать программы, подсматривай у других, ну и книги тоже есть.>>1610827Где ты увидел русских авторов?
Вкатился, а вот залетный зеленый со стеком в цпу и прочие питонодети пусть остаются тонуть в прошлом треде.
Только что посмотрел Pelles C идеху, боже мой какая же это милаха. Но как всегда минусы, это какой-то левый компилятор, ну и автокомплишена нету или есть?. Самому написать что ли. Если взять тот-же clang, походу там есть куча уже готовых тулзов для автокомплишена, парсинга синтаксиса итд. А в качестве апи для гуя gtk, для кросплатформы. И забацать по быстрому идеху своей мечты?
>>1610876Под винду то? VC/VS закастомь, плагины попиши. Поинтереснее будет думаю. Clang уже со студией совместим кстати, сам на таком билде сижу.
Аноны, снова я выхожу на связь. Посмотрите, пожалуйста, я правильно задание выполнил? 1-24 из k&r или нет? Если что о всяких switch и стеках не знаю, т.к. прочитал только первую главу, читаю главу > делаю упражнение.https://pastebin.com/KmqvnGJH
>>1610917> do not forget about quotes ... comments> забывает о кавычках и комментарияхВсе правильно сделал?
>>1610927ну это понятно, я так набросок кинул. чисто первое предложение сделал, кавычки, цитаты я тоже сделаю. я имел в виду сам принцип правильно я понял задания или нет? чтобы семантически правльной по смыслу была программа.
>>1610929По-хорошему [(1]) нихуя не верная программа, но для того, чтобы это обработать, нужно про массивы знать уже хотя можно скобки в int запихнуть побитовыми операциями, на 16 уровней хватит точно.
>>1610932да понимаю, я.ну я не знаю массивов пока.. начал язык с нуля сразу с книжки k&r. я думаю что он эти задания даёт с целью закрпления того что я прошёл в первой главе. циклов этих, скобочек, назначения переменных и прочих. думаю у него для массивов отдельные задачи припасены впереди.
Ребятки-ребятульки, выручайте. Проект усктроен следующим образом: есть корневая либа, в ней есть некий файлик driver.h с сотней экстернов (см пик).Они объявлены уже во второй библиотеке "драйверов", и линковщик все это дело связывает вместе. Таким образом, корневой либе не нужно знать детали реализации, например, устройства хранения данных.Проблема! Хочу эту хуйню инлайнить. Т.е. если имплементация __driver_storage_block_size возвращает тупо 512 то мне нахуй не нужно, чтобы основная либа мутила вызов функции, чтобы получить 512. Надо, чтобы линковщик сам понял, что надо блять, захардкодить 512. У меня стек по пизде от этой хуйни!Что делать?
>>1610971Норм. На самом деле я просто ньюфаня местная и я просто боялся что тебе 19 лет или 20 или 21, что ты младше меня и я такой дегенерат. Но вроде бы пока на своём уровне держусь.
>>1610963> Надо, чтобы линковщик сам понял, что надо блять, захардкодить 512Для начала делаешь -flto, если не помогает - тащишь нужные функции в хедеры, делаешь их static inline.
>>1610995Я так и сделал. Охуенно получилось, только он падла посрезал мне interrupt vector. Ты часом не знаешь, как заставить gcc не трогать .S файл в плане оптимизаций? Ну или не трогать секцию, например.
>>1611002Я нихуя в этом не понимаю, для меня ассемблер это темный лес. Что такое директивы? Куда тут засунуть volatile?
>>1611004https://bugs.launchpad.net/gcc-arm-embedded/+bug/1747966 (первое сообщение про KEEP и последнее про порядок файлов).
В cpp треде задал вопрос, теперь спрошу здесь. Какие доводы использовать C++ вместо Си? Мне нравится Си своей простотой, и соответственно пугает C++ своей монструозностью. Или таки можно использовать ограниченное подмножество языка и забить на остальные 100500 тыщ фич?
>>1611140Никто и не заставляет все фичи крестов использовать. Я по минимуму, только сахарок для удобства. А всякие обсуждаемые на C++20 возможности даже не понимаю.
>>1611140Макака, пошла нахуй. Такие дегенераты не нужны ни в C, ни в C++. Катись обратно в свои скрипты, раб.
>>1610917Строчка типа (dsfsgh{sdfsd)fsdf} проходит без ошибок, хотя она не кажется мне верной.Какие инструменты уже есть? Массивы? Циклы? Функции (с рекурсиями)? Указатели с malloc-ом?
>>1610917Ты не отвечаешь, загрузил твою книгу.Массивы идут до задания 1-24. Фигнёй страдаешь, сделай массив на 10к элементов, этого хватит на любую адекватную си-программу - вряд ли где будет вложенность хотя бы сотого порядка, а 10к хватит уже совсем почти на всё.
>>1611267массивы я делал только на уровне char m[10], ну ты понел.цикл for и while про switch он написал в следующей главе расскажетну функции знаю как писать самопальные, про рекурсию знаю(по предыдущему яп) здесь не проходил рекурсии, но фанкции проходил.про указатели вообще не понял тебя.>>1611326и что мне этот массив даст? как через массив то это сделать? я не понимаю.
>>1611370>только на уровне char m[10]Такого уровня достаточно. Не нужна не рекурсия, ни функции, простого char m[N] хватит.Что-то типа такого (писал прям на ideone, мог накосячить): https://ideone.com/kgiiid
>>1611397спасибо, огромное, анчоус. я очень признателен тебе, что ты даже сам полез в эту книгу пока я спал и раскопал там всё проходил ли я. ты очень много времени потратил на то чтобы помочь ньюфане, спасибо тебе ещё раз огромное
>>1611397спасибо за решение ещё раз, я просто там про const не знал и это всё, но уже загуглил. сделаю по твоему варианту.
>>1611422А, дошло, потому что 4 это скаляр и во втором случая запятая это не оператор, а сепаратор, как при перечислении аргументов. Сорян поцыки
>>1611422>>1611429Во втором случае сначала выполняется присваивание, а потом запятая с более низким приоритетом, как и должно быть.В первом случае вычисляются скобки (с наивысшим приоритетом), в рамках скобок вычисляется запятая, и уже только потом присваивание.Зачем прикручивать какие-то понятия сепараторов и скаляров, если из приоритетов получается такой же вывод? В твоём примере нет сепараторов, так как нет вызова функций, разве не так?
Или вот представьте ситуацию: если есть переменная x = 10, то почему значение выражения (x++, x) не 10, а 11? Постинкремент же должен увеличить x уже после выполнения данного выражения, значит, порядок выполнения должен типа быть такой:Он видит, что у первого x постинкремент, запоминает, что после выполнения выражения нужно увеличить значение на 1Видит второй х, который равен 10, как и первыйДальше два варианта: 1) Выражение закончено, его значением является значение последнего операнда (10)2) Но там ещё где-то инкремент (11)А на практике вообще инкрементируется х сразу, как только встречается постинкремент, и значение x в обоих случаях 11, как и выраженияЯ хуй знает, почему так...
>>1611437Да, я тупанул жёстко. Таблицу с приоритетами помню, но меня переглючило и я снизу-вверх приоритеты воспринимал лел давно уже сижу...
Зачем в си все эти short, long, long long, double нужны? я знаю что их размеры изменяются в зависимости от компилятора и разрядности системы, но зачем это нужно?
>>1611444Постинкремент выполняется после того как переменная отдала своё значение, а не после выполнения выражения.
Как решить 2-1 задание из k&r я вообще ничего не понимаю. ну вернее типы я вывел через <limits.h> а как диапазоны float искать вообще ума не приложу. очень сложно
>>1611487Это сложный вопрос ты медленно но верно засасываешься в бесконечную бездну байтоёбства, до точки невозврата осталось не так много... Пока что ты ещё молодая и шутливая ньюфаня...https://www.cyberforum.ru/blogs/18334/blog69.html Читай статью там ответы на твои вопросы.
а почему мы не используем short вместо int? у него же sizeof в два раза меньше (2 байта) в то время как у int 4 байта. И ограничение там 32к вполне можно short везде писать. Так же будет меньше памяти занимать. всё четенько
>>1611621Я, например, пердолюсь с 32-х разрядными ARM, и там желательно использовать 32-х разрядные типы, особенно во всяких алгоритмах и циклах, иначе будут выполняться дополнительные команды на конвертирование в 32 разряда и обратно.
>>1611675ты очень любезен, но у меня нет дискорда. я бы мог его зарегестрировать, но просто не понимаю как можно коллективно сидеть и решать одну задачу из книжки? я просто читаю книжку, вижу задачу, решаю, потом продолжаю читать>>1611726понял, мне пока рано в такое лезть
>>1611520У меня прогресс уже, благодаря анонам и гугл разобрался в интеджерах и одну половину программы написал. но у меня теперь другая проблема: вычислить диапазон float чисел, как это делать я хз
>>1611801>но у меня теперь другая проблема: вычислить диапазон float чисел, как это делать я хз float.hА вообще посмотри стандартную библиотеку C, что бы представление хотя бы иметь. Она не большая.Тебе, кстати, ещё их вычислить надо, а не только из хеддера вывести. Задание внимательней перечитай.
>>1611818>Тебе, кстати, ещё их вычислить надо, а не только из хеддера вывести.вычислить минималки у unsigned чисел, потому что у них минималок нет.да, я читаю там в книжке есть ссылки на приложения по этим двум бибилиотекам.
>>1611832потому что я их вычислил же. ты на код смотри. они имели ввиду вытащить константы и где нету констант вычислить нужно.
>>1611837Мне кажется, здесь старик Ритчи имеет в виду вывести из констатнт и вычислить без использования констант.
>>1611140> Какие доводы использовать C++ вместо СиШаблоны, неймспейсы, constexpr. Особенно последнее.>>1611487> Зачем в си все эти short, long, long long, double нужны? В 1990 году кто-то написал код, в котором был 16-битный myint. Из-за этого в 2020 году 64-битный процессор, скрипя и спотыкаясь (pipeline stall) на каждой инструкции старается считать в 16 битах. Вот чтобы эта история осталась фантазией, размеры к примитивным типам не прибивали гвоздями. Потом, правда, осознали, что получилось не очень, и сделали еще int_leastN_t/int_fastN_t, но макаки продолжали тайпдефать инты в фиксированную ширину.
>>1611892я твой ответ про типы интеджера вообще не понял, анон. слишком я ньюфаня уж ещё для этого всего.
>>1611860unsigned int i = 0;while (i + 1 > i) { i++; }print("unsigned int max: %u\n", i);Для signed можно закрыть глаза на UB, сказать -fwrapv и сделать аналогично unsigned. Для плавающей точки можно узнать размер мантиссы, найдя момент, когда i + 1 будет равно i + 2, а размер экспоненты получить банальным вычитанием. Хотя я не помню уже, что там в задании требуется.
>>1611902Да там уже ответили выше, я проебал пост просто. Суть в том, чтобы размер интов придумывали разработчики конкретного компилятора, и чтобы они выбирали размеры, которые проще всего обрабатывать процессору, для которого пишется компилятор.
>>1611801Вычислить программно?Предположим, что о внутренней структуре числа ничего не известно (про мантиссу и прочее) и известно лишь что значения доходят до примерно равного значения по модули в положительных и отрицательных. Ещё придётся учесть, что float-ы переполняются.Я бы вот такое написал: https://godbolt.org/z/S6DGPg (чтобы понять define просто замени type на тип и name на имя функции - я не знаю в каком виде шаблоны си, и потому просто через дефайн сделал много функций - лучше чем ctrl+c/ctrl+v на миллион строк)К переменной прибавляется добавка пока число остаётся положительным и продолжает прибавлять, и добавка удваивается по тем же правилам. Если переменная становится отрицательной, то значит максимум достигнут и нужно снижать добавку, пока не подберёшься к нужному значению. Если t2-t1==t2 (переменная с плавающей запятой дошла до бессмысленной бесконечности и больше операции с ней не несут смысла), то значит тоже нужно уменьшать добавку. Вроде бы корректные значения вышли.>>1611733>просто не понимаю как можно коллективно сидеть и решатьЯ не предлагаю коллективно сидеть и решать. Просто интересные задачи потом сверить друг и друга, может быть кто-то более интересную концепцию найдёт.Например, мне интересно посмотреть как ты с комментариями и экранированием символов в строках через \ разобрался, но спрашивать это в треде не уместно, тому что флуд.
>>1611947>Например, мне интересно посмотреть как ты с комментариями и экранированием символов в строках через \ разобралсяты имеешь ввиду задачу в которой нужно было удалить комментарии из кода си программы?
>>1611940А потом ты такой пересобираешь 16-битным компилятором, и твой ответ неверен, потому что UINT_MAX может быть 65535.
>>1611958я не разобрался. я продолжил книгу читать и дошёл до 2-1 задания сейчас на нём сижу, потом откачусь назад 1-24...
>>1611892>В 1990 году кто-то написал код, в котором был 16-битный myint. Из-за этого в 2020 году 64-битный процессор, скрипя и спотыкаясь (pipeline stall) на каждой инструкции старается считать в 16 битах. Вот чтобы эта история осталась фантазией, размеры к примитивным типам не прибивали гвоздями. Потом, правда, осознали, что получилось не очень, и сделали еще int_leastN_t/int_fastN_t, но макаки продолжали тайпдефать инты в фиксированную ширину. Сук, нахуй так жить?! Все эти ебаные киворды, я его рот.... Братан, нахуя вникать во все это байтоебство? Я просто не понимаю. Смысл в чем? Ты же вероятно не пишешь ОС. И даже не пишешь стек сетевых протоколов. Нахуй так жить, расскажи? Какие цели, зачем все эти базворды?
>>1612065> зачем все эти базвордыКакие? Это базовые вещи. Предполагается, что если ты вкатываешься в Си, то до или после этого ты осилил что-нибудь фундаментальное по архитектуре, и хотя бы смутно представляешь, как работает процессор. Ту же "архитектуру компьютера" таненбаума хотя бы.> нахуя вникать во все это байтоебствоЧтобы писать быстрый код, чтобы делать низкоуровневые вещи. Если тебе не нужно байтоебство - нахуй тебе си?> Ты же вероятно не пишешь ОСЗато написал несколько эмулей, например.
>>1612065Мне вообще 21, я сижу у мамке на шее уже 2 года, из образования только шарага. В итоге как-то решил сделать ВАЙТИ, начал учить питон, там html\css, но проблевался от всего этого гавна. Но вот C почему-то зацепил нравится, его учить хотя я понимаю что занимаюсь хуетой и работы не найду на нём, но мне почему-то настолько уже похуй на ирл что я давно всё на самотёк пустил..Короче это просто нравится, я вообще знаю только то что на этом языке драйвера сейчас пишут, а даже для ос предпочтение C++ отдают. Может быть я когда-нибудь в C++ вкачусь, но только после Cи и это явно нескоро будет с такими нулевыми знаниями как у меня.Извиняюсь за вниманеблядство.
>>1611966Нормальный человек:>Решите задачу>Вот>А так?>Ммм, падажди-ка, тут так, а тут эдак, ясно. Вот.Пердоля:>Решите задачу>Вот>А так?>Э? Что? Ваша задача неправильная и не нужна. Идите нахуй!
>>1612071>Если тебе не нужно байтоебство - нахуй тебе си?Потому что могу, потому что хочу, потому что это язык общего назначения.
>>1610917Хмммм. Понимаю, что это сишный тред. Но вброшу свое охуенное решение https://pastebin.com/WXqNzR4H. Вроде как тут же разница в языке не особо играет роли. Про комментарии забыл, но там тот же принцип вроде как.
>>1612759Хотя нет, понял в чем фишка комментариев, нужно не учитывать скобки которые в них попали. Ну, это вполне легко, просто проверяем, что последний элемент на стеке открывающих это начало коментария и пока его конец не найдем, ничего в стек открывающих не кладем. У однострочного закрывающим будет '\n', у многострочного */, только нужно не массив символов использовать, а массив строк. Ну или чуть поебаться с символами.
>>1611904По-моему это всё таки маразам какой-то зачем ритчи такое ебанутое занятие давать? Тот анон всё правильно понял, зачем эти рассчёты того что уже рассчитано вручную?
>>1610764 (OP)Спрошу тут.Короче хочется подноготную изучить получше, т.к. на практике часто бьюсь лбом о том, что не знаю, что под капотом.С чего лучше начать:ASMx86LinuxТаненбаум архитектура ПК?Вопрос довольно тупой, но на самом деле вводит меня в ступор. Т.к. архитектуру +\-, ну очень начально я знаю.АСМ без примеров какого нибудь линукса и понимания его ядра может стать несколько не очевидным. (пару асм микроконтроллеров я знаю и знаю что без понимания уровня выше это хуйня).А линукс - а начальные знания линукса, могут оказаться не тем что я от него ожидаю
>>1612759>как тут же разница в языке не особо играет ролиРазвеселил, лол.У тебя (у меня твоя) программа падает от строчки "}", если что. С комментариями и строчками самое интересное же, там есть всякие многострочные строки вида "asaf\"a//s\sdg\\fa"И то же самое с комментариями, которые /**/
>>1612869>не знаю, что под капотомNand to tetris (он же nand2tetris) гугли - и вперёд! Там как раз весь подкапот: от логического "и-не" через проектирование собственного канплюхтера к написанию и запуску на нём тетриса. Все стадии от и до.Ещё вариант - купи себе книжку Харрисов Digital Design and Computer Architecture, простенькую ПЛИС-плату с али и всё то же, что выше - фигачишь от "и-не" к созданию компа.
>>1612869У Массачусетского универа есть курс nand 2 Tetris. Ты начинаешь с одного логического вентиля not and, и начинаешь на hdl создавать логические операторы, биты, регистры, память, алу, целиком комп с переферийными устройствами, потом пилишь виртуальную машину с ассемблером и компилятор си под нее.Не знаю насколько ещё больше можно узнать что под капотом.Курс платный, но можно спиратить.мимокрестовик
>>1612964>>1612953Слишком глубоко копнули, я по совместительству электроникой и микроконтроллерами занимаюсь, так что мне нужно не настолько глубоко и конкретно х86, причем было бы круто в современном контексте с практическими примерами.Т.е. интересует какие регистры обычно каким образом дрочатся, что в них лежит, как реализуется соглашение о вызове, переключение контекста и прочая хуйня.Я потому в линь и полезть думаю.
>>1612246Да, скобки в данном случае никак не меняют приоритет.>>1612780> зачем эти рассчёты того что уже рассчитано вручнуюЗадание:> by printing appropriate values from standard headersand by direct computationХотя там скорее всего сдвиги имелись в виду.>>1612973Таненбаум, потом любая книжка по асму для x86 (посмотри только, чтобы не с доса начиналось - все эти сегменты и int 21h тебе в жизни вряд ли пригодятся, и понимания не прибавят, особенно в x86-64).
>>1612780>зачем эти рассчётыЭти расчёты для того, чтобы понять представление чисел разной разрядности и почему у них именно такие пределы.
>>1612935> Развеселил, лол.Ну ведь серьзно тут разницы особой нет. Там стеки, тут стеки. Мне просто лень было си вспоминать.> У тебя (у меня твоя) программа падает от строчки "}", если чтоЯ просто чет не подумал что кто-то передаст такую строчку.Быстренько переделал, чтобы и комменты поддерживало. Можно будет потом нормально переписать, чтобы такой хуйни с кучей ифов не было.https://pastebin.com/GkKjyZqd
А в вашем низкококоуровневом Си никак не отображена фича x86 класть старшую часть результата умножения в dx? Я не слышу, блядь! Я есть нуждающийся в этом.
>>1613156>никак не отображена фича x86 класть старшую часть результата умножения в dx?Это забота не си, а компилятора - си этого вообще ни разу не обязан отображать. Напиши ассемблерную вставку на полторы строчки или используй long long же.>>1613144>Там стеки, тут стеки.Я бы не стал использовать стек в реальной задаче, например. Идеалогически тут нужен стек, но намного эффективнее по памяти и быстродействию использовать массив. В случае переполнения заводить ещё один или просто массив+стек - вряд ли большой уровень вложенности будет в типичном коде.Ты же понимаешь во сколько десятков раз твоё решение с дополнительными стеками и другим выделением-освобождением памяти, регулярками и другой дичью будет менее эффективнее одного прохода с массивом и несколькими переменными-флагами для комментариев и скобок? Это же просто дичь невероятная, прикручивать регулярку сюда.Давай я склею или найду кучу исходников и проверим время по фану? В шарпе есть возможность учитывать расход памяти с учётом внутренних затрат твоих стеков и регулярок? Просто в холостую (без выхода раньше времени в случае ошибки) запустить на крупных файлах (дефайны могут сломать всю малину), при этом тестовые строчки вроде "}" оно должно верно проверять, естественно.Ответь в 53 (прошлый) тред, чтобы не мусорить в этот тред, если интересно.
>>1613213> Я бы не стал использовать стек в реальной задаче> намного эффективнее по памяти и быстродействию использовать массивНу это толсто даже для этого треда.Реализация Stack в .NET (как и у любых других вменяемых людей):> private T[] _array;
>>1613233Да, не намного, верно.Именно поэтому, если использовать стандартный плюсовый стек (на деке), то для 100 элементов он вызывает 2 new, а для 1000 - 10 new и 1 delete. И потом после использования нужно будет ещё всё это очищать. Для вектора ещё хуже. А куча медленная, если есть возможность обойтись без неё - лучше так и сделать. Не знаю что это за тип в шарпе, но вряд ли он работает лучше без внешней информации о количестве элементов в общем случае. Я просто поехавший, не обращай внимание.Для 100 элементов рукописный костыль обгоняет стандартный стек на деке в 7 раз (на векторе в 11, и даже для единоразового вызова malloc в 3), для 1000 - 3 (5), для 100000 - 1.2 (3).>>1613255А какие должны быть?Такое внутреннее представление выбрали.https://ru.wikipedia.org/wiki/%D0%A7%D0%B8%D1%81%D0%BB%D0%BE_%D0%BE%D0%B4%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D0%BE%D0%B9_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D1%81%D1%82%D0%B8
Реквестирую пример программы на Си, которая парсит файл с данными (чтобы и вложенные скобки, и разные типы). Желательно без флекса с бизоном.
>>1612967Анон, что-то куда-то не туда ты, кажись, рулишь! Прям как я в своё время. Тоже считал, что "слишком глубоко копаю", а в результате просрал кучу времени. Сейчас жалею, что таки не начал "слишком глубоко" копать. Оно, кстати, оказалось намного проще, чем изначально думал.>я по совместительству электроникой и микроконтроллерами занимаюсьНу, я тоже этим занимаюсь. Точнее, микроконтроллерами в контексте мехатронства.>так что мне нужно не настолько глубоко и конкретно х86Фундаментальная ошибка у тебя тут. Тебе на примере какой-нибудь простой - лучше, учебной - архитектуры нужно понять, как оно в принципе всё устроено и работает. Шагнуть к частностям типа конкретных не-учебных архитектур будет совсем несложно.>причем было бы круто в современном контексте с практическими примерамиМне кажется, это будет херь типа "покажи приёмчик". Ты нахватаешься частностей, а фундаментального понимания в голове так и не будет.>Т.е. интересует какие регистры обычно каким образом дрочатся, что в них лежит, как реализуется соглашение о вызове, переключение контекста и прочая хуйня.О, вот это классика! Подозреваю, что ты взялся за ассемблер и относишься к нему, как к обычно-языку типа си, джавы и т.д. А на изучение асма как раз нужно заходить со стороны цифровой схемотехники. Поверь умудрённым собственной глупостью анонам.Итого: Не еби мозга и не пытайся обмануть жизнь! На примере "детской" архитектуры пройди это всё: от уровня логических вентилей до высокоуровневого программирования. И не читай Таненбаума этого сраного! У него книжка обо всём и ни о чём.
>>1612967https://www.ozon.ru/context/detail/id/147450389/https://www.ozon.ru/context/detail/id/143292187/
>>1613255Про вещественные числа тебе скинули ссылку, а в целочисленных всё гораздо проще.Можно на примере 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 байт и т.д. всё аналогично.
>>1613354Господи, когда вы начнете полный контекст читать. Писал выше, на примере детских - знаю все это. На AVR асме писал проги, на других 8бит асмах пишу вставки. Мне интересна именно практическая х86 ака серьезных процов с защищенным режимом и их взаимодействие с ОС.
>>1610764 (OP)Интересно сколько здесь юзеров в треде. Наверняка не мало. Так вот, вы что-нибудь уже написали? Хочется увидеть реальные проекты. Какой смысл изучать язык ради изучения. Где работающие программы?
>>1608964 →В питоне модно сделать исполняемый файл, который будет работать на других ПК? Или обязательно надо питон ставить каждый раз?
>>1613512можноесть всякие py2exe, python freeze и всякие другиено они все устроены так: берется интерпретатор и засовывается во внутрь бинарякрч полная хуйня, на питоне лучше desktop аппликухи не писать возьми c#
>>1611904правильно я понимаю что этот метод называется переполнением(overflow)?>>1613398спасибо, анчоус, понял. а в каких случаях нужно использовать эти unsigned, short и лонг. скажи, пожалуйста, молююю
>isalnumАллаху акбар.Пиши названия нормально блядь, а не как дебичи, что стандартные функции писали у них были на то причины, что все равно не делает им чести
>>1613595>>1613595>а в каких случаях нужно использовать эти unsigned, short и лонгНу signed, unsigned в зависимости от того, нужны ли тебе отрицательные числа или нет.А про short и long. Да, что хочешь то и используй. Главное, чтобы результат выражения/операции попадал в диапазон значений типа. Обычно просто int используют и всё. Если тебе нужны будут специфичные типы ты сам это поймёшь (это скорей всего будет связанно с оптимизацией по памяти, по скорости выполнения, специфическими структурами данных и т.п. Пока тебе рано ещё об этом думать). И лучше посмотри stdint.h из стандартной библиотеки и возьми за привычку использовать типы оттуда, потому что там разрядность гарантированна стандартом.
чуваки, не занимайтесь х..нейучите си в 2к20, дак открывайте исходный код modern си проэктов и читайте его, к пример гугловскую фуксию..удачи ..
>>1613626анон я сделал, определение интедежеров по типу переполнения, ручное вычисление. щас скоро код скину. с floataми пока всё туго, не понимаю нихуя. скоро буду к вам приставать с ними.
Наверняка, анон, тебе всегда было интересно, как выглядит 2 в овердохуятой степени. Дарю уникальную возможность, так сказать. Осталось запилить деление, заменить спринтфы какими-нить шустрыми макросами, ну и всяких корней, логарифмов по-мелочи нахуярить...https://pastebin.com/rHpxn65x
>>1613626https://pastebin.com/Q20BmgczВот, анчоусы. Решил задачу 2-1 из k&r теперь и с ручным вычислением диапазанов целых типов. Там вычисления в районе 10-20 секунд идут подождите, вывод не сразу будет. Этот метод переполнение же называется, да?>>1611904Анон, твой код бесконечный цикл создаёт. Не работает, он.Осталось только с floatами разобраться
>>1613626>И лучше посмотри stdint.h из стандартной библиотеки и возьми за привычку использовать типы оттуда, потому что там разрядность гарантированна стандартом.я возьму это на заметку, анчоус. спасибо, но потом. меня сейчас интересует строго книга k&r её пройду и если там этой библиотеки не косунь, потом ещё твою посмотрю.
>>1613651Ты посмотрел мой код с годболта (>>1611947)?Там нет цикла на миллионы итераций и это намного лучше, чем добавлять по 1. И он работает с флоатами и даблами.
>>1613656нет, я медленно всё переварию. здесь мне очень много помогают и кидают ссылок и я всё это читаю. пока я ещё до твоего пост даже не дошёл, анчоус.
>>1613656а смотрел твой код и после незнакомой библиотеки закрыл вкладку. потому что я учусь по книге мне итак нелегко, а здесь ещё в нагрузку всякие незнакомые библиотеки о которых я вообще не знаю. я уже писал уже неоднократно что меня интересуют только решения при помощи инструментов описанных в книге на тот момент когда появилась задача.извини, анчоусы, но варианты с незнакомыми мне функциями, библиотеками и прочим с чем я ещё не знаком я не рассматриваю пока.
>>1613667Она не нужна. Просто float и double не достаточно, потому я ещё 128-битную плавающую запятую прикрутил для проверки.Вот без неё. Там нет библиотек, и max_float я раскрыл без дефайна, можешь только на него смотреть проигнорировав другой код. max_float превращается в max_int заменой float на int без изменения другого кода.https://godbolt.org/z/vyrk8E
>>1613667Вот вообще безо все, если тебе мозолит глаза и отвлекает эта дичь: https://ideone.com/YoThYK
>>1613675ну не совсем уж без всего continue и <stdlih.h> мне тоже незнакомы. но я попытаюсь разобраться.
>>1613680><stdlih.h>Не нужен, случайно оставил.>continue Синтаксический сахар, во всех случаях можно заменить на цикл без него: https://ideone.com/8BYmnIЕщё добавил чтобы на каждом шаге значения переменных выводились для long long и для float, чтобы было понятна суть алгоритма.
>>1613709спасибо, идеально. мне там всё понятно. буду теперь на основе этого разбираться и высирать свой кодэ, спасибо ещё раз. скоро решение скину как с floatами. а потом вернусь 1-24 со скобками допиливать
>>1613354> изучение асма как раз нужно заходить со стороны цифровой схемотехникиЭто совершенно лишнее, если у тебя не embedded. И даже в таком случае некоторое время можно без этого понимания жить.> как к обычно-языку типа си, джавы и т.дЭто и есть обычный язык. Для программиста x86 ничем не отличается от виртуальной машины этой самой джавы. Даже если ты полезешь в конвейер и ниже.
>>1613709анон, а как работает пустой цикл for(;;) без аргументов? я что-то не понимаю. читаю сейчас твой код и не могу понять как пустой for работает. там же условие должно выполняться чтоб он работал а его нету.
>>1613709>>1615474я так понял пустой for автоматически по условию становится равен постоянно true до тех пор пока программа не завершит его returnом
>>1615475>>1615481Можешь заменить на for (;1;) или while(1). Просто бесконечный цикл до return-а.Всё ещё не уверен, что это хорошая (полезная) задача - 1.24 в разы более программистическая, чем какая-то фигня, где нужно знать про специальные значения по типу inf, про количество значащих запятых (1e40+124e20 строго равно 1e40, что может быть не очень очевидно) - всё это на стадии, когда ещё даже не знаком с continue/break точно лишь замусорит голову, лучше что-то полезное изучить.
>>1615488>Можешь заменить на for (;1;) или while(1). Просто бесконечный цикл до return-аспасибо, я уже провери у себя. да это просто цикл бесконечный, просто в первый раз с синтаксисом проебался.>Всё ещё не уверен, что это хорошая (полезная) задача - 1.24 в разы более программистическая, чем какая-то фигня, где нужно знать про специальные значения по типу inf, про количество значащих запятых (1e40+124e20 строго равно 1e40, что может быть не очень очевидно) - всё это на стадии, когда ещё даже не знаком с continue/break точно лишь замусорит голову, лучше что-то полезное изучить.Всегда можно будет вернуться с более большими знаниями и переделать. В любом случае лишним не будет. Сегодня желатлеьно 2.1 доделать, а потом 1-24
>>1615488а ты ещё функции вначале не описываешь. в k&r они сперва строчку функции делали, а потом уже её саму писали в конце. надеюсь ты понел о чём я
>>1615488разобрался, анчоус, в алгоритме твоём. прикольный, сам придумал или где увидел когда-то? анон, а вот когда я делал +1 постоянно это же переполнение называется, да?
>>1615674спасибо, анон. огромное возьму на заметку. алгоритм хороший ты мне подсказал, я теперь его буду везде применять когда нужно будет узнать максимально возможное кол-во чего либо.а вот здесь в библиотеки флоатов, много различных вариантов их все нужно выводить и рассчитывать? я честно говоря даже не каждый из них понимаю...
Короче сложно слишком, голова уже болит. Лучше продолжу книгу читать и другие задания к этим потом вернусь. К тому же я щас начал читать идущиц подпункт за 2.1 про константы и это то что мне нужно было чтобы граммотно принтить диапазоны раличных типов. В книге действительно задания как-то поспешны даются, не очень удобно
>>1615758Тому что это был код для целых, и под минимальным подразумевалось отрицательное с максимальным модулем, а не число больше нуля с минимальным модулем.Для дробных стоило бы вовсе другой алгоритм сделать, чтобы для 300 степени не требовалось под 300k шагов, а log(300)*k шагов.https://ideone.com/LEgATuМожно заметить, что значение получается ниже чем -38 степень. Там идут так называемые денормализованные числа с пониженной точностью (умножение на 0.75 не изменяет значения в последнем шаге), про которые можно вовсе не знать, если ты не связан напрямую с вычислительными методами.
>>1615912анон, я пока книгу продолжу читать и на упражнения забью, т.к. у меня уже мозг тупо не соображает. может быть я потом вернусь к ним. ты реально тут мне так всё загибаешь, слишком сложно уже
Подхватываю парад тупости, делаю задания от 2. по K&R щя...Почему у меня UINT_MAX и ULONG_MAX в <limits.h> имеют значения -1? gcc
>>1616293Короче, знаете, как в <limits.h> определены UINT_MAX и ULONG_MAX? 0xffffffff и 0xffffffffUL Я всё понимаю, но ничего не понимаю. Почему, если константу-адрес максимального unsigned int'a просто превратить в unsigned long-константу, должны получится разные числа? И как мне вывести само число printf'ом? Эта задача заставляет ебаться меня вовсе не с тем, что предполагал автор задачи, мде...
>>1616313Ну, не "определены", наверное, это же именованные константы, я не знаю, как они и где хранятся, но это неважно
>>1616313Сейчас заметил ещё такую хуиту:unsigned char i = -13 "печатает" i как 243, как и положеноНО unsigned int оставляет -13, хотя, по идее, должно быть, как с char'омМеня эти байтоёбские перипетии с ума сведут, объясните, умоляю...
>>1616313>должны получится разные числаУточню, что я понимаю, почему они разные с U потому что представление разное, дополнение до 2, вся хуйня, а почему L как-то его меняет с тем же количеством байт, я не понимаю
>>1616313>>1616330>И как мне вывести само число printf'ом?%d для signed, %u для unsigned. Ещё можешь написать (long long)n и вывести его через %lld, чтобы гарантированно.printf не знает тип, который ты передаёшь. Ты можешь туда хоть float засунуть под %d, и он напечатает float предполагая что переданные биты - это биты целого числа; естественно выведенное значение не будет иметь ничего общего с числовым значением флоата.
>>1616348А почему он unsigned char тогда правильно обработал?>>1616344Не знаю, мне казалось, что раз на современных машинах лонг лонг есть, то он не просто так. Хотя, судя по адресу, наверное, просто так. Я лишь предположил, что я что-то не ебу
>>1616369Кстати, поменялась, действительно, когда я стал использовать %u по совету >>1616348-джентельмена. Тогда вопрос, почему поменялось?
>>1616374Бля, объясни что ты делаешь и что у тебя получается, в коде желательно, словами ты не умеешь
>>1616374Вот это тебя смущает? Что только unsigned char работает в соответствии с ожиданиями?https://ru.wikipedia.org/wiki/PrintfИщи в поиске по статье "продвижени". Продвижение типа. Там даже конкретно про unsigned char указано, вроде бы.
>>1613406>Мне интересна именно практическая х86 ака серьезных процов с защищенным режимом и их взаимодействие с ОС.Там внутренняя кухня так меняется каждый год, каждое новое поколение, что в /hw/ у амуде-интело-срачеров в режиме 24/7/365 жопы горят, каких подробностей ты хочешь?В х86 настолько помойка в системе инструкций что там существуют аж 3 команды (int 80h, sysenter, syscall в 64-битном режиме) делающих одно и то же.> практическая х86 ака серьезных процов с защищенным режимом и их взаимодействие с ОС.Взаимодействие через прерывание и передачу команд. Взаимодействие с устройством из юзермода, в nix, например, идет через крайне замороченную и дырявую абстракцию типа "специальный файл" обычными fprint fscan , но когда нужно сделать что то странное типа настройки передать - то через системный вызов ioctl
>>1616441А зачем в линуксе развели эту бадягу, с устроством-файл и этими "тут играем, тут не играем а тут ioctl"
char ✸buf = "abcde";Есть ли способ узнать размер константы? strlen() не подходит, нужен настоящий размер, а там в середине могут быть нули. Компилятор же знает, есть ли способ вытянуть это знание?
>>1616460Разыменовывание в char дает его размер - 1.>>1616461Лол, круто конечно, но зачем нужен литерал без доступа к нему. Как на него сослаться в таком случае?
>>1616481>Разыменовывание в char дает его размер - 1.Ой, действительно, это же не указатель на массив. Нет, тогда не получить по buf его размер, делай sizeof("abcde").
>>1616494>делай sizeof("abcde")Так получается литерал-сирота без ссылок на него.Попытался накостылять решение. Какого хрена???Почему у меня на двух разных компиляторах, микрософта и борланда эта скотина конвертирует в указатель, выдавая "4", а на сайте нормально размер литерала "6"? https://ideone.com/VIRj03
>>1616528>Так получается литерал-сирота без ссылок на него.Ну ты так его создаёшь. Хочешь знать размер, делай массивом, а не указателем.
>>1616535Таких строк много, нужно копипастить, а define нельзя переопределять.>>1616538Вопрос был про получения размера литерала, а не массива.
>>1616544>Таких строк много, нужно копипаститьКопипасти. В чем проблема?>define нельзя переопределять.Зачем его переопределять? Каждый дефайн на один литерал.
>>1616544>Вопрос был про получения размера литерала, а не массива.А что не так то? Какой размер тогда должен быть по твоему? Даже с терминальным нулем по середине нормально измеряет.
>>1616555Мне кажется, ты не понимаешь что такое копипастить код когда нужно выполнять несколько одинаковых действий. Обрати внимания, что код одинаковый, кроме собственно литерала, чтобы можно было добавлять и удалить произвольное количество действий простой копипастой и ничего не ломалось.
>>1616583Мда.Так вот, литерал - это уникальная константа. Поэтому и дефайны должны быть на каждый дефайн свои #define YOU_LITERAL "you"#define ARE_LITERAL "are"#define DUMBER_LITERAL "dumber"
>>1616583Поскольку в сях нельзя включать директивы препроцессора внутрь других, то для этого пользуются инклюдами.#define LITERAL "one"#include "printsize.inc"//в конце можно #undef LITERAL#define LITERAL "on"#include "printsize.inc"
>>1616583>>1616587I'm dumber than you both combined, why don't you fuckers use arrays for its intended fucking purpose, when you need to know the size?
>>1616595Чтож, как я и подозревал, ты не понимаешь что такое литерал. Например, 5 это буквально число пять. Ты же пытаешься работать с ним как с переменной.
>>1616600Безымянные литералы массивов нельзя присваивать одной и той же переменной несколько раз. Как результат, копипастить не получится. Хотя, выше запостили трик со скобочками, тоже вариант.
>>1616650Чувак, был запрос на помощь в решении конкретной задачи, простой и ясной. Умные люди помогли найти решение, а ты погрузился в отрицание "почему эта задача неправильная и не нужна", типичный недоумок.
>>1616663В том виде, как ты сформулировал, действительно неправильная и не нужна. Скорее всего ты действительно ламер который делает какую-то ненужную чушь не тем инструментом.
>>1616718Кто куда посыпался? Читай про двоичную систему счисления. Какбе нельзя в ней точно выразить деление на 10. (Вроде бы потому что у 5 и 2 нет общего делителя)
>>1616739Лень расписывать все научно, ну как хранятся флоаты в двоичном виде? Это некое число mantiss*2expНо под мантиссу выделено фиксированное число битов.Соответственно в какой-то момент у тебя число перестанет в него влезать. Младшие биты мантиссы потеряются, а множитель мантиссы продолжит расти.Грубо говоря, было 11111111b x 64, умножаем на 10, там должно было бы стать что то вроде 010011111011b x 128, но в 8 бит это не влезет, поэтому придется порезать мантиссу до 8 старших бит 01001111b и увеличить экспоненту до 1024, в результате мы получаем 162816 вместо 163200Иными словами шаг между соседними числами будет расти с ростом числа кратно степени двойки, поэтому и вылезет противоречие с десятичными знаками.Float не подходит для точного поцифрового хранения числа, se la vi.
>>1612227>>1616663Может вам в JavaScript перекатиться? Там можно спокойнее класть хуй на стандарты, писать всякую дичь, браузер и пипл схавает
>>1616678Какой я ламер и какой вопрос глупый нет не имеет значения вообще. Понимаешь, был задан вопрос. Ответов, В ПРИНЦИПЕ может быть только два:1. Это невозможно.2. Решение.Разговор о неправильности задачи и переводе на другую, В ПРИНЦИПЕ не может начаться пока не получен предыдущий ответ. Потому что, только тогда можно (либо/либо):1. Перейти на другую задачу ввиду невозможности решения предыдущей.2. Сравнить два решения, старое и новое, и если новое лучше, ТОЛЬКО ТОГДА перейти на него.Говорить же, что "другая задача лучше", когда не решена предыдущая, это абсурд. Пустое кукарекание дебила, вытащенное из жопы.
>>1616718Потому что float ограничен по размеру и не годится для вычислений. Даже сам язык об этом говорит. Любая дробная константа, например 1.5, это double, float же можно сделать только специально ограничив размер как 1.5f. Короче, float не нужен, за исключением случаев когда действительно именно он нужен по спецификациям.
>>1617155>Аноны, как забивать гвозди микроскопом?>Лол, микроскопом не стоит забивать гвозди, и вообще в наши дни лучше заменить гвозди на закручивание саморезов>Неет, ответов В ПРИНЦИПЕ может быть только два>Это невозможно>Решение как забивать гвозди микроскопомКак скажешь.
>>1617182double тут ничем не поможет, ты столкнешься с той же проблемой, просто на пару десятков циклов позже.
>>1617187>double тут ничем не поможет>тутТут нет проблем, вычислений нет, тупо опыт по ломанию переменной.А я говорю про использование для вычислений, там только double, с float напорешься на косяки в обычных вычислениях.
>>1617184"Выбор", "лучше" подразумевает сравнение - наличие минимум двух вариантов. А у тебя только один, но но утверждаешь что лучший всё равно. Это вера, следствие фундаментальной тупости отдельного человека. Тот, кто предпочитает верить, а не думать, это дебил.
>>1617199А я тебе говорю про использование для вычислений, не используй double, он ничем не поможет будет так же криво, все равно понадобится библиотека для bigint/bignumber а то и символьных вычислений. На крайняк строки.
>>1617201Твоя проблема называется проблема XY. Пока ты не объяснишь, что именно ты хочешь сделать, а только говоришь с помощью чего, никуда продвинуться невозможно. Если тебе нужны строки и их длины, то может оказаться проще вообще генерировать .h файл где будут дефайны и для того и для другого, так и переводить программу на другие языки легче. А может проще взять c++ и нагородить там компайл-тайм строк на шаблонах.
>>1617187Автор вопроса ИТТ, я немного изучил по вашим наводкам этот вопро и вот што я из этого понял:Он поплыл при прибавлении к числу ста миллионов, как мы видим. Т.е, при сложении (base 10): 11 111 111и 100 000 000 происходит какая-то залупа, которая добавляет к числу единицу. Фактически это т.н. floating point rounding error, то есть, десятичное число по основанию 101 111 111 111Не может быть представлено на бинарном уровне (т.е. по основанию 2) как конечная десятичная дробь -- она будет иметь период. Комплюктер, чтобы сделать её конечной, округляет её, выходит число на единицу больше. Я не собираюсь считать это в лоб, потому что мне поебать, но на гипотетическом уровне происходит то, что я сейчас сказал. Т.е. это могло быть и меньшее число в другой арифметической прогрессии.Дальше идёт тупо накопление погрешностей округления (пикрил). ПОТОМ в какой-то момент заканчивается место в мантиссе числа, и n младших разрядов представления числа по основанию 10, соответственно, выражаются через экспоненту, которая записывается во младших битах, поэтому там тупо нолики хуячат. А потом просто уже переполняется максимально возможное число, разрешённое компилятором и, возможно, при этом архитектурой процессора, но это я не ебу, очевидно, чё там происходит, но он кидает в тебя бесконечность. Всё
>>1616459Никак, char* не сохраняет размер.Если хочешь размер - напиши char buf[]="", тогда в тебя в типе сохранится и его можно будет через sizeof получать, что в любом случае придётся сделать, если нужно печатать строку через printf.Я бы вот так сделал: https://ideone.com/TBunV4printf отказывается печатать строку, даже если явно указать что там 12 символов, но символов 12. Выглядит лучше, чем define/undef, но лишние переменные.>>1616718У флоата 7-8 значащих цифр, у дабла 15-16. Что такое значащие цифры сам найдёшь.Вот код: https://ideone.com/ZEj7su
>>1617204Ты прав наверное, просто помню, как-то раз понадобилось, и с float вылез косяк, а double его убрал. Понимаю, что для калькулятора не пойдет, только подумал, что в обычной программе не требуется прям чисто-пречисто.
>>1617212Алсо, пусть это примерно предоставит возможность понять, на какой ответ я рассчитывал, а то тут проблемы с коммуникацией частенько, как я понял
>>1617208Твоя проблема называется:>Я не знаю ответа на вопрос и искать его не хочу, но признавать свою тупость не желаю, поэтому буду агитировать за отмену вопроса. Нет вопроса - нет проблем, я всё знаю, нигде не ошибаюсь.Исповедь идиота.
>>1617234— Двач-медач, вот у меня почему-то раны вокруг рта…— Так ты ж ешь с ножа. Ложку попробуй.— Ложкоблядь закукарекала. Ложкой мне неудобно.— Тогда йодом помажь, лалка.— Двач, а почему я суп так медленно ем? И мне очень неудобно.— Потому что ты ножом суп ешь? Ложкой ешь.— Ложкобляди не нужны! Бамп! Еще варианты? Бамп!— Ну отхлебни из тарелки тогда.— Ебанутые...— Двач, почему на меня в ресторане так странно поглядывают?— Потому что ты с ножа ешь!— Каждый раз одно и то же, что за дебильные анонимусы. А другого объяснения нет?— Может и есть, но это не важно. Важно есть твердое вилкой, а жидкое ложкой.— Кажется, я совсем не понимаю мира и не гожусь для этой жизни.— Да все с тобой нормально, просто возьми ложку, когда принесут суп.- ПРОСТО! аххахахах! ПРОСТО! Ахуительная история. Угу. ПРОСТО блять. Спасибо, идиоты, за совет, блять.— Двач, двач! Мне так больно, у меня кровь течет! За что мне это?— Чем суп ел, дебилушка?— Ножом, конечно.— А ложку не пробовал взять?— Почему анонимусы так безжалостны ко мне, а еще двач-помогач?! Это невыносимо!— Ложку взять не пробовал?— Нет!— А что тебе помешало?— Я не хочу об этом говорить. Всё. Тред закрыт. САЖИ ТРЕДУ САЖИ. Вайп!— Знал бы ты, двач, как я хочу макарошек!— У каждого своя судьба.— Как ты думаешь, анон, когда-нибудь у меня получится поесть макарон? Я ведь не хочу ничего особенного.— Так свари макарон, возьми вилку и ешь.— Да? Хорошо, я подумаю.— Двач, и как люди манную кашу едят и не режутся?— Ложкой, блять!!— А чего ты ругаешься сразу? Я ж нормально спросил...— Анон, поговори со мной.— Я обедаю.
>>1610764 (OP)Чем автоматически доступ мимо массива найти? Его нет, но мне кажется, что может быть, а считать в голове сложно, я что калькулятор?
>>1617342>Чем автоматически доступ мимо массива найти? Его нет, но мне кажется, что может быть, а считать в голове сложно, я что калькулятор?Ты по-русски сначала писать научись, мысли свои выражать, а там и с массивами приложится всё.
>>1617368Я не думаю, что ты способен мне помочь, но объясню попроще. Есть массив int foo[10]. Мне надо найти, если вдруг где-то в программе есть bar = foo[11], или baz = foo[10]. Программа не валится с sigsegv, значит сейчас этого нет, но может быть при определенной комбинации параметров это может случиться. Нужна программа, которая может найти такие параметры, или сказать, что таких параметров 100% нет.
>>1617377ну в Си вообще плохо всё с проверками границ массивов. Некоторые параноики пишут макросы(функции) - обёртки, которые проводят рантайм проверки. Ещё тебе могут помочь всякие статические анализаторв кода. Но общая задача статического анализа кода на такие ошибки равносильна решению задаче останова, так что 100% не будет тебе.
>>1617377>bar = foo[11]У меня ide выдаёт предупреждение от такого.Посмотри что такое valgrind, например - даже если тебе нужен не он, с него выйдешь на схожие инструменты.
>>1617342Уфф, мой начальник что то подобное на плюсах делал.В общем, для начала надо обернуть создание таких массивов в функцию или макрос (new же вроде тут нет) да и доступ лучше сделать не через [] а через геттер.Суть в том чтобы создавать массив больше размером, и снизу и сверху. И заполнять его контрльными данными. Например55 AA 55 AA 55 AA 00 01 02 03 04 05 55 AA 55 AA 55 AAА в геттере проверять что данные не совпали с контрольными. Конечно там будут ложные срабатывания, но хоть что-то.
>>1617342Еще нагуглил что если размеры известны то что-то может найти статический анализатор, например опция -fsanitize=bounds
>>1617384Не, ну классно. Взял, расширил мой вопрос до статического анализа, и сказал, что на этот вопрос ответа не существует. Спасибо. >>1617387>valgrindУ них даже на википедии написано, что именно это он не умеет. Да и вообще я просто небольшой текстовый анализатор хотел, а не рантаймовый. В рантайме, как я уже сказал, всё и так работает.>>1617388Да это понятно, что можно, но мне просто найти foo[bar]for (int i; i<=bar;bar++){foo=3};даже аллоки без фри искать не надо.
>>1617387>У меня ide выдаёт предупреждение от такого.Ну и да, естественно, foo[11] и компилятор находит. А foo[bar ⛧ bar - 3 ⛧ baz],
Вырезаю из строки часть выделенную / /. Чому p_end не ищет то шо нужно? #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;}
>>1617394>Не, ну классно. Взял, расширил мой вопрос до статического анализа, и сказал, что на этот вопрос ответа не существует. Спасибо. >Да и вообще я просто небольшой текстовый анализатор хотел, а не рантаймовый. В рантайме, как я уже сказал, всё и так работает.ты не очень умный. я тебе объяснил, почему вопрос не имеет ответа на "100 процентов", твой "небольшой текстовый анализатор" эквивалентен задаче останова. Потом дал два практичеких приближения. но как я уже говорил, твоя проблема не массивах и сишечке, а в неспособности символы переводить в смыслы и обратно.
>>1618081>Найти bar = foo[11]>Ета задача останова! И ты тупой!Ебать ты долбоёб, братишка, соболезную.
>>1618248Если тебя интересует (не рантайм)проверка выхода за границы массива по константным индексам, то тебе кланг например, сам выдаст ворнинг. Если по индексам, которые хитровыебанно вычисляются - то это эквивалентно задаче останова. напиши интерпретатор брейнфака или любого другого тьюринг полного языка, пускай есть переменная j, в начале там 0. ты периодически выполняешь по шагу своей программы в интепретаторе, а потом выдаёшь на печать значение массива foo[j]. если интерпретируемая программа заканчивается, пишешь в о 12. Так вот если бы твоя простенькая статическаая проверка существовала, ты бы решил задачу останова таким нехитрым образом. но мне кажется, ты толлишь тупостью.
>>1618408Двачую. А то может у него вообще размер пользователем вводится, тогда вообще можно тушить свет.
А я просто эту хуйню решаю, если размер много где используется, то объявляю его в дефайне, а потом этот дефайн везде подкладываю, где возможен выход за границы. Правда яшитаю в 90% массивы зло и нахуй не нужны. Дали тебе маллок и фри - нет хочу говно есть и дрочить несчастный стек
>>1618562> дефайн везде подкладываюПиздец. Держи забытые технологии древних: #define countof(array) (sizeof(array) / sizeof((array)[0])) только с указателем не вызови случайно
>>1618572Ага, и везде вместо говорящего дефайна использовать макрос, который ещё каждый раз в рантайме будет считать значение из констант. Охуенно, производительно
>>1618576Если у тебя компилятор не от хлебушка, то на нормальном уровне оптимизации заменится на константу (для не ВЛА).
А в чем разница, если я объявляю j внутри цикла или в скобках for? Я вижу, что поведение j от этого меняется, а как и почему - не понимаю.for (int i = 2, j = 2; i < len; i++)//можно объявить j здесь{ int j = i; //а можно здесь}
>>1618620Сорян, затупил на несвежую голову. Очевидно, что если объявлять в for, то она только 1 раз объявится и будет сохранять значение на все итерации, а если внутри, то с каждой итерацией значение будет перезаписывать на i.
>>1618670Если не брать в расчёт оператор continue, то цикл for (чёто1; чёто2; чёто3) { хуйня };Эквивалентенчёто 1; while(чёто2) { хуйня; чёто3 };
>>1618931У тебя разметка поехала. Непонятно что в коде.Но вроде все правильно, ты искал слеш - нашел первое вхождение слеша.
>>1617652Если ты имеешь в виду найди позиции обоих слешей, то можно делать что-то вродеp_start = strchr(str, '/');p_end = strchr(p_start+1, '/');Естественно тут надо проверять что p_start не вылезает за границы строки.
>>1618576>>1618580VLA нинужны, для всего остального sizeof гарантированно считается на этапе компиляции, с любым уровнем оптимизации. И да, countof(unique_names) гораздо понятнее, чем всякие NUNQNM да, почему-то экономить буквы любят именно адепты подхода "задефайним размер массива где-нибудь в жопе">>1618588Кого ты наебать пытаешься? У одного байткод (и да, UBOUND был в старых бейсиках?), у второго дебаг-сборка.>>1618968> Естественно тут надо проверять что p_start не вылезает за границы строкиОно NULL вернет, если что. Но там не нужны никакие strchr, нужно просто завести флажок и идти циклом по строке. По / менять состояние флажка. С взведенным флажком мы символы пропускаем, со сброшенным - копируем.
>>1618968https://pastebin.com/jVwxcRR4Сорян шо сразу на пастбин не выложилНу я ищу две строки "/" и "/" p_end мне выдает тоже шо и p_start, счас снова прочел описания функций и понел шо я не правильно понял их назначения, блят вот я слоупок.Здравым ли будет алгоритм искать сначала например слеши и потом проверять нужную звездочку с необходимой стороны?
>>1619268>VLA нинужныТак то самый удобный способ работать с динамическими двумерными(многомерными) массивами.
>>1619391Этот вопрос тут поднимался много раз. Вкратце: если у тебя VLA неизвестного размера, ты всегда можешь выделить слишком много и получить переполнение стека, которое по-нормальному хуй обработаешь. Если ты заранее знаешь максимальный размер, то тебе не нужны VLA - ты можешь сразу выделить массив этого размера на стеке. Если ты не знаешь и не можешь предсказать размер, тогда у тебя есть malloc(), ошибки которого, в отличие от VLA, можно худо-бедно обработать. Все это касается в том числе и alloca() - нужно сильно подумать перед тем, как ее использовать.
>>1619268>Кого ты наебать пытаешься этой годнотой? Я лучше говна пожру.Сам себя наебал и доволен. Дожили.
>>1619601>Что за VLA?Нестатические массивы:int i = get_random_number();int a;Такого нигде нет, кроме какой-то новой версии именно Си (в плюсах тоже нет).Массивы обычно статические, в объявлении размер должен быть только константой.>Почему бы не использовать связные списки для этого?Потому что вкатывальщикам так проще. Лепишь тупо массивы везде, и оно работает на уровне лаба1, не нужно больше ни о чем думать.
>>1619604>кроме какой-то новой версии именно СиЭтой "новой версии" сто лет в обед. С99 называется. >>1619519>Вкратце: если у тебя 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 на стеке - да, плохая затея (впрочем я очень сомневаюсь, что проблемы могут возникнуть, если делать это в пределах нескольких кб)
>>1619609>Обычный способ маллокать двумерный массив - либо делать ручную арифметику(БУЭЭ!!)>так с помощью VLA>int (ж mas)[m] = malloc (sizeof(int) ж m ж n);>sizeof(int) ж m ж nА это что, не арифметика, или может НЕ ТА арифметика, лол?>>1619612>в яве такое прокатывает, почему бы и в си не? Вот именно, тут кроется огромная ловушка для подобных макак. И из за того, что "прокатывает" они так ничему и не научатся и будут писать неправильный код, даже не подозревая об этом. А когда потом где-нибудь программа от этого выпадет, они скажут: "си - нестабильное говно, вот на моей джаве всё заебись".
>>1619616>>1619616>А это что, не арифметика, или может НЕ ТА арифметика, лол?mas[k ж m + l] не в кайф писать, когда можно mas[k][l]. Если массивы многомерные, то первый вариант вообще станет уродливым. Вот что я под ручной арифметикой подразумеваю.
>>1619620Точно. С одномерным и так работает, а про многомерный не подумал, что в типе нужно хранить еще размер массива. Статический можно объявить, а динамический без VLA нет.
>>1620208Чиво бля?[code]int main() { for (int ii = 1; ii < 6; ++ii) { for (int i = 1; i <= ii; ++i) { putchar('$'); } putchar('\n'); } return 0;} [/code]
>>1621060>какие там компиляторы for perdoliya естьпиши в терминале gcc govno_proga.cчё это вообще означает, "для пердоли", он должен сам за тебя код писать?
Пишу для ананасов, с которыми общался месяц назад на счет реализации SWIM прошивальщика для STM8 на другом, более мощном, микроконтроллере.Таки вышло эту хуйню запилить, данные отправляю обычным GPIO bit-bang, написанном на ассемблере для исключения влияния оптимизаций компилятора, пайплайна процессора и прочей хуйни. Принимаются же данные с помощью счетчик+DMA на другом пине, который тоже подключен к SWIM пину стмки (отправлять и отправлять данные на одном пине одновременно ну никак не выйдет).
Аноны, хэлпаните. Хочу написать программу которая получает значения, делает по ним форумул согласно методу Наименьших квадратов и строит функцию этой формулы на графике типа пикрил.Так вот, есть ли на си какие-нибудь либры нестандартные чтобы подобные графики как пикрил принтить? разумеется в консоле рисовать его мне нахуй не надо это маразм.
Просто делюсь с вами, какой я феерический мудак, еблан, бес, черт и хуила. Вот эту хуету меня просят уже год. Да, до сих просит, потому что она хуево работает. dhnetsdk конечно показывать не буду, посадят нахуй, а cJSON - маленькая штука, спизженная с гита какого-то чела (внезапно влом руками жсонить). Это пиздос, как же я проигрываю с говнокода лютого. Захожу через удаленный рабочий стол на серверный комп, чтоб вручную там файлы менять и запускать, и потом через веб-клиент проверять результат работы, о я ебу. Она у них на полном серьезе крутится, логи хуярит, я не шучу, нахуй.https://pastebin.com/9WvRhej9https://pastebin.com/4ax0NV1Vпервое - собсно ПРОДУКТ (ух бля)второе - тестовый клиентя ебал
>>1624781Да нисколько, просто ковыряю (раз в два месяц, бля), как свое дите проблемное. Насосусь хуев на настоящей работе, вечером зайду на полчасика "пофиксить" и дальше забиваю.
#define debug_print(fmt, ...) do { if (DEBUG) fprintf(stderr, fmt, __VA_ARGS__); } while (0)Проблемный макрос. Так "debug_print("message");" - не работает, нужно указать второй аргумент - "debug_print("message", i);" - тогда пашет. Можно как-то сделать чтобы оба варианта работали?
>>1625086>#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;Вопрос: какое из двух объявлений будет самым эффективным по памяти? Или разницы вообще нет?
>>1625224Если у тебя уже >typedef struct zopa a;То ты нигде не должен писать funk(struct &a), а должен писать funk(a entity)
>>1625246>>>typedef struct zopa звезда_ебаная a;Это означает, что вместо struct zopa звезда_ебаная ты должен писать a.>И в gcc запись &а тащит.Ты скорее всего не понял, откуда она там взялась и что означает. В определениях функций вообще такvoid funk(type &a){...}быть не может в С. Это сиплюсплюсный синтаксис, который называется ссылкой.>А чо за entity?Просто слово, чтобы обозначить структуру, или переменную, или функцию. То, на что можно указать. Вint k = 4;k будет entity, переменная типа int.
>>1625224>>1625253Вот кароч: https://ideone.com/QoA13D>>1625228Блин, и правда, похоже что это фишка плюсов... Но вопрос про память остается открытым
>>1625256Я плохо объяснил, что такое entity, и ты не понял. Это никакой не термин, так что просто не используй его.Массив функций объявить нельзя, потому что функции разного размера, а массивы состоят из элементов одного размера.
>>1625254>Блин, и правда, похоже что это фишка плюсов... Но вопрос про память остается открытымСпрашивай в с++ треде, я не знаю.
>>1625256Функции это код, массив структура для хранения данных, так что массив функций сделать не выйдет, но можно сделать массив указателей на функции.
>>1625086Все гениальное (и портабельное, в отличие от трюка с ##) просто: #define debug_print(/∗fmt, ∗/...) do { if (DEBUG) fprintf(stderr, __VA_ARGS__); } while (0). Найди два отличия. Алсо, if (DEBUG) плохой тон (если это не переменная, конечно), надо делать #ifdef DEBUG. Банально потому что иначе какой-нибудь компилятор может высрать тонну предупреждений про unreachable code.
>>1625508массив указателей на разные функции можно, если у них одинаковые сигнатуры (типы параметров и тип результата), ну это просто следствие того, что все элемнты массива должны быть одного типа.
>>1625511Самый простой способ - кастить к 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.
>>1625526>>1625511Ахда, никогда не делай >>1625494 так, если не хочешь, чтобы тебя проклинали. Еще ни у кого не отвалилилсь руки от одного тайпдефа.
>>1625504> Алсо, if (DEBUG) плохой тон (если это не переменная, конечно), надо делать #ifdef DEBUGУ меня так и записано, то я пример со стековерфлоу скопировал.Твоя магия почему-то не работает, ругается на синтаксис да и я такого рода запись вижу впервые, выглядит странно error: expected parameter name, found "/" #define derr(/ fmt, /...) fprintf(stderr, __VA_ARGS__); stop();
>>1625671> да и я такого рода запись вижу впервыеДа это обычный многострочный комментарий, лол. А ты между / и ∗ пробелов понатыкал, еще бы оно работало. Имелось в виду "убери fmt из аргументов, оставь только __VA_ARGS__", а комментарий - напоминание читающему о том, каким именно должен быть первый аргумент макроса.
>>1625809Ну это очень не очевидно было учитывая отображение на борде.Способ крутой конечно, как я только сам до этого не додумался, спс.
>>16235261-wire - низкопроизводительная и простая хуита для датчиков, спроектированная специально чтобы иметь возможность крутиться на медленных мк; SWIM несопоставимо сложнее и быстрее.Для 1-wire ни счетчик, ни DMA не нужны, можно отправить сигнал по гпио и сразу же брать и ебать гпио инпут регистр в цикле.В SWIM, помимо проблемы большой частоты, еще в некоторых случаях нужно получать входной сигнал с стмки и в то же время отправлять сигнал.
Аноны. КАК СДЕЛАТЬ ПОДОБНЫЙ ГРАФИК НА СИ? КАКИЕ ЕСТЬ БИБЛИОТЕКИ? ЧТО ЕСТЬ? Или мне в С++ тред идти сразу?
>>1626775хоршо, спасибо большое. а можно через визуалку(визуал студио) прикрутить на сишную программу gui?
>>1626776>>1626778Я любитель, но вот как я себе это представляюСоздаёшь массив двухмерный - ссылка одномерная на блок памяти.Там для DrawArrays надо и координаты двухмерные и массив на цветаСоздаёшь этот массив с координатами и прозрачными цветамиПотом в цикле согласно функции закрашиваешь каждую точкуВозможно есть и либы, которые это проще рисуют
>>1626783>Создаёшь этот массив с координатами и прозрачными цветами>Потом в цикле согласно функции закрашиваешь каждую точкуПиздец нахуй.
>>1626791ну ладно, я так глянул open gl там впринципе можно даже 3d игры писать. помню ретурн вольф на нём был. ладно, спасибо. щас пойду осваивать.а можно gui формы через визуалку на си программу прилепить чтобы она консольный вид не имела?
>>1626796>а можно gui формы через визуалку на си программу прилепить чтобы она консольный вид не имела?Можно, я использую glut, он для создания окна, он значительно проще прикручивания окна для винды, просто текста меньше.GLFW альтернатива, я её ещё пока не использовал, но англ сайтах пишут, что она круче glut
>>1626800>>1626804спасибо огромное понел. анон, а вот то что я на opengl напишу, это на том компьютере где оно будет запускаться должен быть он установлен да?
>>1626774https://github.com/google/skia/blob/master/experimental/c-api-example/c.mdНо да, с GUI у сишки все традиционно хуево. Если у тебя винда, можешь на Windows API нарисовать, это относительно просто. Можешь вообще осилить слинковаться с gnuplot.>>1626800> я использую glut> GLFW альтернатива, я её ещё пока не использовалКак там в 2000х?>>1626796> а можно gui формы через визуалку на си программу прилепитСоздаешь .rc-файл, рисуешь диалог, потом DialogBoxParam, все.
>>1626807>это на том компьютере где оно будет запускаться должен быть он установлен даОн в венде есть по умолчанию, только подключение Lib GLFW потребуется - скачать и подключить>>1626808>Как там в 2000х?Напиши альтернативы, я сам не знаю.
>>1626809> я сам не знаю.Ты сам написал - glfw. Но рисовать на OpenGL двадэ графики линиями это такое себе. Например, glLineWidth уже овердохуя лет как "сломана" в не-legacy контекстах.>>1626814Если тебе на один раз - рисуй через GDI и не еби себе мозг. Примеров в сети овердохуя. Вот рандомный: http://www.cplusplus.com/forum/windows/227328/
>>1626816>Но рисовать на OpenGL двадэ графики линиями это такое себеТочками же, это с моей точки зрения максимально просто и понятно.Я просто с 2013 на freeglut и удивлён чего это его все так поносят. Что с ним не так, кроме старости?
>>1626817Контекст у тебя какой? 2.1? glBegin/glMatrixMode и вот это все? А так, хуже glut только aux, а с glfw работать приятно, он для людей.
>>1626822>Контекст у тебя какой? 2.1?Хы, да.>glBegin/glMatrixMode и вот это все?Нет, glDrawElements или glDrawArraysПо мне так нормально, благо всё это глубоко и прописывается однажды, я без проблем сделал настройки в которых меняется разрешение экрана, даже камера проблем не вызвала, речь о 2д гамессе.Управление, да, но решение нашёл.Однако я нашёл LearnOpenGL, так что скорее всего перекачусь на него, потому что я малость повоевал и сделал свой аналог дельты.
>>1626824Этот товарищ тебе тоже не особо поможет.Хочешь просто - пиши на шарпах, даже не придется другую IDE качать.
>>1627632Этот товарищ уже посоветовал Skia и GDI из Windows API. С тех пор график уже можно было десять раз нарисовать.
>>1627922>>Этот товарищВ смысле с++ ему не поможет.>>1627926Ты хотел просто нарисовать, я тебе про шарпы говорю про той причине, что там есть в коробке, например, Chart - подавай массив точек в него и у тебя уже будет нарисован график, который тебе конструктор форм в два клика сделает.Но ты сам выбрал писать всю логику заново на плюсовом гуе, где это более заебно.
>>1610764 (OP)Напомните кто-нибудь, как быстро и наиболее эффективно, посчитать количество единичных бит в байте?Что-то вроде:>n = (n>>1)&0x55 + (n&0x55);но это не то...
>>1628094((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)
>>1628097Оно каждый бит считает.>>1628099Пффф, ещё лучше.Вот, нашёл, на хабре - в три инструкции:https://habr.com/ru/post/276957/>n = ((n>>1) & 0x55) + (n & 0x55);>n = ((n>>2) & 0x33) + (n & 0x33);>n = ((n>>4) & 0x0F) + (n & 0x0F);Есть чё нить более эффективное для произвольных длин?Скажем, задача, подсчитать количество единичных бит в большом - байтовом массиве.
>>1628118Уж лучше тогда цикл. По крайней мере, развернуть его компилятор и сам может. И даже на popcnt осилит заменить.
>>1628128Я имел в виду, что оно каждый бит пробегает: https://rextester.com/IAXZKO9143 , а потом складывает.8 итераций цикла для числа 255
>>1628144Там ниже ускоренные варианты есть. Правильное решение такое: тестить в рантайме, есть ли popcnt, и если он есть, юзать его (лучше интринсиком, но можно и ассемблерной вставкой), а на случай, если нету, сделать лукап-табличку (которая тоже есть и по моей ссылке, и по твоей на хабре) для байта и бегать по ней.
>>1610764 (OP)Аноны поясните вот этот эффект >>405430>>405476>>405477Почему там не получается без volatile?
>>1628227Потому что компилятор соптимизировал твою it нахуй в while(it). Программа может туда попасть из while(1) только если it==1, никаких других действий между этими моментами нет, значит it всё ещё равно 1.
>>1628236Поигрался с фоагами и компиляторами на https://godbolt.org, не нашёл такой комбинации, которая оставляла бы первую проверку и съедала бы вторую. Но всё равно считаю, что такое возможно и именно это происходит.
>>1628243Оно не оставляет первую проверку (ну как я понял из вопроса). Оно не смотря на то, что переменная изменяется, считает ее неизменяемой и равной 0. Видит while и просто ебашит while(true);Судя по описанию.
>>1628244Я так понял, у него в нужный момент он мигает, а вот потом уже не пищит, или что он там задумал сделать после while(it);
>>1628245Вот сгенерил тебе пример на AVR, т.к. по себе знаю он такой же херней страдает.https://godbolt.org/z/7j5vTUАсм там довольно человекочитаемый. >Я так понял, у него в нужный момент он мигает, а вот потом уже не пищит, или что он там задумал сделать после while(it);Да я протупил. У него действие 2 должно дрочится пока кнопку не нажмет.
>>1628250К слову сгенерилось не такое же, но похожее - первый раз проверка i выполняется, а потом оно тупо подвисает. Причем если выполнено i - подвисает дроча do_somethingА если не выполнено - будет до посинения дрочить do_something_elseТ.е. код генерится в:if(i) { do_something_else++; while(1);}else { while(1) do_something++;}
>>1628252Небыстрофикс.Если выполнено i - один раз выполнит do_something и зависнет.Если не выполнено - до посинения дрочит do_something_else if(i) {do_something++;while(1);}else {while(1) do_something_else++;}
>>1628094>>1628097>>1628099>>1628118>>1628125>>1628128>>1628134>>1628144>>1628147>>1628154Заебенил вот такую шнягу, на C#, правда, а не на шланге: https://rextester.com/XMF85756Зато хорошо откомментировал. Кому надо - забирайте, хуитка считает биты не более чем за 4 итерации.
>>1628270>не более чем за 4 итерации. И в чём выигрыш и эффективность? Ты делаешь кучу операций за итерацию, плюс к этому сверху полируешь это всё умножением (которое, в принципе, можно заменить на iterations << 1). Я чёт очень сильно сомневаюсь, что это эффективней, чем просто в цикле проверять пока в байте есть единицы.
Двач, помогайНедавно решил в катиться в си, но столкнулся с проблемой что мне нужно указывать в этих скобках число большее единицыМожет есть какая нибудь фича чтобы не писать каждый раз по 20 раз "++"?
>>1629149>>1629150Там вообще можно любой стейтмент, можешь даже несколько - через запятую, если долбоёб и ненавидишь читающего код
есть список списков на питоне[ [123, 34543, 3454, 'str'], [3453, 43534, 345, 'str'],]как мне создать подобную структуру на ситипо знаю про существование стурктур, enum, union, но всё ли ето вместе использовать мне.типо https://pastebin.com/KXQ3iAmfнужна подсказка как сделать многомерный mixed array
>>1629533void* твой друг для разнородной херни. Но в твоём примере, вроде, обычный массив структур, тока ты скобки квадратные забыл после объявления там.
>>1629541Правильно ли я сделал? И теперь чтобы инициализацию сделать мне надо типо конструктора написать? типо что куда ложить? Блет надо снова перечить справку в керниганаhttps://pastebin.com/EY244DnuРуководствовался этимhttps://stackoverflow.com/questions/18577404/how-can-mixed-data-types-int-float-char-etc-be-stored-in-an-array
>>1629674Если тебе надо, чтобы в одной ячейке массива хранилось несколько типов, то тебе надо использовать массив структур Скорей всего это тебе и нужно , например:https://godbolt.org/z/4c7UXhЕсли тебе надо разные ячейки массива интерпретировать как разные типы, то нужно использовать, то что ты нашёл на стаке. Но ты походу не так понял, судя из твоего примера. Я пофиксил твой пример. https://godbolt.org/z/YTzSzGТут сложно в тексте объяснить, короче говоря, ты с помощью enum константы определяешь тип данных который хранится в определённой ячейке и соответствующим образом её обрабатываешь.
>>1629740Массив союзов ему нужен и доступ по указателю. Ты хуйню не оптимальную предлагаешь какую то.typedef union{ void addr; uint32_t as_int; char* as_string;}my_union;my_union array_of_unions[16];
Господа сишники, кто нибудь прогал с libusb? Никак не могу найти функцию, которая бы отправляла данные на мышку, которая, в свою очередь, меняла бы цвет.Эти дескрипторы для всех девайсов почти одинаковые, есть хотя бы мысль на что смотреть? На endpoint, али как?
>>1629838>>1629851Там макаба указатели сожрало.Короче вся хуйня должна быть указателями. Хранить в союзе указатель и данные это какая то ворошиловская стрельба по коленам.
>>1629852А мышка может? Я вот только вчера пробовал моргать светодиодом CapsLock и вычитал что на USB для этого каждый производитель каждой клавиатуры должен делать поддержку специальной залупы, на которую понятно, все хуй клали и в итоге нигде не работает.
>>1629852> которая, в свою очередь, меняла бы цветИ не надейся. Нестандартная хуйня, может реализовываться кучей разных способов, особенно в программируемых игровых мышах (там вообще пиздец). Возьми USB сниффер любой и посмотри, как родное приложение делает.>>1629863> все хуй клали и в итоге нигде не работаетЧо, правда? Оно еще в 1.1 было, и везде работает. Попробуй вот так проверить: https://pastebin.com/raw/q082MYZk А вот напрямую переключить у тебя не получится, потому что винда (если у тебя винда) запрещает без дров работать с системными устройствами ввода.
>>1629937Для капслока? Нахуй? Я имел в виду, что напрямую через libwinusb клавиатурой управлять не получится. А чтобы просто поморгать не влияя на ввод, существует IOCTL_KEYBOARD_SET_INDICATORS.
>>1629729После C99, и в C++, return 0 можно не писать. До этого хз, возможно не UB а implementation defined.
>>1629932> может реализовываться кучей разных способов, особенно в программируемых игровых мышахСпасибо за совет со сниффером, теперь мне более понятно, какие байты за что отвечают при передаче данных на мышь.Теперь самое интересное, через какую функцию передаются RAW данные в libusb. libusb_fill_bulk_transfer() может?http://libusb.sourceforge.net/api-1.0/group__libusb__asyncio.html#gad4ddb1a5c6c7fefc979a44d7300b95d7
>>1630062А теперь внимательно посмотри на три строчки ниже. Поэтому нет, тебе нужен control transfer, а не bulk. И да, если эта хуйня через set report работает, то это совсем даже не костыль.
>>1630178Я не могу найти функцию set report в libusb, попробуй найти сам в доках. Я сам склоняюсь к control transfer, но будет ли это работать, хуй знает.
>>1630221Set 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.Я бы на твоем месте хоть краем глаза, но просмотрел спеку целиком.
>>1630264Спасибо за помощь :)Теперь все работает спокойно через libusb_control_transfer совершенно спокойно, могу менять цвет на моей мыши и скорость их смены и режимы.Теперь можно будет прихуярить что-нибудь для изменения DPI и можно прикрутить GUI ко всему этому, с ползунками :)
Вобщем, имея опыт программирования на С++, решил таки прочитать кернигана для расширения и уточнения своих знаний.Интересно, но вот от примеров кода глаза вытекают, особенно шокирует предложение в некоторых случаях для краткости не использовать фигурные скобки, что ещё больше усложняет процесс чтения кода.
>>1630887> не использовать фигурные скобки, что ещё больше усложняет процесс чтения кодаПрограммистам на питоне расскажи. Фигурные скобки используют постоянно не потому, что читаемее, а потому, что можно случайно сделать пикрил. Конечно, если бы все люди пользовались IDE, проблемы бы не возникало, но вот когда у тебя обычный текстовый редактор, то при попытке дописать второй стейтмент, тебе нужно самому не забыть поставить скобки, а не забыв, еще и курсором побегать туда-сюда. Проще поставить заранее.
>>1630944>но вот когда у тебя обычный текстовый редакторАх линуксоиды!Ну ничего! Есть же всякие геану и прочия редакторы!Кстати, я в основном использую 2010 ВС, там нету такого, чтобы что-то автоматом подставлялось, я как автомат всё делаю, а вот в 2019 уже это дело есть, удобно.На деле же я по сути убеждаюсь в необходимости и верности развития языка С в С++, а так же в том, что ему действительно не нужно ничего больше.Так же удивляет, что почему-то в С++ при обучении тыкают в лицо cin и cout, когда есть более удобный и логичный printf, странно.Ну и блядские строки символов вместо string, ммммм, чуть что не так и исключение.>>1630954Смотря на чём писать, я просто забил и проверяю на ВС 2010, мне сойдёт.
>>1630961>Так же удивляет, что почему-то в С++ при обучении тыкают в лицо cin и cout, когда есть более удобный и логичный printf, странно.printf это си, а не плюсы, он не понимает классы. А еще printf это целое минное поле подводных камней почитай википедию, страшнее >Ну и блядские строки символов, ммммм, чуть что не так и исключение.строк. А плюсы и классы сделаны как раз для избежания подобного. Так что в плюсах преподают потоки совершенно правильно.
Анон который пару тредов назад кидал скрин Ваткома с отладкой со значениями переменных как это настроить?
>>1631058> это целое минное поле подводных камнейДа хотя бы одно только то, что параметры форматирования у потоков перманентые, сразу нахуй перекрывает все очевидные неудобства printf. Какая-нибудь говнолиба сделает cout << hex , а обратно вернуть забудет, а потом ты такой cout << 120, и все нахуй взрывается, потому что на выходе не 120, а очень даже 78.
>>1631135Манюнь, ты пишешь какую то дичь, а вот от принтфов повзрывалось буквально программ на миллиарды.
>>1631135Интересная информация, но не относится к сказанному, да и даже если пиздеть на эту отвлеченную тему, неправильный вывод это не UB и чтение не той памяти.
>>1631144> чтение не той памятиДля этого крестопотоки не нужны. Достаточно было просто не пихать пользовательский ввод первым аргументом.
>>1629838на помню шо хочу сделать подобный список списков на питоне[ [123, 34543, 3454, "str"], [3453, 43534, 345, "str"],]Я не правильно инициализирую числа, строка записывается, у меня каша от юнионов структур и перечислений, юнионы где то читал шо такая же структура только ссылается на один участок памятиhttps://godbolt.org/z/ChrHYE
>>1631171Заебал. Тебе уже написали, что тебе нужна структура, а юнионы тебе не нужны. Юнионы тебе понадобятся, когда ты захочешь, чтобы любой элемент мог быть любого типа.
>>1631249Такое нужно специально писать ради троллинга. А остальные шероховатости решаются автоформатированием в студии по нажатию пары кнопок.
Хорошие ресурсы по векторизации в gcc?Атрибуты на выравнивание, интрины, терминология (фетчи, перфетчи, етц.).Уклон скорее в понимание, чем именно в гцц.
>>1631058Да, только что сам подорвался, беру свои слова обратно. Впрочем, я итак использую cout и cin, printf мне показался удобным.
for (int i = 0; 1; ++i)printf("E\n");вот здесь что сперва происходит printf или ++i. По-моему printf я так понял что ++i делается после каждого выполнения тела цикла. Я прав?
>>1631492выполняем выражения это я так понимаю тело цикла выполняется, а потом уже count да? спасибо за баивую картиночку, понял.
А зачем Enum нужен я так и не понял. Читаю книжку из оп поста на английском и мой аннглийский не такой хороший чтобы хорошо там всё понимать.
>>1631592Я не знаю. Я ещё ничего даже не открывал. Ну просто я помню по программированию что документацию сложно читать если у тебя отсуствует представление об этом.
>>1631577Щяс потыкал, да согласен, лёгким движением мышки всё настраивается, но чому оно на електроне то?
>>1631569Qt Creator официальный редактор, конечно ты должен в него, если собираешься серьезно заниматься QtCodeblocks и Geany обычные хорошие IDE, если ты хочешь гуйVim и VStudio для поехавших задротов, проще поставить имакс со всеми фишками из коробки и не ебать мозг
>>1631891Ребенок, а что было нужно до появления вскода, подарка от майкрософт? Он же только недавно вышел.
>>1631913Разговор вроде про иде, которые понимают код, а не текстовые редакторы.>>1631909Позвони когда Qt станет стандартом. Никогда, ведь в юниксах только консолька стандарт, остальное васянские поделки, никому не нужные.
Пиздец, этот тред просто мертв. На 10 перекатов выше 90% одни шизостуденты, троечники и просто полнейшие уебки, какой-то долбоеб спрашивает блин пачиму в кристах заставляют в паток писать када можна писать чуть более высокоуровневой обёрткой для потока из сишки!!)) другой дегенерат ему ниже отвечает ахах ну ты дурееень классооов-то неееет!!))) Спасибо школе 21 за это
>>1632463Открой треды хотя бы двухгодичной давности, там ещё были адекваты, а посты вроде Я ПОЛЬЗУЮСЬ ВСКОД А ТЫ.. или ЗАЧЕМ НУЖЫН СТРУКТ просто игнорировались
>>1632471Практика показала, что адекватам здесь скучно, и они все свалили. А игнорировать посты тебе и сейчас никто не запрещает.
>>1632463>>1632471Ну давайте новости обсудим. Кто уже успел поиграть в [[скобочки]]? Что сказала о [[скобочках]] ваша IDE? Как вы думаете, через сколько лет можно будет писать код со [[скобочками]] и ожидать, что он соберется не только в гцц?
>>1632471Что ты до вскода доебался? Там обсуждали серьезную проблему выравнивания кода в ифах. Я считаю что статический анализ надежнее, чем как кто то предложил что студия сама везде скобочки расставит.
>>1632533Не пойму твоих рассуждений. Вот в студии можно нажать кнопочку и работает, а еще там решарпер есть сверху. А что такое "статический анализ"? Гдн это, что нажать? В перде? Извините, не надо такое.
>>1632626> А что такое "статический анализ"?Это когда компилятор вместо компиляции или параллельно с ней внимательно смотрит на исходник и говорит, что код говно, и автор мудак. С пруфами, разумеется.> Гдн это, что нажать?cl /analyze (есть в виде кнопочки в студии), scan-build (он же clang --analyze), единорог, ну и прочие убогие цппчеки и сплинты, про которые вспоминать стыдно.
>>1632626Так бы и сказал что ты писатель laba1. Забыл нажать форматирование в студии = самолет упал, кому такое нахуй надо? Анализатор настраивается один раз, запускается при каждой сборке.
>>1632665>scan-build (он же clang --analyze), единорог, ну и прочие убогие цппчеки и сплинты, про которые вспоминать стыдно. Это, что пердолить консольку, а потом глаза ломать об высер в неё же? Не понимаю, какой смысл. Покажи гифку или видео как ты этим пользуешься. А то у меня впечатление, что это всё настолько бла-бла, что на практике упоминать в конкретике.>>1632674Какой анализатор? Что настраивается? Давай конкретно. А пока у тебя ничего нет, только пустая брехня. Я конкретно сказал про студию и решарпер. От тебя не слышу такой же конкретики что использовать, для чего и как.
>>1633065Дегенерата видно издалека.>>1633166Умеет что?Вроде была речь про ИДЕ, как следствие понимание редактором кода, как следствие возможность форматирование кода, а конкретно выделенного в редакторе текста по нажатию снопок.Ну так что твой генератор простыней может и зачем нужен?
>>1633179> Вроде была речь про ИДЕ, как следствие понимание редактором кодаРечь была о >>1630944 неправильно расставленных скобках. IDE умеет их авторасставлять, и на приведенном пике, когда ты bar начнешь писать, скобки у if появятся. А вот если код уже написан, или вот эта автоматическая вставка не сработала по каким-то причинам, IDE тебе больше ничем помочь не может. Между тем, в твоем коде баг. Для поиска этого и других, гораздо более хитровыебанных багов помогает статический анализ (ну и чтение кода человеками тоже, разумеется).
>>1633359Скобки автоматически появляются через строчку выше из за отстцпа через строчку ниже? Занятно. У меня такого нет и если бы было, отключил. Текст должен вставляться только после текущего положения и срямо после него, а не прыгать через строчки и тем более назад, это само по сабе генератор багов. Больше похоже на питонодебила, который хочет натянуть на си свои дурные привычки, где отступы это главное, а скобки лишь следствие. Какой-то жирный троллинг в си треде. Да и вообще фича ненужной сомнительности , а развели столько разговоров.
Зачем ENUM в си нужен? я не понимаю. ещё бы понял если бы он список чего то содержал, так он же список констант содержит нахуй он нужен вообще?
>>1633729Посмотри хотя бы на (псевдо)syscall'ыТы можешь писать в программе OK / EXIT / CRASH с опциональными числовыми преобразованиями или тупо вговнокаживать 0 / 1 / 2 с комментами рядом, что это syscallСтрукты какие-нибудь в этом случае излишни
>>1633729enum необходим чтобы показать какие значения может принимать та или иная переминная и никаких других кроме тех что в Enum.
>>1633729Для удобства. Забей хуй, когда в си прокачаешься до определённого уровня сам поймёшь. Enum это необязательная фича.
>>1633793Не проверяется. Никаких кастов нет, enum - это какой-нибудь сорт int (по факту всегда signed int). Но ты можешь прочитать код и увидеть, что именно ожидается.
0x02f шестнадцатиричное число0x это же не элемент его? это просто индикатор что число шестанадцатиричное, так?