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

Разработка, программирование; c++, gcc, g++, gnu, mingw; winapi, windows; vscode.
Download Telegram
Вот так сейчас довольно просто в виде обёртки над stringCopy реализован в прошлом stringShift (Move), который сдвигает символы в строке.

Код моей библиотеки это наглядный пример принципа DRY (Don`t Repeat Yourself).

Весь функционал моей библиотеки разбит на много маленьких и самостоятельных функций (модулей).

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

ссылка на канал | ссылка на группу
Пример реализации функции замены подстроки в строке.

ссылка на канал | ссылка на группу
Делаю тестирование каждой функции и задумываюсь, какая семантика должна быть у функции в зависимости от аргументов.

Некоторые рассматриваемые вопросы есть в комментариях в коде.

Я объединил реализацию stringShift и stringCopy только потому, что у них было очень много общего кода.

stringShift тоже копирует строки, как stringCopy.
Отличие между ними заключается в том, что первая умеет копировать перекрывающиеся строки (memmove из C).
Хотя использовался этот функционал только для сдвига символов в строке.

ссылка на канал | ссылка на группу
3
Как же мне нравится заниматься инфографикой).

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

ссылка на канал | ссылка на группу
This media is not supported in your browser
VIEW IN TELEGRAM
Принцип работы копирования.

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

Параметров как-то многовато, но если спрятать повторяющиеся (string и capacity) в структуру String и вместо *status использовать return, станет получше.

Раньше у меня status был thread_local, и его не надо было явно передавать, чтобы гарантировать уникальную копию состояния для каждого потока.
Но это требует поддержки со стороны компилятора, а мне хочется попробовать сделать без неё.

stringCopy и stringShift я решил оставить самостоятельными функциями, так как у них немного разная логика.
stringShift в работе использует и может полагаться на offset, когда stringShift не может полагаться на разницу адресов (у меня выдавало разницу в миллиард).

В будущем напишу конвертер кодировок utf-8 <-> utf-16 и форматирование чисел).
1) stringToUtf16
2) stringFromUtf16
(Нужны только для OS windows)

3) stringFormatInt или через 3 параметр в stringFromInt

ссылка на канал | ссылка на группу
👍1
Тестирую сейчас каждую функцию из библиотеки.
На данный момент всё работает как и было задумано.

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

Нужно пересмотреть способ работы с библиотекой и написать итераторы с функторами.
Тогда можно будет работать со строкой, как массивом символов, а не байтов.
Но и оставить возможность получить информацию по каждому символу: номер, количество байт, сам символ.

ссылка на канал | ссылка на группу
Это концепт stringIterateChar

Так будет гораздо проще работать со строкой, как с массивом символов.

Написать конвертер из строки в массив кодов или байтов теперь будет проще простого.

ссылка на канал | ссылка на группу
Media is too big
VIEW IN TELEGRAM
Вот таким образом можно итерировать строку посимвольно.

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

ссылка на канал | ссылка на группу
Посмотрите предыдущий пост ещё раз, я его полностью переделал.

ссылка на канал | ссылка на группу
Я пока ещё только учусь, чтобы официально стать полноценным junior разработчиком, но мне недавно предложили одно дело...

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

Пожелайте мне удачи и успехов с моим первым серьёзным проектом).

ссылка на канал | ссылка на группу
👍7
1 часть
2 часть

vs code это редактор кода с поддержкой плагинов.
Для работы с C++ нужно установить C/C++ дополнение, отдельно скачать и установить компилятор, потом создать конфиги в папке проекта.

Я хотел поэкспериментировать с настройкой конфигов, поэтому создал пустой проект без них с единственным файлом main.cpp.

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

Оказалось, что отладчик неявно ищет путь к известным компиляторам в переменных среды (PATH).
У меня в PATH как раз был указан путь к моему компилятору gcc.
Я эту строчку удалил, чтобы узнать, что произойдёт дальше.

После этого отладчик сообщал об ошибке
Unable to start debugging. The value of miDebuggerPath is invalid

ссылка на канал | ссылка на группу
1 часть
2 часть

Хорошо, решение этой проблемы довольно простое.
Я создал launch.json и написал минимально необходимый конфиг, а главное
"miDebuggerPath": "D:/gcc/bin/gdb.exe".

Теперь при отладке ошибка стала другой:
ERROR: Unable to start debugging. Unexpected GDB output from command "-exec-run". During startup program exited with code 0xc0000135.

С такой ошибкой я ещё ни разу не сталкивался, она сбила меня с толку.
Спустя некоторое время поисков, я не нашёл решения для моей ошибки.

Тогда я решил поискать похожие проблемы не по тексту ошибки, а коду 0xc0000135.
И о чудо, на github уже кто-то сталкивался с таким кодом ошибки.
Оказалось, что отладчик просто не может найти DLL необходимые программе С++ библиотеки, которые обычно лежат в папке с компилятором или в c:/windows/system32.

Изменил current working directory "cwd": "${workspaceFolder}" на "cwd": "D:/gcc/bin/", у меня всё заработало.
Изменять текущую рабочую папку программы не самая лучшая идея, это костыль, из-за этого могут происходить самые разные и неочевидные проблемы.
Так и оказалось, когда я попробовал создать файл test.txt, он создался в папке с компилятором, а не рядом с main.exe.

Есть правильных 2 решения:
1) в настройках windows добавить в PATH путь до компилятора.
2) временно изменить PATH через конфиг.

Так как я сторонник portable программ, которые работают без установки и изменения реестра, я выбрал для себя 2 решение.
"environment":
[
{
"name": "PATH",
"value": "%PATH%;D:/gcc/bin/"
}
]

ссылка на канал | ссылка на группу
🔥1
В последнее время с настроением у меня совсем беда.
Нет сил и желания заниматься даже программированием.
Наверное, это называется выгорание.
Надеюсь, arduino сможет вернуть мне настрой снова творить).

Заказал с Китая:
arduino nano v3 type-c
макетную плату
соединительные провода
20 RGB светодиодов
100 резисторов на 220 Ом
5 потенциометров на 10 кОм с ручкой

ссылка на канал | ссылка на группу
👍2
Хотел нарисовать сетку, а в итоге получился такой прикольный холст с точками).

ссылка на канал | ссылка на группу
А вот уже правильная сетка с размером клетки 20px.

Код этого проекта после маленького рефакторинга выложу на github.

ссылка на канал | ссылка на группу
Теперь можно рисовать графики функций или визуализировать какой-то сигнал.

ссылка на канал | ссылка на группу
🔥2
За такой говнокод в обучающих видео надо по рукам бить.

Почему автор не создал массив байтов, где каждый бит отвечает за сегмент индикатора, а индексом которого была бы желаемая цифра минус 1?

Не походили массивы?
А почему вы вообще пишите программу на Си/С++, не зная основных языковых конструкций?

ссылка на канал | ссылка на группу
🔥1
Не берите технику DEXP).

А вообще мне отдали его на запчасти, матрица и сенсор живые.
Вдруг через arduino смогу подружиться с протоколом матрицы или найду скалер).

ссылка на канал | ссылка на группу
👍1
Media is too big
VIEW IN TELEGRAM
Не знаю в чём причина, но при масштабировании графика синуса, упорядоченные точки превращаются в хаос, а потом снова упорядочиваются).

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