Dmitry Develop
176 subscribers
77 photos
35 videos
88 files
205 links
Этот канал в основном будет интересен новичкам в программировании и людям немного поопытнее.
Здесь я буду делиться своими новостями и достижениями в программировании.

Разработка, программирование; c++, gcc, g++, gnu, mingw; winapi, windows; vscode.
Download Telegram
Это реализация библиотеки chrono в msvc, а именно std::chrono::high_resolution_clock::now().

Я недавно сделал обёртку над QPC/QPF и столкнулся с ошибкой переполнения типа int64_t, спустя вечер реализовал алгоритм, который практически никогда не столкнётся с переполнением.

Что я недавно сделал, разработчики microsoft уже давно придумали и реализовали даже с комментариями в коде).

ссылка на канал | ссылка на группу
Если кому-то действительно понадобится моя реализация функции timeNow, таймера высокого разрешения (получение времени с точностью до 100 наносекунд), я выложу код на github, а пока и картинки хватит).

frequency и tick хотелось бы сделать const, но я не знаю, как инициализировать const переменную non-const значением из функции без лямбды или создания дополнительных функций.

ссылка на канал | ссылка на группу
Как только все GetTickCount я заменил на мой timeNow, всё расчёты стали гораздо большего разрешения, даже FPS стал стабильным и точным.

ссылка на канал | ссылка на группу
Я сейчас задумываюсь о том, какие улучшения сделать в модуле Input (он хранит и обрабатывает ввод и события с клавиатуры и мыши).

Если вы уже разрабатывали игру или программу или только задумывались об этом, какие бы данные вам могли понадобиться?

Например, чтобы реализовать взаимодействие с графическим пользовательским интерфейсом (GUI), нужно знать координаты курсора (cursorPosition).

Чтобы реализовать перемещение элементов интерфейса курсором, например, виртуальных окошек, нужно знать на сколько пикселей он сдвинулся относительно значения в предыдущем кадре — дельту курсора (cursorMove).

Но для перемещения камеры cursorMove не подойдёт.
Это неточный способ, на него действует акселерация windows, а так же область движения будет ограничена размером экрана или окна.
Для более точного движения камеры без ограничений я использую raw input, это сырые данные без обработки напрямую с мыши, клавиатуры и не только.
Назвал эту переменную mouseMove.

ссылка на канал | ссылка на группу
1
This media is not supported in your browser
VIEW IN TELEGRAM
Ударил по столу и появились такие помехи на мониторе.
Прикольный эффект, я бы хотел повторить его, используя openGL.

ссылка на канал | ссылка на группу
🔥1
Какой компилятор C++ вы предпочитаете?
Anonymous Poll
57%
gcc
24%
msvc
33%
clang
Какой смысл во флаге -Wpedantic (-pedantic), если компилятор всё равно компилирует код с нарушениями стандарта C++?

В данном случае это VLA (variable length array — массив переменной длины на стеке).

Без флага -Werror все эти предупреждения не сильно полезны.

ссылка на канал | ссылка на группу
Часто ли вы сталкивались с проблемами вывода кириллицы в консоль?

Что думаете насчёт написания статьи, которая ответит на вопросы: почему так происходит, как это можно решить?
Anonymous Poll
62%
Нужна
38%
Не нужна
Недавно я включил отображение всех предупреждений, строгое соответствие стандарту C++ без расширений gnu и рассмотрение предупреждений, как ошибок.
(-Wall -Wextra -Wpedantic -Werror -std=c++17)

У MinGW на windows я столкнулся с одной неудобной особенностью.
Во время runtime отладчик gdb не может остановиться на только что созданной точке останова.
С некоторыми ухищрениями это можно сделать, но в некоторых ситуациях это слишком неудобно или вовсе невозможно.

Поэтому я пользуюсь конструкцией bool wait { }; или if(condition) { bool wait { }; } и заранее ставлю точку останова, чтобы отладчик зацепился за эту переменную и остановился в нужном мне месте и в нужный момент.

Но из-за -Wunused-variable и -Werror я не смогу скомпилировать код с неиспользуемыми переменными.

На помощь пришёл атрибут [[maybe_unused]] (C++17 и старше).
(аналог в виде расширения gcc: __attribute__((unused)), [[gnu::unused]]).

ссылка на канал | ссылка на группу
Dmitry Develop
Недавно я включил отображение всех предупреждений, строгое соответствие стандарту C++ без расширений gnu и рассмотрение предупреждений, как ошибок. (-Wall -Wextra -Wpedantic -Werror -std=c++17) У MinGW на windows я столкнулся с одной неудобной особенностью.…
Другие способы решения этой проблемы, которые лично мне не понравились:
* Указать -Wno-unused-variable, что отключит эти очень полезные предупреждения.

* Использовать директиву #pragma
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-variable"
// warned code
#pragma GCC diagnostic pop

* Добавить префикс "(void)" к переменной
bool unused { };
(void)unused; // <--

