В будущем я хотел бы попробовать разработку под микроконтроллеры: 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
Тестирую сейчас каждую функцию из библиотеки.
На данный момент всё работает как и было задумано.
В процессе написания тестов заметил, что использовать мою библиотеку не особо удобно.
Нужно учитывать много низкоуровневых тонкостей и деталей реализации, чтобы работать со строкой.
Я хочу видеть строку, как массив символов вне зависимости от её кодировки и способа хранения.
Нужно пересмотреть способ работы с библиотекой и написать итераторы с функторами.
Тогда можно будет работать со строкой, как массивом символов, а не байтов.
Но и оставить возможность получить информацию по каждому символу: номер, количество байт, сам символ.
ссылка на канал | ссылка на группу
На данный момент всё работает как и было задумано.
В процессе написания тестов заметил, что использовать мою библиотеку не особо удобно.
Нужно учитывать много низкоуровневых тонкостей и деталей реализации, чтобы работать со строкой.
Я хочу видеть строку, как массив символов вне зависимости от её кодировки и способа хранения.
Нужно пересмотреть способ работы с библиотекой и написать итераторы с функторами.
Тогда можно будет работать со строкой, как массивом символов, а не байтов.
Но и оставить возможность получить информацию по каждому символу: номер, количество байт, сам символ.
ссылка на канал | ссылка на группу
Media is too big
VIEW IN TELEGRAM
Вот таким образом можно итерировать строку посимвольно.
Этот код будет очень часто повторяться внутри библиотеки, поэтому нужно придумать, как его вынести в виде самостоятельной функции и использовать.
ссылка на канал | ссылка на группу
Этот код будет очень часто повторяться внутри библиотеки, поэтому нужно придумать, как его вынести в виде самостоятельной функции и использовать.
ссылка на канал | ссылка на группу
Я пока ещё только учусь, чтобы официально стать полноценным junior разработчиком, но мне недавно предложили одно дело...
Нужно разработать графическую программу для работы с устройством.
Техническое задание сложное, но интересное, но и всё и сразу не требуют делать.
Прототип, с которым я буду работать, мне уже пришёл.
Пожелайте мне удачи и успехов с моим первым серьёзным проектом).
ссылка на канал | ссылка на группу
Нужно разработать графическую программу для работы с устройством.
Техническое задание сложное, но интересное, но и всё и сразу не требуют делать.
Прототип, с которым я буду работать, мне уже пришёл.
Пожелайте мне удачи и успехов с моим первым серьёзным проектом).
ссылка на канал | ссылка на группу
👍7