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

Разработка, программирование; c++, gcc, g++, gnu, mingw; winapi, windows; vscode.
Download Telegram
Что ж, предыдущее случайное недоразумение я переписал:
https://t.me/a248640develop/155

ссылка на канал | ссылка на группу
Dmitry Develop
projectHierarchy.png
Переделываю с нуля шаблон проекта на C++ для vs code.
Дело дошло до настроек внешнего оформления и создания иерархии проекта.

Хочется в шаблоне проекта указать ключи компилятора для подключения какой-нибудь самописной или сторонней библиотеки.

Вопрос в том, какую иерархию проекта сделать?
Сделать папку library и туда класть скомпилированные библиотеки, но куда класть header файлы?
Не хотелось бы перемешивать файлы проекта с файлами библиотеки.

Может, разбить проект как бы контейнеры, где у каждого контейнера есть свои исходные и заголовочные файлы?
project
| main
| | source
| | | *.cpp
| | include
| | | *.hpp
| library1
| | source
| | | *.cpp
| | include
| | | *.hpp
| library2
| | source
| | | *.cpp
| | include
| | | *.hpp

ссылка на канал | ссылка на группу
Dmitry Develop
IMG_20231213_213456.jpg
Как же мне нравится качество китайских товаров.

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

Первым делом я подумал, что в поломке гирлянды виноват сетевой фильтр, который я недавно паял.
Разобрал коробочку, от туда продолжает идти чёрный дым, пахнет чем-то горелым.
Четверть площади платы покрылась копотью.
Я даже и не заметил сразу, что отгорели два провода сетевой вилки.

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

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

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

ссылка на канал | ссылка на группу
Dmitry Develop
image_2023-12-14_15-40-50.png
Можно было сделать и лучше; с параметрами, мне кажется, немного беда.
Зато у меня получилось хорошее именование функций, мне нравится что всё сделано по общему шаблону.

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

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

Просто я немного изменил иерархию проекта и решил заодно ещё и команду сборки переписать.

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

И это не самый страшный случай.
Хуже всего было только тогда, когда я свой старый игровой движок, код которого был написал под компилятор msvc несколько лет назад, попытался скомпилировать при помощи последнего g++.
Было очень много ошибок и предупреждений, и даже спустя час правок файлов по всему проекту, мне так и не удалось его скомпилировать.

ссылка на канал | ссылка на группу
Dmitry Develop
image_2023-12-16_02-13-50.png
Что делать, если во время отладки в vs code вместо содержимого STL контейнера видна его внутренняя реализация?

На фото выше в порядке сверху вниз: сам код, вид std::vector в отладчике до и после изменений.

Надо просто в launch.json добавить "setupCommands", чтобы перед запуском отладки передать в gdb один ключ:
// launch.json
{
"version": "0.2.0",
"configurations":
[
{
...

"setupCommands":
[
{
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],

...
}
]
}


Вообще, если разбираться подробнее как это работает, всё довольно сложно.
Похоже, перед представлением данных, gdb или адаптер использует скрипты на python.

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

Благодаря этому я уже сейчас знаю или умею то, что другие узнают или научатся только в будущем.

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

Поэтому я хочу предложить свою помощь в вопросах, связанных с компилятором mingw (gcc), редактором кода vs code, написания лабораторных работ, программирования на C++, решения проблем с кодировками и другими распространёнными проблемами.

Оказывать кому-то помощь делом или советом не только интересно, но помогает мне набираться опыта и даже немного подзаработать).

Я свой уровень С++ оцениваю где-то между junior и middle: у меня довольно выборочные знания и умения: где-то поверхностные, где-то углублённые.
Поэтому каждый вопрос разбираю индивидуально и помогу, чем смогу.

Буду рад за свою помощь получить вознаграждение.
Оплату принимаю на российскую карту или в криптовалюте.

ссылка на канал | ссылка на группу
🤡5
В конце каждого сообщения я добавляю две ссылки: одна на текущее сообщение в канале, другая на группу.

