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

Разработка, программирование; c++, gcc, g++, gnu, mingw; winapi, windows; vscode.
Download Telegram
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++, так что не всё так плохо).

ссылка на канал | ссылка на группу
Как компилировать и подключать библиотеки в GCC?

Библиотеки это набор скомпилированного кода, который может переиспользоваться в разных программах.
Существует два вида библиотек: статическая (static) и динамическая (dynamic).
В операционной системе linux они имеют расширение соответственно .a и .so и формат ELF, а в windows .lib и .dll и формат COFF.

> Как скомпилировать динамическую библиотеку?
Допустим, наша библиотека состоит из двух исходных файлов: libraryPart1.cpp и libraryPart2.cpp и будет называться libraryName.
Тогда команда сборки для компиляции будет такой:
g++ -shared -fPIC -o liblibraryName.so libraryPart1.cpp libraryPart2.cpp

Тут важно три момента:
1) -shared: произвести динамический объект, который может быть связан с другими объектами для создания исполняемого файла.
2) -fPIC: генерировать независимый от позиции код, работа которого не будет зависеть от адреса расположения кода.
3) -o liblibraryName.so: префикс lib и расширение .so обязательны, чтобы связывать библиотеку с программой без лишних трудностей.

> Как скомпилировать статическую библиотеку?
Аналогично динамической библиотеке, у нас будет тот же набор исходных файлов и название библиотеки.
Однако, сначала нужно скомпилировать исходный код в объектный файл, а только потом создать архив (набор объектных файлов), то есть нашу библиотеку:
g++ -c -o library.o libraryPart1.cpp libraryPart2.cpp
ar rcs liblibraryName.a library.o

Объяснение параметров:
1) -c: скомпилировать исходный код в объектный файл, но не связывать.
2) r: вставить объектный файл в архив с заменой
2) c: создать новый архив
2) s: добавить новый индекс или обновить существующий

> Как подключить библиотеку к программе?
Для начала нужно указать где линковщик должен искать нашу библиотеку, если не найдёт её по стандартным путям: -LlibraryPath, потом указать какую библиотеку(и) подключить: -llibraryName.
Итоговая команда сборки:
g++ -o main.exe main.cpp -LlibraryPath -llibraryName

Учтите, порядок перечисления библиотек и объектных файлов в аргументах командной строки важен.
Линковщик ищет и обрабатывает библиотеки и объектные файлы в порядке их перечисления.
Если объявленный символ идёт раньше библиотеки или объектного файла, где он определён, он может быть не загружен и линковщик сообщит вам о "undefined reference to ...".
Циклические зависимости и зависимость от порядка перечисления библиотек в GCC

> Что будет, если у меня статическая и динамическая библиотеки будут называться одинаково?
Если линковщик находит и статическую, и динамическую библиотеку, приоритет отдаётся динамической, однако параметром -static этот приоритет меняется на статическую.

> Как мне выбрать конкретный вид библиотеки?
Для начала посмотрим на описание параметра -l: ищет библиотеку, добавляя к названию префикс lib и расширение .so или .a.
Следовательно, когда вы указываете -llibraryName, линкер ищет сначала liblibraryName.so, потом liblibraryName.a.

Чтобы указать конкретное название и даже расширение библиотеки, добавьте символ двоеточие между параметром и названием библиотеки.
Важно также указывать расширение библиотеки.
-l:anyLibraryName.a

ссылка на канал | ссылка на группу
🔥3
telegramUnicode.png
74.6 KB
ссылка на канал | ссылка на группу
Dmitry Develop
telegramUnicode.png
Надо ли немного рассказать о unicode и его стандартах кодирования?
Anonymous Poll
56%
Да
11%
Нет
33%
Просто посмотреть ответы
Во время тестирования полосы прокрутки я столкнулся со множеством проблем, связанных с преобразованием числовых конечных промежутков.

В основном, виновата моя реализация 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
Наконец-то получилось написать функцию intMap, которая будет работать как с обычным промежутком ([0; 1023]), так и обратным ([1023; 0]).
Сейчас буду отлаживать код, а то в некоторых случаях в середине промежутка вместо 0 выдаёт -1.

ссылка на канал | ссылка на группу
🫡1
Я настолько часто на бумаге делаю всякие расчёты, прикидываю макеты, придумываю алгоритмы, что у меня уже целая папка исписанных листов А4.

Бумагу использовать в таких количествах жалко, ctrl + C и ctrl + Z там нет, стирать значит размазать и так далее — много неудобств.

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

ссылка на канал | ссылка на группу
🔥2
Спустя несколько дней экспериментов в теории и на практике, нескольких прочитанных сайтов по математике и одного дня полноценного отдыха, я наконец-то смог найти закономерность, понять причину ошибок и исправить её.
Теперь всё работает идеально.

Эта функция особенно понравится тем, кто занимается arduino (вместо встроенной функции map), но и разработчикам под ПК она тоже будет полезна.

Главное понять, что много вещей можно представить через промежутки (диапазоны) и с ними можно делать разные операции: инвертировать, сжимать и расширять, сдвигать.

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

Если вам нужна версия этой функции, которая будет работать не только с int64_t, а с int или float / double, предлагаю вам просто заменить int64_t на нужный вам тип данных или сделать её шаблонной.
Я просто использую только целочисленные типы данных для вычислений, не люблю float / double.

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

Скачать реализацию функции rangeMap
Устаревшая реализация (deprecated implementation)

ссылка на канал | ссылка на группу
👍2🔥1
rangeMap.cpp
2.3 KB
ссылка на канал | ссылка на группу
Рубрика "полезные флаги для GCC (mingw)".

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

Сегодня вопрос в чате напомнил мне о ситуации, когда случайно или по незнанию в функцию printf передаётся аргумент, который не соответствует квалификатору или наоборот.
Например, функция ожидает signed int, но получает unsigned int.

-Wformat
предупреждает о несоответствии типов аргументов и квалификаторов

-Wformat-signedness
если указан предыдущий флаг, предупреждает о несоответствии знаковости квалификатора и аргумента.

Эти флаги доступны с версии GCC 5.0 и выше.

ссылка на канал | ссылка на группу
👍21
Использование define'ов, конечно, осуждаемо и часто сомнительно, но в условиях, когда работы много, а времени мало, выбирать не приходится.
Тем более, разве, define'ы не помогают избавиться от повторения кода?
Получилось сделать довольно быстро и удобно.

Примерно таким образом я вижу свою будущую переработанную строковую библиотеку для работы с кодировками utf-8 и utf-16: просто берёшь и получаешь желаемый результат.

ссылка на канал | ссылка на группу
👍1
При запуске отладки по нажатию на F5 иногда в консоли появляется ошибка и отладка не запускается.
Бывает, даже повторяется несколько раз подряд.
Обновление vscode и gcc до последних версий не помогло.
Намеренно повторить это не получается.

Кто сталкивался с таким поведением отладки в vscode с расширением C++ от microsoft?

ссылка на канал | ссылка на группу
IDECompilers.png
521.7 KB
ссылка на канал | ссылка на группу