Привет, меня зовут Дмитрий.
Я занимаюсь программированием на С++, как хобби.
Мне нравится писать свои реализации алгоритмов или библиотек и делать это нестандартным путём (велосипеды), разбираться принципе их работы.
Здесь я буду делиться своими новостями и достижениями в программировании и разработке, а также делать некоторые доклады на распространённые темы.
Основная часть публикаций будет на канале, а всё остальное и обсуждение в группе.
Поделитесь ссылкой или публикацией с тем, кому мои труды будут интересны.
Полезные публикации:
> Копирование и пересылка материалов канала
> Шаблон проекта C++ для vscode
> Как компилировать и подключать библиотеки в GCC
> Функция для преобразования диапазонов
> Полезные ссылки для С++ разработчиков
> Циклические зависимости и зависимость от порядка перечисления библиотек в GCC
> Преобразование mangled символов в читаемый вид
> Неправильное отображение содержимого STL контейнеров во время отладки в vs code
> Поддержка канала и помощь в ваших вопросах
> Неправильное отображение строк во время отладки в vs code
> Формат отображения числа в контрольных значениях vs code (gdb)
Если вы дочитали до конца, оставьте любую эмодзи-реакцию ❤️ на это сообщение).
Спасибо).
ссылка на канал | ссылка на группу
Я занимаюсь программированием на С++, как хобби.
Мне нравится писать свои реализации алгоритмов или библиотек и делать это нестандартным путём (велосипеды), разбираться принципе их работы.
Здесь я буду делиться своими новостями и достижениями в программировании и разработке, а также делать некоторые доклады на распространённые темы.
Основная часть публикаций будет на канале, а всё остальное и обсуждение в группе.
Поделитесь ссылкой или публикацией с тем, кому мои труды будут интересны.
Полезные публикации:
> Копирование и пересылка материалов канала
> Шаблон проекта C++ для vscode
> Как компилировать и подключать библиотеки в GCC
> Функция для преобразования диапазонов
> Полезные ссылки для С++ разработчиков
> Циклические зависимости и зависимость от порядка перечисления библиотек в GCC
> Преобразование mangled символов в читаемый вид
> Неправильное отображение содержимого STL контейнеров во время отладки в vs code
> Поддержка канала и помощь в ваших вопросах
> Неправильное отображение строк во время отладки в vs code
> Формат отображения числа в контрольных значениях vs code (gdb)
Если вы дочитали до конца, оставьте любую эмодзи-реакцию ❤️ на это сообщение).
Спасибо).
ссылка на канал | ссылка на группу
👍22👾9🍓7🐳4👨💻3👀3🌭2🦄2😎2👎1👏1
This media is not supported in your browser
VIEW IN TELEGRAM
Красивый эффект получился.
Помогал человеку с рисованием графики в консоли, а потом решил поэкспериментировать с этим сам.
В итоге сделал что-то своё и добавил основной функционал в библиотеку.
В будущем, используя этот фундамент, я сделаю змейку в консоли.
ссылка на канал | ссылка на группу
Помогал человеку с рисованием графики в консоли, а потом решил поэкспериментировать с этим сам.
В итоге сделал что-то своё и добавил основной функционал в библиотеку.
В будущем, используя этот фундамент, я сделаю змейку в консоли.
ссылка на канал | ссылка на группу
👍5❤2
Ручное выделение памяти не самое удобное и безопасное занятие в C++.
Потому что память нужно вручную выделять, вручную освобождать.
Придётся писать больше кода, а ещё можно очень легко создать утечку памяти.
Для решения это проблемы и упрощения синтаксиса библиотеки, я начинаю использовать идиому программирования RAII (получение ресурса есть инициализация).
Это первые наброски, но мне уже нравится, что и этого можно сделать.
Выделение памяти на стеке и куче теперь никак не будет отличаться.
И этот подход объединяет в себе преимущества стека и кучи.
Стек: быстрое выделение памяти, ограниченный объём, автоматическое удаление.
Куча: медленное выделение памяти, неограниченный объём, ручное удаление.
ссылка на канал | ссылка на группу
Потому что память нужно вручную выделять, вручную освобождать.
Придётся писать больше кода, а ещё можно очень легко создать утечку памяти.
Для решения это проблемы и упрощения синтаксиса библиотеки, я начинаю использовать идиому программирования RAII (получение ресурса есть инициализация).
Это первые наброски, но мне уже нравится, что и этого можно сделать.
Выделение памяти на стеке и куче теперь никак не будет отличаться.
И этот подход объединяет в себе преимущества стека и кучи.
Стек: быстрое выделение памяти, ограниченный объём, автоматическое удаление.
Куча: медленное выделение памяти, неограниченный объём, ручное удаление.
ссылка на канал | ссылка на группу
Оказывается, в telegram, если поделиться сообщением из канала, оно полностью дублируется в диалог.
Мне такой момент не нравится по двум причинам:
1) Сообщение полностью дублируется а так же выглядит очень громоздко в диалоге.
2) Я не могу в будущем отредактировать все дубликаты, следовательно в диалоге будет старая версия сообщения без правок и дополнений.
Поэтому, если хотите с кем-то поделиться сообщением из канала, отправьте именно ссылку на сообщение: "Копировать ссылку на сообщение" из контекстного меню или "Копировать ссылку" в конце каждого сообщения.
ссылка на канал | ссылка на группу
Мне такой момент не нравится по двум причинам:
1) Сообщение полностью дублируется а так же выглядит очень громоздко в диалоге.
2) Я не могу в будущем отредактировать все дубликаты, следовательно в диалоге будет старая версия сообщения без правок и дополнений.
Поэтому, если хотите с кем-то поделиться сообщением из канала, отправьте именно ссылку на сообщение: "Копировать ссылку на сообщение" из контекстного меню или "Копировать ссылку" в конце каждого сообщения.
ссылка на канал | ссылка на группу
👍2
В будущем я хотел бы попробовать разработку под микроконтроллеры: arduino(avr) или esp.
Поэтому буду постепенно привыкать к типам с фиксированным размером данных (stdint.h, cstdint).
Вы же знали, что размер типа данных в C++ может варьироваться?)
Вот так выглядит простой "hello world" в реалиях C++ под windows.
Мне очень даже нравится внешний вид кода программы.
ссылка на канал | ссылка на группу
Поэтому буду постепенно привыкать к типам с фиксированным размером данных (stdint.h, cstdint).
Вы же знали, что размер типа данных в C++ может варьироваться?)
Вот так выглядит простой "hello world" в реалиях C++ под windows.
Мне очень даже нравится внешний вид кода программы.
ссылка на канал | ссылка на группу
Обычно, символьные константы для какой-то конкретной функции FunctionNameA я называю таким образом: префикс из первых букв функции + название параметра (fnaOption1, fnaOption2).
Есть у кого варианты более красивого или правильного наименования?
Названия я предпочитаю писать в camelCase.
ссылка на канал | ссылка на группу
Есть у кого варианты более красивого или правильного наименования?
Названия я предпочитаю писать в camelCase.
ссылка на канал | ссылка на группу
👍1
Часть 1
часть 2
Все мы когда-нибудь сталкивались с таким явлением, как текст из иероглифов (крякозябр).
Причины, почему строки в одной кодировке выводятся в другой, могут быть разными.
Но почему отображаются всегда одни и те же кракозябры?
Ответ на этот вопрос довольно прост.
Кодировки бывают однобайтовые и многобайтовые.
Это значит, что для представления одного символа из строки требуется один или более байтов.
Представляйте кодировку, как очень большую таблицу, где для каждому символу присваивается уникальный порядковый номер в рамках этой кодировки.
Большинство кодировок являются совместимыми с ASCII (UTF-7), поэтому латиница, цифры и символы отображаются в разных кодировках правильно.
Именно потому, что порядковые номера одного и того же символа могут отличаться в разных кодировках или вообще отсутствовать, строка может стать нечитаемой.
ссылка на канал | ссылка на группу
часть 2
Все мы когда-нибудь сталкивались с таким явлением, как текст из иероглифов (крякозябр).
Причины, почему строки в одной кодировке выводятся в другой, могут быть разными.
Но почему отображаются всегда одни и те же кракозябры?
Ответ на этот вопрос довольно прост.
Кодировки бывают однобайтовые и многобайтовые.
Это значит, что для представления одного символа из строки требуется один или более байтов.
Представляйте кодировку, как очень большую таблицу, где для каждому символу присваивается уникальный порядковый номер в рамках этой кодировки.
Большинство кодировок являются совместимыми с ASCII (UTF-7), поэтому латиница, цифры и символы отображаются в разных кодировках правильно.
Именно потому, что порядковые номера одного и того же символа могут отличаться в разных кодировках или вообще отсутствовать, строка может стать нечитаемой.
ссылка на канал | ссылка на группу
🔥2
В разработке моей небольшой библиотеки для работы с utf-8 строками остановился прогресс.
Хаотичное написание кода не помогло решить архитектурные вопросы и проблемы.
Поэтому я решил начать разработку с нуля, а именно с определения условий и требований к проекту.
ссылка на канал | ссылка на группу
Хаотичное написание кода не помогло решить архитектурные вопросы и проблемы.
Поэтому я решил начать разработку с нуля, а именно с определения условий и требований к проекту.
Строка: это массив символов с 0 в конце (char string[] { 'S', 't', 'r', 'i', 'n', 'g', '\0'}).
Ввод и вывод данных происходит в виде строки.
Большая часть работы происходит со строками.
Строка закодирована по стандарту utf-8.
Цель проекта разработать следующий функционал:
операции над строками (копирование, конкатенирование, сравнение...),
конвертирование других типов данных из/в строку (stringFromInt, stringToInt),
конвертирование кодировки строки из/в utf-16 для OS windows.
Условия:
Си подобный API с минимальным использованием возможностей C++.
Разрешается делать C++ обёртку над Си API.
Язык программирования: C++20.
Компилятор: gcc x86_64 12.2.0ссылка на канал | ссылка на группу
👍1
Dmitry Develop
Часть 1 часть 2 Все мы когда-нибудь сталкивались с таким явлением, как текст из иероглифов (крякозябр). Причины, почему строки в одной кодировке выводятся в другой, могут быть разными. Но почему отображаются всегда одни и те же кракозябры? Ответ на этот…
1 часть
2 часть
По этой причине, если вы только начали свой путь в программировании, пишите все строки в программе на латинице, чтобы проблемы с кодировкой вас не затронули.
В кодировке UTF-8, CP-1251, CP-866 и других латинская буква 'A' представляется { 65 }.
Однако кириллическая 'А' в UTF-8 { 208, 144 }, в CP-1251 { 192 }, в CP-866 { 128 }.
Более наглядно разницу в кодировании символов можете посмотреть в разделе "Таблица символов" на сайте adruino.
Вот так строка в UTF-8 будет отображаться в разных распространённых кодировках:
UTF-8
"Здравствуйте. Hello. +-*/012345"
UTF-16
"���4�@�0�2�A�B�2�C�9�B�5. Hello. +-*/012345"
CP-437
"Здравствуйте. Hello. +-*/012345"
CP-866
"╨Ч╨┤╤А╨░╨▓╤Б╤В╨▓╤Г╨╣╤В╨╡. Hello. +-*/012345"
CP-1251
"Здравствуйте. Hello. +-*/012345"
CP-1252
"Здрав�твуйте. Hello. +-*/012345"
ссылка на канал | ссылка на группу
2 часть
По этой причине, если вы только начали свой путь в программировании, пишите все строки в программе на латинице, чтобы проблемы с кодировкой вас не затронули.
В кодировке UTF-8, CP-1251, CP-866 и других латинская буква 'A' представляется { 65 }.
Однако кириллическая 'А' в UTF-8 { 208, 144 }, в CP-1251 { 192 }, в CP-866 { 128 }.
Более наглядно разницу в кодировании символов можете посмотреть в разделе "Таблица символов" на сайте adruino.
Вот так строка в UTF-8 будет отображаться в разных распространённых кодировках:
UTF-8
"Здравствуйте. Hello. +-*/012345"
UTF-16
"���4�@�0�2�A�B�2�C�9�B�5. Hello. +-*/012345"
CP-437
"Здравствуйте. Hello. +-*/012345"
CP-866
"╨Ч╨┤╤А╨░╨▓╤Б╤В╨▓╤Г╨╣╤В╨╡. Hello. +-*/012345"
CP-1251
"Здравствуйте. Hello. +-*/012345"
CP-1252
"Здрав�твуйте. Hello. +-*/012345"
ссылка на канал | ссылка на группу
👍1
Не могу придумать однозначные названия для свойств строки и названия параметров функций.
У строки есть 3 свойства: объём памяти, количество байтов, количество символов.
Вопрос в том, какое название выбрать для каждого свойства?
ссылка на канал | ссылка на группу
У строки есть 3 свойства: объём памяти, количество байтов, количество символов.
Вопрос в том, какое название выбрать для каждого свойства?
int A { 64 }; // размер памяти
int B { 12 }; // количество байтов
int C { 6 }; // количество символов
char string[A] = "Привет";
B = 12 = count({ 208, 159, 209, 128, 208, 184, 208, 178, 208, 181, 209, 130 });
C = 6 = count("Привет");ссылка на канал | ссылка на группу
Что ж, размер строки в символах и байтах теперь можно получить.
Предыдущий вопрос остаётся открытым.
Как назвать: размер массива, количество байтов и символов в строке?
Где-то нужно указать размер памяти, где-то количество байтов.
size в зависимости от контекста может иметь разный смысл.
Допустим, есть у нас функция, которая читает ввод из консоли и записывает его в буфер определённого размера.
Либо функцию переделывать, либо думать над названием переменной.
ссылка на канал | ссылка на группу
Предыдущий вопрос остаётся открытым.
Как назвать: размер массива, количество байтов и символов в строке?
Где-то нужно указать размер памяти, где-то количество байтов.
size в зависимости от контекста может иметь разный смысл.
Допустим, есть у нас функция, которая читает ввод из консоли и записывает его в буфер определённого размера.
void consoleRead(char* string, int sayMyName);
sayMyName может значить и размер строки в байтах, и размер памяти, может значить сколько символов мы хотим прочитать.Либо функцию переделывать, либо думать над названием переменной.
ссылка на канал | ссылка на группу
Листочек и немного времени творят чудеса.
Функция, которая месяц назад всегда провоцировала access violation, сейчас написана с 0 и прекрасно работает.
Копирует строку
Так же эта функция прекрасно копирует перекрывающиеся строки в отличии от
Для этого сделана удобная обёртка
ссылка на канал | ссылка на группу
Функция, которая месяц назад всегда провоцировала access violation, сейчас написана с 0 и прекрасно работает.
stringCopy(destination, source, terminated);Копирует строку
source в destination.Так же эта функция прекрасно копирует перекрывающиеся строки в отличии от
strcpy, поэтому есть возможность копировать, например, конец строки в её начало или сдвигать символы строке.Для этого сделана удобная обёртка
stringCopy(string, offset, terminated);ссылка на канал | ссылка на группу
👍1
Вот так сейчас довольно просто в виде обёртки над
Код моей библиотеки это наглядный пример принципа DRY (Don`t Repeat Yourself).
Весь функционал моей библиотеки разбит на много маленьких и самостоятельных функций (модулей).
И более сложный функционал составляется из этих маленьких модулей без лишнего повторения кода.
ссылка на канал | ссылка на группу
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
Ох, сколько же времени понадобится, чтобы сделать отладку каждой функции.
Параметров как-то многовато, но если спрятать повторяющиеся (
Раньше у меня
Но это требует поддержки со стороны компилятора, а мне хочется попробовать сделать без неё.
В будущем напишу конвертер кодировок utf-8 <-> utf-16 и форматирование чисел).
1)
3)
ссылка на канал | ссылка на группу
Параметров как-то многовато, но если спрятать повторяющиеся (
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