Зачем?
Согласно статистике, все репосты были сделаны анонимно.
То есть без ссылки на канал, откуда оно было переслано, и соответственно, без кнопки комментирования.
Может, кто-то в избранное себе сохранил на всякий случай или с кем-то поделился, но без ссылки на мой канал.
А это немного, но всё же уменьшает количество просмотров потенциально заинтересованных людей.

Ещё одна причина:
Я довольно часто сразу или через несколько часов делаю правки или дополняю текст поста.
Если переслать пост не в виде ссылке, сохранится его копия на данный момент.
Актуальная же версия доступна только по ссылке.

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

Подскажите, какие бы сделать вид блока и названия для ссылок?
"канал | группа",
"оригинал | обсудить",
"Dmitry Develop | обсудить",
"ссылка на сообщение | ссылка на обсуждение", ...

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

ссылка на канал | ссылка на группу
Dmitry Develop
image_2023-12-18_01-46-05.png
Понимание, каким образом хранятся массивы в памяти и как делать одномерную адресацию многомерного массива и наоборот, позволяет некоторые задачи, данные в которых хранятся в виде одномерного массива, представлять, как многомерный массив.

Посмотрите, как выглядел код до и после изменений: это огромная разница.
Эту символьную таблицу, которая представлена одномерным массивом char с null-терминатором в конце, я представил как массив 3 на 3 ячейки и при помощи цикла сделал её заполнение.

Вывод программы (числа для примера только):
| sorted | shuffled | unsorted
bubble | 1999990 ms | 4999993 ms | 7999996 ms
shaker | 2999991 ms | 5999994 ms | 8999997 ms
selection | 3999992 ms | 6999995 ms | 9999998 ms

Кому не особо понятно, почитайте тут объяснение про массивы и память:
https://t.me/a248640developchat/1029

ссылка на канал | ссылка на группу
👍2
Media is too big
VIEW IN TELEGRAM
Как вам консольное меню?)

Меню многоуровневое с проверкой на корректный ввод.

Весь проект вышел в 700 строк кода.

ссылка на канал | ссылка на группу
🔥2
Dmitry Develop
image_2023-12-20_04-03-51.png
Сегодня я с столкнулся с проблемой правильного отображения строк в кодировке windows-1251 во время отладки в vs code.
Как я понял, vs code корректно отображает строки только в кодировке utf-8, а в моей программе строки закодированы в windows-1251.
На фото в жёлтой рамке сверху в низ: отображение до и после изменений.

Если кодировки по-умолчанию для программы, отладчика и широких строк не подходят, у gdb есть следующие команды:

Устанавливает кодировку, которую использует программа для char:
set target-charset X

Устанавливает кодировку, которую будет использовать gdb во время отладки:
set host-charset X

Устанавливает кодировку как для target-charset, так и для host-charset:
set charset X

Устанавливает кодировку, которую использует программа для типов wchar_t:
set target-wide-charset

Выводит текущие используемые кодировки:
show charset

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

В моём случае нужны такие настройки:
set host-charset UTF-8
set target-charset CP1251

Как временное решение эти команды можно вводить в консоли отладки начиная с "-exec ".
Каждый раз вручную вводить команды неудобно, поэтому лучше их указать в launch.json.
// launch.json
{
"version": "0.2.0",
"configurations":
[
{
...

"setupCommands":
[
// {
// "text": "set charset UTF-8"
// "ignoreFailures": true
// },
// {
// "text": "set target-wide-charset UTF-16"
// "ignoreFailures": true
// },
{
"text": "set target-charset CP1251"
"ignoreFailures": true
},
{
"text": "set host-charset UTF-8"
"ignoreFailures": true
}
]

...
}
]
}


ссылка на канал | ссылка на группу
Dmitry Develop
ссылка на канал | ссылка на группу
Потихоньку закупаюсь новыми инструментами и радиокомпонентами.
Всё пришло очень быстро).

> Результат выпаивания радиокомпонента полыми трубками
Правда иногда мешает высокая теплоёмкость платы и высокая температура плавления припоя.
Надо бы себе ещё сплав Розе купить.

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