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

Разработка, программирование; c++, gcc, g++, gnu, mingw; winapi, windows; vscode.
Download Telegram
Текст немного позже напишу, а фото уже сейчас выложу.
Знающие, думаю, уже понимают, о чём будет текст).

А нет, я просто забил).

ссылка на канал | ссылка на группу
Media is too big
VIEW IN TELEGRAM
Иногда баги бывают забавными).
При изменении масштаба графика, он почему-то начинает шагать).

ссылка на канал | ссылка на группу
Media is too big
VIEW IN TELEGRAM
Даже не знаю что сказать.
А я знаю что сказать, я отдыхать ***.
Столько времени на разработку и отладку ушло, а потом ещё и на корректировки от заказчика, а ещё я более 14 дней просто ничего не делал, думал всё будет просто.
Итого, времени на хобби и досуг не оставалось.

Вот такой результат получился.
По-моему, для человека, который почти в первый раз с нуля такое разрабатывает это очень даже неплохой результат.

Да, есть косяки и недоработки, это это только демонстрационная программа, дальше будет только жёстче и интереснее).

И да, моя первая программа за долгое время на 1000 строк кода.
Ну, если только не считать мой игровой движок в прошлом, там 5000, думаю, наберётся.

ссылка на канал | ссылка на группу
Хотел оптимизировать и облегчить перевод тактов в количество наносекунд при помощи QueryPerformanceCounter и QueryPerformanceFrequency.

Попробовал два способа перевести такты в секунды.

В моей системе прекрасно работают оба способа, но на другом компьютере при одинаковом количестве тактов из-за округления разница между двумя способами получилась в целых 200'000 наносекунд.

Предполагаю, чем больше количество тактов, чем выше будет разница.

ссылка на канал | ссылка на группу
Media is too big
VIEW IN TELEGRAM
Как же легко говнокодить, а потом тяжело переделывать по-нормальному).

В моей системе GUI при реализации slider, как отдельного компонента, я заметил несколько проблем.
У меня пока не реализовано такое понятие, как родительский и дочерний элемент.
Поэтому сразу не понял, почему slider не реагирует на курсор.

ссылка на канал | ссылка на группу
Media is too big
VIEW IN TELEGRAM
Ох, вот зачем я только решил рисовать графику при помощи GDI, это оказалось таким хардкором.
Благо я наконец-то нашёл!!
Нашёл, как рисовать внутри области, чтобы всё остальное, что выходит за её границы, отсекалось.

В opengl это решается за секунду (scissors), а вот решение для GDI я искал более недели.

В HTML это стиль overflow: hidden или scroll.

ссылка на канал | ссылка на группу
👍1
Какие ещё нужны элементы для графического интерфейса?

Думаю, пора переделывать GUI на компонентную систему + сделать древовидную структуру интерфейса.

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

Всё ещё экспериментирую с QueryPerformanceCounter, разбираюсь с частотой и периодом, думаю, какие единицы измерения выбирать основными и как переводить такты во время и наоборот.

ссылка на канал | ссылка на группу
👍1
Вроде, с обёрткой над QueryPerformanceCounter разобрался.
Время получаю в наносекундах.

Замерил время, сколько по факту будет работать Sleep(1500 ms) (разрешение системного таймера увеличено с помощью timeBeginPeriod(1 ms)).
Получились очень точные 1500 ms.

Жаль, такой способ с timeBeginPeriod работает по-разному на разных версиях операционной системы windows, особенно на серверной.

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

Где-то вылез за границы массива, где-то увеличил размер динамической памяти вместо (size * sizeof(Block)) на просто (size)...

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

ссылка на канал | ссылка на группу
Реверс-инженерим полосу прокрутки в windows).

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

ссылка на канал | ссылка на группу
Мало ли кому понадобятся названия частей, формула, размеры и расчёты полосы прокрутки для графического интерфейса).

ссылка на канал | ссылка на группу
А это способ определить, используя события winAPI, какой последовательный COM порт был подключён или отключен.

WM_DEVICECHANGE
DBT_DEVICEARRIVAL
DBT_DEVICEREMOVECOMPLETE
DEV_BROADCAST_PORT_A

ссылка на канал | ссылка на группу
Устаревшая реализация (deprecated implementation).
Новая реализация с исправлением ошибок
...

Функция intMap нужна, чтобы сдвинуть, сжать или расширить числовой диапазон.

Например, когда число приходит в диапазоне от -128 до 127 (int8_t) и его нужно преобразовать в диапазон от 0 до 599 (высота окна в пикселях).

Нужно просто написать:
int64_t value { 0 };
intMap(&value, -128, 127, 0, 599);

ссылка на канал | ссылка на группу
Media is too big
VIEW IN TELEGRAM
Проверка работы моей реализации слайдера.

Можно двигать список как ползунком, так и колёсиком мыши.
В зависимости от количества кнопок в списке меняется размер ползунка.
Если кнопки полностью помещаются в высоту списка, слайдер пропадает.
Панель чёрного цвета это область, где будет рисоваться график.

ссылка на канал | ссылка на группу
This media is not supported in your browser
VIEW IN TELEGRAM
Не знаю, что там лежит за левой границей массива, но это очень похоже на двоичную арифметику).

ссылка на канал | ссылка на группу
Когда нет никаких средств профилирования, на помощь приходит таймер высокого разрешения.
На моей системе у него точность 100 наносекунд.

ссылка на канал | ссылка на группу
Этот код составляет строку для отладочного экрана.
Выглядит массивно и страшно).

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

А потом переписать, используя свои строковые функции и замерить снова.
Благодаря проекту, я запросто сделаю динамические строки.

ссылка на канал | ссылка на группу
Решил попробовать компилятор cl (msvc).

Постепенно узнаю, какие есть ключи у компилятора и у линкера.
Нашёл способ, как сделать для оконного приложения точку входа main, а не winmain.

ссылка на канал | ссылка на группу
Этот код и ключи компилятора позволяют использовать 1 GB стека).

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