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

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

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

ссылка на канал | ссылка на группу
Есть ли ещё какие-то способы указать желаемую кодировку для строковых литералов?
Кроме:
1) изменения кодировки исходного файла
2) установки ключа -fexec-charset=X,
3) использования литералов вида (только для пункта 1 или конкретных стандартов кодирования unicode):
"char current encoding",
L"wide char current encoding",
u8"utf-8 encoding",
u"utf-16 encoding",
U"utf-32 encoding".
https://en.cppreference.com/w/cpp/language/string_literal

На ум приходят варианты: загрузка строк в нужной кодировке из файла; делать массив char и инициализировать его числовыми кодами конечной кодировки, преобразовывать текст из конечной кодировки в кодировку исходного файла и вставлять его в строковой литерал (скорее всего не будет работать).

Единственный способ, который я нашёл не без подсказки в документации, это сделать строку вручную в виде массива codepoint'ов или строкового литерала с \xn....

В С++23 ещё добавят управляющие последовательности вида \x{n...} для строковых литералов в кодировке utf-8, -16 и -32.
https://en.cppreference.com/w/cpp/language/escape

// "Кириллица" in utf-8
uint8_t utf8Dec[] { 208, 154, 208, 184, 209, 128, 208, 184, 208, 187, 208, 187, 208, 184, 209, 134, 208, 176, 0 };
uint8_t utf8Hex[] { "\xd0\x9a\xd0\xb8\xd1\x80\xd0\xb8\xd0\xbb\xd0\xbb\xd0\xb8\xd1\x86\xd0\xb0" };

// "Кириллица" in windows-1251
uint8_t cp1251Dec[] { 202, 232, 240, 232, 235, 235, 232, 246, 224, 0 };
uint8_t cp1251Hex[] { "\xca\xe8\xf0\xe8\xeb\xeb\xe8\xf6\xe0" };


Вне зависимости от кодировки исходного файла, закодированные таким образом строки остаются в своей кодировке без преобразования.

ссылка на канал | ссылка на группу
Кто-нибудь знает, можно ли указать gcc в какой кодировке выводить предупреждения и ошибки и как это сделать?

При перенаправлении потока ошибок (stderr) в txt файл, при открытии его в кодировке utf-8, содержимое строковых литералов отображается верно: три латинских символа и три кириллических символа: "abcАБВ".
> g++ ... charset/main.cpp 2> output.txt
output.txt:
charset/main.cpp: In function 'int main()':
charset/main.cpp:18:20: warning: unused variable 'utf8' [-Wunused-variable]
18 | const uint8_t* utf8 { (const uint8_t *)u8"abcАБВ" };
| ^~~~
charset/main.cpp:19:21: warning: unused variable 'utf16' [-Wunused-variable]
19 | const uint16_t* utf16 { (const uint16_t*) u"abcАБВ" };
| ^~~~~
charset/main.cpp:20:21: warning: unused variable 'utf32' [-Wunused-variable]
20 | const uint32_t* utf32 { (const uint32_t*) U"abcАБВ" };
| ^~~~~


Но если не перенаправлять поток ошибок (stderr) в файл, сообщение об ошибке выведется в консоль, но, как это обычно бывает, при отличии кодировки текста и консоли, текст усекается: вместо "abcАБВ" выводится только ASCII часть "abc.
Изменение кодировки консоли на 866, 1251 и 65001(utf-8) до вызова g++ не помогло.
> g++ ... charset/main.cpp
charset/main.cpp: In function 'int main()':
charset/main.cpp:18:20: warning: unused variable 'utf8' [-Wunused-variable]
18 | const uint8_t* utf8 { (const uint8_t *)u8"abc;
| ^~~~
charset/main.cpp:19:21: warning: unused variable 'utf16' [-Wunused-variable]
19 | const uint16_t* utf16 { (const uint16_t*) u"abc;
| ^~~~~
charset/main.cpp:20:21: warning: unused variable 'utf32' [-Wunused-variable]
20 | const uint32_t* utf32 { (const uint32_t*) U"abc;
| ^~~~~


[update]
После некоторых тестов я думаю, что gcc не виноват — он просто выводит текст ошибок в кодировке исходного файла.
А вот консоль windows non ASCII символы в кодировке utf-8 почему-то не выводит.
Но при перенаправлении вывода stderr в файл, там появляется правильный текст в кодировке utf-8.

В online компиляторе, который на linux работает, всё выводится корректно.
Видимо, проблема в консоли или windows с кодировкой utf-8.

[update]
Да и этот код работает на вывод как utf-8, так и utf-16:
size_t wcslen(const char16_t* wstr)
{
return wcslen((const wchar_t*)wstr);
}

SetConsoleCP(CP_UTF8);
SetConsoleOutputCP(CP_UTF8);

HANDLE consoleOutput { GetStdHandle(STD_OUTPUT_HANDLE) };

const char* newline { u8"\n" };

const char* utf8 { u8R"("XYZ ЭЮЯ")" };
const char16_t* utf16 { uR"("XYZ ЭЮЯ")" };

WriteConsoleA(consoleOutput, utf8 , strlen(utf8) , nullptr, nullptr);
WriteConsoleA(consoleOutput, newline, strlen(newline), nullptr, nullptr);

WriteConsoleW(consoleOutput, utf16 , wcslen(utf16) , nullptr, nullptr);
WriteConsoleA(consoleOutput, newline, strlen(newline), nullptr, nullptr);

// > "./charset/main.exe"
// "XYZ ЭЮЯ"
// "XYZ ЭЮЯ"


ссылка на канал | ссылка на группу
👍1🤡1
Dmitry Develop
newMonitor.jpg
Я несколько лет сидел за очень маленьким монитором (на самом деле это был телевизор).
Разрешение у него было 1024x768 и соотношение сторон 4:3, растянутое до 16:9.
Цветопередача, углы обзора и частота обновления были ужасными.

И вот спустя столько времени я наконец-то купил себе нормальный монитор.
Разрешение 1920x1080, настоящее соотношение сторон 16:9, диагональ 27 дюймов, частота обновления 144 Hz.

Это не монитор, а плазма какая-то: он очень огромный, фильмы и youtube смотреть одно удовольствие.
Большая частота обновления уже позволила мне заметить, что анимации в windows 10, оказывается, очень плавные.
Теперь на экране помещается всё, не надо больше тесниться, очень много свободного места.

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