ссылка на канал | ссылка на группу
Media is too big
VIEW IN TELEGRAM
Когда переписываешь проект с нуля, всё становится гораздо легче и быстрее.

За 5 минут накидал интерфейс, он уже даже как-то реагирует на действия.
Мне нравится.

ссылка на канал | ссылка на группу
Иногда, мне приходилось и так программировать).
Ещё бы мышку подключить, было бы вообще шикарно.

ссылка на канал | ссылка на группу
👍1🔥1
int functionA(int a, int b)
{
return a + b;
}

int functionB(int a, int b)
{
return a * b;
}

volatile int COUNT { 100 }; // переменная известная во время runtime

int(**arrayFunctions)(int, int) = new (int(*[COUNT])(int, int));
arrayFunctions[0] = functionA;
arrayFunctions[1] = functionB;

int result { arrayFunctions[0]() + arrayFunctions[1]() };
delete[] arrayFunctions;


Ничего себе синтаксис динамического массива указателей на функции.

По началу думал, что там указатель на указатель (**), и мне было не понятно, зачем это нужно.
Потом вспомнил, что одна звёздочка является частью синтаксиса объявления указателя на функцию и всё стало понятно.

Весь код приведён только для примера использования, главное тут синтаксис объявления и инициализации arrayFunctions.

ссылка на канал | ссылка на группу
Я программирую в vs code уже более 2-х лет, мне очень нравится этот редактор с плагинами, но кое-чего мне не хватает...

Мне очень часто приходится прыгать туда-сюда по огромному файлу исходного кода.

Делать это при помощи полосы прокрутки или предпросмотра файла неудобно.

Делать это через поиск тоже неудобно, особенно когда у тебя более 100 переменных в проекте, которые могут иметь однокоренные слова или похожие части в названии.

Делать это при помощи точки останова было получше, но всё же тоже неудобно, во время отладки нужно либо убирать её, либо отключать.

Я поймал себя на мысли, что пора что-то менять.
Немного поискал и открыл для себя очень удобное расширение Bookmarks.
Странно, почему этого функционала нет из коробки, ведь для программистов это очень полезная и удобная функция.

ссылка на канал | ссылка на группу
This media is not supported in your browser
VIEW IN TELEGRAM
Что ж, с переделкой интерфейса я почти закончил.
Новый внешний вид мне нравится гораздо больше.
Immediate mode GUI оказалось гораздо проще реализовывать и кастомизировать.

ссылка на канал | ссылка на группу
👍2
Media is too big
VIEW IN TELEGRAM
Ох, не думал я, что работать с микроконтроллером, аналоговым сигналом с последующей его оцифровкой и UART будет так непросто.

В начале жизненного цикла разработки у меня сигнал приходил очень нестабильно: то байт куда-то потеряется, то биты сдвигаются.
В этом были виноваты стандарт передачи данных, а именно его отсутствие, и плохая скорость передачи данных для частоты моего микроконтроллера, которая давала ~5% потерь.
Когда два данных недочёта были исправлены, у меня всё стало идеально.

Однако во время тестирования программы заказчиком и комиссией, у них сигнал был с довольно сильными помехами, что им, конечно, не понравилось, хотя программу они оценили.

В данном видео вы увидите действие фильтра "бегущее среднее", а потом я планирую применить ещё и медианный фильтр.

signalFilterUsing - применяется ли фильтр к сигналу.
signalFilterWidth - ширина выборки для усреднения.

(Кнопка с анимацией загрузки "..." — это наработка для будущего обновления)

ссылка на канал | ссылка на группу
Попался мне недавно человек, у которого с vs code были одни проблемы.

По этому случаю решил попробовать с нуля создать шаблон проекта, в котором только пути до компилятора поправить и можно будет компилировать и запускать отладку.
Ориентировался на использование mingw и windows.

Старайтесь не использовать кириллические и прочие unicode символы а также пробелы в пути, иначе можете убить не один час на решение магических проблем).

Чтобы скопилировать проект:
1) ctrl + shift + B
2) для отладки выбираем "build debug"
для распространения выбираем "build release"

Чтобы запустить проект:
1) с отладкой: F5
без отладки : ctrl + F5

Скачать zip архив проекта
(1 обновление 01.10.2023 22:51)

ссылка на канал | ссылка на группу
projectTemplate.zip
5 KB
ссылка на канал | ссылка на группу
Готовлю материал для сообщения на тему "как компилировать и подключать статические и динамические библиотеки в g++".

ссылка на канал | ссылка на группу
🔥1
arduinoSuccess.png
652 KB
Это так приятно помочь кому-то, когда уже сам прошёл через огонь и воду и догадываешься, в чём проблема.
Чисто на скилле, на опыте).

Я вообще с arduino совсем недавно начал работать, но нас объединяет C++, так что не всё так плохо).

ссылка на канал | ссылка на группу