Во время тестирования полосы прокрутки я столкнулся со множеством проблем, связанных с преобразованием числовых конечных промежутков.
В основном, виновата моя реализация intMap и моё непонимание принципов работы числовых промежутков.
Так же в intMap: не проверяется деление на ноль; не сортируется минимальное и максимальное значение (а это важно); не гарантируется определённое поведение, если исходное значение находится вне диапазона; при некоторых условиях возвращаемое значение будет находиться вне диапазона или с неправильным знаком.
Количество чисел в разных видах конечных промежутков:
Рассмотрим промежуток:
Это закрытый промежуток, тогда по формуле
В комментариях есть полезные ссылки по теме.
ссылка на канал | ссылка на группу
В основном, виновата моя реализация intMap и моё непонимание принципов работы числовых промежутков.
Так же в intMap: не проверяется деление на ноль; не сортируется минимальное и максимальное значение (а это важно); не гарантируется определённое поведение, если исходное значение находится вне диапазона; при некоторых условиях возвращаемое значение будет находиться вне диапазона или с неправильным знаком.
Количество чисел в разных видах конечных промежутков:
* закрытый[A; B], если A ≤ B, то B - A + 1* открытый(A; B), если A < B, то B - A - 1]A; B[ (с подачи Н. Бурбаки)* полуоткрытый(A; B] или [A; B), то B - AРассмотрим промежуток:
[1; 3] ∈ { 1, 2, 3 }.Это закрытый промежуток, тогда по формуле
B - A + 1 будет 3 - 1 + 1 = 3 числа.В комментариях есть полезные ссылки по теме.
ссылка на канал | ссылка на группу
🔥1
Я настолько часто на бумаге делаю всякие расчёты, прикидываю макеты, придумываю алгоритмы, что у меня уже целая папка исписанных листов А4.
Бумагу использовать в таких количествах жалко, ctrl + C и ctrl + Z там нет, стирать значит размазать и так далее — много неудобств.
Поэтому сегодня я купил себе графический планшет).
Когда-то я занимался рисованием, может стоит снова попробовать это хобби.
ссылка на канал | ссылка на группу
Бумагу использовать в таких количествах жалко, ctrl + C и ctrl + Z там нет, стирать значит размазать и так далее — много неудобств.
Поэтому сегодня я купил себе графический планшет).
Когда-то я занимался рисованием, может стоит снова попробовать это хобби.
ссылка на канал | ссылка на группу
🔥2
Спустя несколько дней экспериментов в теории и на практике, нескольких прочитанных сайтов по математике и одного дня полноценного отдыха, я наконец-то смог найти закономерность, понять причину ошибок и исправить её.
Теперь всё работает идеально.
Эта функция особенно понравится тем, кто занимается
Главное понять, что много вещей можно представить через промежутки (диапазоны) и с ними можно делать разные операции: инвертировать, сжимать и расширять, сдвигать.
Сейчас у меня мало свободного времени, поэтому полный доклад на эту тему с интересными подробностями (например, найденные закономерности) и анализом я напишу и опубликую потом.
Если вам нужна версия этой функции, которая будет работать не только с
Я просто использую только целочисленные типы данных для вычислений, не люблю
Если вы будете кому-то пересылать эту функцию или советовать, пожалуйста, приложите ссылку на первоисточник, пусть больше людей знают, где можно найти что-то полезное или интересное.
Если вам на сайте stackoverflow попадутся похожие темы с кодом на мою функцию, можете также в ответ дать ссылку на мою функцию.
Скачать реализацию функции rangeMap
Устаревшая реализация (deprecated implementation)
ссылка на канал | ссылка на группу
Теперь всё работает идеально.
Эта функция особенно понравится тем, кто занимается
arduino (вместо встроенной функции map), но и разработчикам под ПК она тоже будет полезна.Главное понять, что много вещей можно представить через промежутки (диапазоны) и с ними можно делать разные операции: инвертировать, сжимать и расширять, сдвигать.
Сейчас у меня мало свободного времени, поэтому полный доклад на эту тему с интересными подробностями (например, найденные закономерности) и анализом я напишу и опубликую потом.
Если вам нужна версия этой функции, которая будет работать не только с
int64_t, а с int или float / double, предлагаю вам просто заменить int64_t на нужный вам тип данных или сделать её шаблонной.Я просто использую только целочисленные типы данных для вычислений, не люблю
float / double.Если вы будете кому-то пересылать эту функцию или советовать, пожалуйста, приложите ссылку на первоисточник, пусть больше людей знают, где можно найти что-то полезное или интересное.
Если вам на сайте stackoverflow попадутся похожие темы с кодом на мою функцию, можете также в ответ дать ссылку на мою функцию.
Скачать реализацию функции rangeMap
ссылка на канал | ссылка на группу
👍2🔥1
Рубрика "полезные флаги для GCC (mingw)".
Я часто нахожу полезные флаги компилятора, которые облегчают исправление кода, но забываю рассказать о них другим).
Сегодня вопрос в чате напомнил мне о ситуации, когда случайно или по незнанию в функцию
Например, функция ожидает
предупреждает о несоответствии типов аргументов и квалификаторов
если указан предыдущий флаг, предупреждает о несоответствии знаковости квалификатора и аргумента.
Эти флаги доступны с версии GCC 5.0 и выше.
ссылка на канал | ссылка на группу
Я часто нахожу полезные флаги компилятора, которые облегчают исправление кода, но забываю рассказать о них другим).
Сегодня вопрос в чате напомнил мне о ситуации, когда случайно или по незнанию в функцию
printf передаётся аргумент, который не соответствует квалификатору или наоборот.Например, функция ожидает
signed int, но получает unsigned int.-Wformatпредупреждает о несоответствии типов аргументов и квалификаторов
-Wformat-signednessесли указан предыдущий флаг, предупреждает о несоответствии знаковости квалификатора и аргумента.
Эти флаги доступны с версии GCC 5.0 и выше.
ссылка на канал | ссылка на группу
👍2❤1
Использование define'ов, конечно, осуждаемо и часто сомнительно, но в условиях, когда работы много, а времени мало, выбирать не приходится.
Тем более, разве, define'ы не помогают избавиться от повторения кода?
Получилось сделать довольно быстро и удобно.
Примерно таким образом я вижу свою будущую переработанную строковую библиотеку для работы с кодировками utf-8 и utf-16: просто берёшь и получаешь желаемый результат.
ссылка на канал | ссылка на группу
Тем более, разве, define'ы не помогают избавиться от повторения кода?
Получилось сделать довольно быстро и удобно.
Примерно таким образом я вижу свою будущую переработанную строковую библиотеку для работы с кодировками utf-8 и utf-16: просто берёшь и получаешь желаемый результат.
ссылка на канал | ссылка на группу
👍1
При запуске отладки по нажатию на F5 иногда в консоли появляется ошибка и отладка не запускается.
Бывает, даже повторяется несколько раз подряд.
Обновление vscode и gcc до последних версий не помогло.
Намеренно повторить это не получается.
Кто сталкивался с таким поведением отладки в vscode с расширением C++ от microsoft?
ссылка на канал | ссылка на группу
Бывает, даже повторяется несколько раз подряд.
Обновление vscode и gcc до последних версий не помогло.
Намеренно повторить это не получается.
Кто сталкивался с таким поведением отладки в vscode с расширением C++ от microsoft?
ссылка на канал | ссылка на группу
Dmitry Develop
IDECompilers.png
Меня всегда забавляет читать "труды" людей на тему, в которой они абсолютно не разбираются.
Заголовок прямо кричит: ищете самые лучше C++ компиляторы? Узнайте о ТОП 6-и, которые вы обязаны попробовать.
То есть статья должна быть именно на тему компиляторы С++ и должна помочь выбрать какой-то конкретный из них или дать исчерпывающие ответы и объяснения.
Во вступлении говорится о каком-то чувстве "студента, программиста или человека в IT, который постоянно меняет компиляторы".
Уже немного странно, но ладно, это ведь только вступление, хотя и такое безобразное и не затрагивающую обширную тему напрямую.
И тут внезапно заголовок "Что такое IDE".
Ладно, допустим, это действительно важно рассказать о существовании и что это вообще такое этот ваш IDE.
Не буду затрагивать определение от автора что такое IDE, оно более-менее отвечает на вопрос заголовка для обывателя.
Но причём тут "каждый WEB разработчик знает..." и C++ компилятор?
И тут автор наконец-то переходит к сути статьи, перечислению тех самых лучших компиляторов по мнению не пойми кого:
"Разве мы же хотим самого лучшего? Поэтому вот некоторые самые лучше компиляторы C++, которые вы можете найти в 2022 году".
"1. Visual Studio Code FREE"
И начинает перечислять IDE, редакторы кода и notepad++ и кратко описывать их.🤨
Я хотел видеть компиляторы C++, какие существуют, в чем заключаются их отличия, преимущества и недостатки, может, краткую историческую сводку, но не это всё.
Сама статья:
https://in.godaddy.com/blog/looking-for-the-best-c-compilers-check-out-top-6-you-must-try/
ссылка на канал | ссылка на группу
Заголовок прямо кричит: ищете самые лучше C++ компиляторы? Узнайте о ТОП 6-и, которые вы обязаны попробовать.
То есть статья должна быть именно на тему компиляторы С++ и должна помочь выбрать какой-то конкретный из них или дать исчерпывающие ответы и объяснения.
Во вступлении говорится о каком-то чувстве "студента, программиста или человека в IT, который постоянно меняет компиляторы".
Уже немного странно, но ладно, это ведь только вступление, хотя и такое безобразное и не затрагивающую обширную тему напрямую.
И тут внезапно заголовок "Что такое IDE".
Ладно, допустим, это действительно важно рассказать о существовании и что это вообще такое этот ваш IDE.
Не буду затрагивать определение от автора что такое IDE, оно более-менее отвечает на вопрос заголовка для обывателя.
Но причём тут "каждый WEB разработчик знает..." и C++ компилятор?
И тут автор наконец-то переходит к сути статьи, перечислению тех самых лучших компиляторов по мнению не пойми кого:
"Разве мы же хотим самого лучшего? Поэтому вот некоторые самые лучше компиляторы C++, которые вы можете найти в 2022 году".
"1. Visual Studio Code FREE"
И начинает перечислять IDE, редакторы кода и notepad++ и кратко описывать их.🤨
Я хотел видеть компиляторы C++, какие существуют, в чем заключаются их отличия, преимущества и недостатки, может, краткую историческую сводку, но не это всё.
Сама статья:
https://in.godaddy.com/blog/looking-for-the-best-c-compilers-check-out-top-6-you-must-try/
ссылка на канал | ссылка на группу
Полезные ссылки для С++ разработчиков.
Когда пишут привет, но не переходят к сути вопроса сразу:
https://nohello.net/
https://neprivet.com/
Когда задают вопрос, подразумевающий другие вопросы, вместо конкретики:
https://nometa.xyz/
Когда спрашивают какие-то очевидные темы, и так хочется послать в google:
https://googlethatforyou.com/
Когда просят решение проблемы Y вместо проблемы X:
https://ru.wikipedia.org/wiki/Проблема_XY_(Ошибка_молотка)
Как правильно задавать вопросы:
http://citforum.ru/howto/smart-questions-ru.shtml
https://www.google.com/search?q=как+задавать+вопросы
MRE (minimal reproducible example):
https://stackoverflow.com/help/minimal-reproducible-example
https://en.wikipedia.org/wiki/Minimal_reproducible_example
Список различных IT групп:
https://t.me/it_chats/865
Справочник по C++:
https://en.cppreference.com/w/
Черновик стандарта C++:
https://eel.is/c++draft/
Квест на знание стандарта C++:
https://cppquiz.org/
Дорожная карта C++:
https://roadmap.sh/cpp
Различная информация по С++:
https://github.com/JoshuaJakowlew/cppfaq
https://gist.github.com/honey-speaks-tech/225e0ce05430a6c2e3d3c68e0e4a35d9
Неявное становится явным:
https://cppinsights.io/
Перевод непонятных Си объявлений на понятный английский язык:
https://cdecl.org/
https://github.com/paul-j-lucas/cdecl
Преобразование msvc/gcc mangled символов в читаемый вид:
https://demangler.com/
Что такое UB в С++:
https://github.com/Nekrolm/ubbook/blob/master/README.md
Советы по стилю написания C++ кода:
https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines
Изучение языка C++:
https://www.learncpp.com/ (оригинал на английском)
https://ravesli.com/uroki-cpp/ (перевод на русский)
https://acode.com.ua/uroki-po-cpp/ (перевод на украинский)
Online компиляторы:
https://www.onlinegdb.com/online_c++_compiler
https://godbolt.org/
Выравнивание, отступы и упаковка членов данных структуры:
https://www.geeksforgeeks.org/structure-member-alignment-padding-and-data-packing/
https://habr.com/ru/articles/142662/
https://learn.microsoft.com/ru-ru/cpp/cpp/alignment-cpp-declarations
Что такое trap representation?
https://ru.stackoverflow.com/a/838699
Unicode таблица символов:
https://design215.com/toolbox/utf8-4byte-characters.php
Изучение системы контроля версий git:
https://git-scm.com/book/ru/v2
Изучение git в виде интерактивной игры:
https://learngitbranching.js.org/
Преобразование кодировок:
https://2cyr.com/decode/
https://dencode.com/
Различные операции над кодировками:
https://onlinetools.com/utf8/convert-utf8-to-binary
Различная информация по unicode:
https://utf8everywhere.org/
Поиск по репозиториям github:
https://grep.app/
Конфигуратор стиля форматирования кода:
https://zed0.co.uk/clang-format-configurator/
Какие проекты написать новичку:
https://github.com/siliciusQ/Programming-challenges-v4.0
Почему отправлять код в виде фотографии плохо:
https://idownvotedbecau.se/imageofcode
ссылка на канал | ссылка на группу
Когда пишут привет, но не переходят к сути вопроса сразу:
https://nohello.net/
https://neprivet.com/
Когда задают вопрос, подразумевающий другие вопросы, вместо конкретики:
https://nometa.xyz/
Когда спрашивают какие-то очевидные темы, и так хочется послать в google:
https://googlethatforyou.com/
Когда просят решение проблемы Y вместо проблемы X:
https://ru.wikipedia.org/wiki/Проблема_XY_(Ошибка_молотка)
Как правильно задавать вопросы:
http://citforum.ru/howto/smart-questions-ru.shtml
https://www.google.com/search?q=как+задавать+вопросы
MRE (minimal reproducible example):
https://stackoverflow.com/help/minimal-reproducible-example
https://en.wikipedia.org/wiki/Minimal_reproducible_example
Список различных IT групп:
https://t.me/it_chats/865
Справочник по C++:
https://en.cppreference.com/w/
Черновик стандарта C++:
https://eel.is/c++draft/
Квест на знание стандарта C++:
https://cppquiz.org/
Дорожная карта C++:
https://roadmap.sh/cpp
Различная информация по С++:
https://github.com/JoshuaJakowlew/cppfaq
https://gist.github.com/honey-speaks-tech/225e0ce05430a6c2e3d3c68e0e4a35d9
Неявное становится явным:
https://cppinsights.io/
Перевод непонятных Си объявлений на понятный английский язык:
https://cdecl.org/
https://github.com/paul-j-lucas/cdecl
Преобразование msvc/gcc mangled символов в читаемый вид:
https://demangler.com/
Что такое UB в С++:
https://github.com/Nekrolm/ubbook/blob/master/README.md
Советы по стилю написания C++ кода:
https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines
Изучение языка C++:
https://www.learncpp.com/ (оригинал на английском)
https://ravesli.com/uroki-cpp/ (перевод на русский)
https://acode.com.ua/uroki-po-cpp/ (перевод на украинский)
Online компиляторы:
https://www.onlinegdb.com/online_c++_compiler
https://godbolt.org/
Выравнивание, отступы и упаковка членов данных структуры:
https://www.geeksforgeeks.org/structure-member-alignment-padding-and-data-packing/
https://habr.com/ru/articles/142662/
https://learn.microsoft.com/ru-ru/cpp/cpp/alignment-cpp-declarations
Что такое trap representation?
https://ru.stackoverflow.com/a/838699
Unicode таблица символов:
https://design215.com/toolbox/utf8-4byte-characters.php
Изучение системы контроля версий git:
https://git-scm.com/book/ru/v2
Изучение git в виде интерактивной игры:
https://learngitbranching.js.org/
Преобразование кодировок:
https://2cyr.com/decode/
https://dencode.com/
Различные операции над кодировками:
https://onlinetools.com/utf8/convert-utf8-to-binary
Различная информация по unicode:
https://utf8everywhere.org/
Поиск по репозиториям github:
https://grep.app/
Конфигуратор стиля форматирования кода:
https://zed0.co.uk/clang-format-configurator/
Какие проекты написать новичку:
https://github.com/siliciusQ/Programming-challenges-v4.0
Почему отправлять код в виде фотографии плохо:
https://idownvotedbecau.se/imageofcode
ссылка на канал | ссылка на группу
❤2🫡1
image_2023-10-31_19-27-48.png
46.2 KB
ссылка на канал | ссылка на группу
image_2023-10-31_19-27-48.png
165.5 KB
ссылка на канал | ссылка на группу
Dmitry Develop
image_2023-10-31_19-27-48.png
Сегодня весь день разбираюсь с диапазонами и моей реализацией полосы прокрутки.
В решении проблемы я зашёл в тупик, поэтому я решил рассмотреть всю теорию с самого начала.
Этот подход уже принёс свои результаты: был найден участок кода, который будет давать правильный размер ползунка только в диапазоне
Я думал, что
Но оказалось, что пытаться все вычисления подвести к диапазонам даёт не всегда более простой или эффективный код.
Придётся пересмотреть алгоритм работы и / или написать функцию, которая будет нормализовать или приводить число в нужный диапазон.
Также по этому случаю решил немного отрефакторить функцию
Спасибо всем, кто давал мне советы, как можно сделать лучше.
Но я всё равно сделал немного по-своему).
ссылка на канал | ссылка на группу
В решении проблемы я зашёл в тупик, поэтому я решил рассмотреть всю теорию с самого начала.
Этот подход уже принёс свои результаты: был найден участок кода, который будет давать правильный размер ползунка только в диапазоне
[0, N] или [N, 0].Я думал, что
rangeMap сможет решить все практические случаи.Но оказалось, что пытаться все вычисления подвести к диапазонам даёт не всегда более простой или эффективный код.
Придётся пересмотреть алгоритм работы и / или написать функцию, которая будет нормализовать или приводить число в нужный диапазон.
Также по этому случаю решил немного отрефакторить функцию
rangeMap.Спасибо всем, кто давал мне советы, как можно сделать лучше.
Но я всё равно сделал немного по-своему).
ссылка на канал | ссылка на группу
👍1🔥1
Циклические зависимости и зависимость от порядка перечисления библиотек в GCC.
Бывало ли у вас такое, когда вы точно указали все нужные библиотеки, но линковщик всё равно выдаёт ошибку "
Или от изменения порядка перечисления библиотек, ошибка меняется или одна пропадает и появляется другая?
Это происходит из-за того, как работает линковщик gnu и требует стандарт POSIX.
Линковщик ищет определение упоминаемых символов в указанных библиотеках слева направо и всего один раз, забывая о библиотеке после разрешения символов.
Когда библиотека
Думаю, не стоит дальше объяснять, сколько будет комбинаций с бóльшим количеством библиотек и более сложной структурой зависимостей.
Это плохой и неудобный подход.
Чтобы решить эту проблему, используйте одну из конструкций, которые укажут линковщику искать определение символа рекурсивно по списку до тех пор, пока все упоминаемые символы не будут разрешены:
Как использовать эти ключи в CMake:
https://stackoverflow.com/a/73641444
ссылка на канал | ссылка на группу
Бывало ли у вас такое, когда вы точно указали все нужные библиотеки, но линковщик всё равно выдаёт ошибку "
undefined reference to..."?Или от изменения порядка перечисления библиотек, ошибка меняется или одна пропадает и появляется другая?
Это происходит из-за того, как работает линковщик gnu и требует стандарт POSIX.
Линковщик ищет определение упоминаемых символов в указанных библиотеках слева направо и всего один раз, забывая о библиотеке после разрешения символов.
Когда библиотека
first зависит от second, a second зависит от first, можно при помощи комбинаторики и сочетания перебрать все их комбинации: 2! = 2.-lfirst -lsecond -lsecond -lfirstДумаю, не стоит дальше объяснять, сколько будет комбинаций с бóльшим количеством библиотек и более сложной структурой зависимостей.
Это плохой и неудобный подход.
Чтобы решить эту проблему, используйте одну из конструкций, которые укажут линковщику искать определение символа рекурсивно по списку до тех пор, пока все упоминаемые символы не будут разрешены:
-Wl,--start-group -lfirst -lsecond -Wl,--end-group
-Wl,-( -lfirst -lsecond -Wl,-)Как использовать эти ключи в CMake:
https://stackoverflow.com/a/73641444
ссылка на канал | ссылка на группу
👍3
Dmitry Develop
trailingWhitespace.png
Бывало у вас такое, что, после редактирования, рефакторинга или копирования кода, у вас появлялись раздражающие пробелы или табуляция в конце строки (
Кто страдает перфекционизмом или просто хочет поддерживать чистоту в коде, при помощи замены и регулярного выражения
В
Или включить выполнение этой команды при сохранении файла в настройках по названию
ссылка на канал | ссылка на группу
trailing whitespace)?Кто страдает перфекционизмом или просто хочет поддерживать чистоту в коде, при помощи замены и регулярного выражения
[ \t]+$ можно решить эту проблему.В
visual studio code (vscode) также можно нажать сочетание клавиш ctrl + shift + P, написать и выполнить команду "Trim Trailing Whitespace".Или включить выполнение этой команды при сохранении файла в настройках по названию
Files: Trim Trailing Whitespace.ссылка на канал | ссылка на группу
👍1
image_2023-11-10_09-53-28.png
72.2 KB
ссылка на канал | ссылка на группу
Dmitry Develop
image_2023-11-10_09-53-28.png
Увеличил глубину и частоту дискретизации передачи сигнала с микроконтроллера на ПК с 8 до 16 bit и с 500 до 5000 Hz.
Было как-то неприятно увеличивать количество передаваемых байт с 4 до 8, но производительности микроконтроллера, ПК и моего кода хватило.
И я до последнего был уверен, что всё сломается, появится трудноуловимый баг или вообще ошибка сегментации, когда я перепишу код обработки данных на новый протокол общения.
Ну а ещё я постепенно чиню полосу прокрутки.
Сейчас уже правильно вычисляется размер ползунка, ничего не ломается, если указать диапазон
ссылка на канал | ссылка на группу
Было как-то неприятно увеличивать количество передаваемых байт с 4 до 8, но производительности микроконтроллера, ПК и моего кода хватило.
И я до последнего был уверен, что всё сломается, появится трудноуловимый баг или вообще ошибка сегментации, когда я перепишу код обработки данных на новый протокол общения.
Ну а ещё я постепенно чиню полосу прокрутки.
Сейчас уже правильно вычисляется размер ползунка, ничего не ломается, если указать диапазон
[0, -N], и правильно вычисляется даже отрицательный отступ.ссылка на канал | ссылка на группу