Листочек и немного времени творят чудеса.
Функция, которая месяц назад всегда провоцировала 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
1 часть
2 часть
vs code это редактор кода с поддержкой плагинов.
Для работы с C++ нужно установить C/C++ дополнение, отдельно скачать и установить компилятор, потом создать конфиги в папке проекта.
Я хотел поэкспериментировать с настройкой конфигов, поэтому создал пустой проект без них с единственным файлом main.cpp.
В пустом проекте почему-то исходный код успешно компилировался и отлаживался, хотя я ещё ничего не настраивал, я даже не указывал путь до компилятора нигде.
Мне это показалось слишком странным, поэтому я решил копнуть глубже.
Оказалось, что отладчик неявно ищет путь к известным компиляторам в переменных среды (PATH).
У меня в PATH как раз был указан путь к моему компилятору gcc.
Я эту строчку удалил, чтобы узнать, что произойдёт дальше.
После этого отладчик сообщал об ошибке
ссылка на канал | ссылка на группу
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 и написал минимально необходимый конфиг, а главное
Теперь при отладке ошибка стала другой:
С такой ошибкой я ещё ни разу не сталкивался, она сбила меня с толку.
Спустя некоторое время поисков, я не нашёл решения для моей ошибки.
Тогда я решил поискать похожие проблемы не по тексту ошибки, а коду 0xc0000135.
И о чудо, на github уже кто-то сталкивался с таким кодом ошибки.
Оказалось, что отладчик просто не может найти DLL необходимые программе С++ библиотеки, которые обычно лежат в папке с компилятором или в c:/windows/system32.
Изменил current working directory
Изменять текущую рабочую папку программы не самая лучшая идея, это костыль, из-за этого могут происходить самые разные и неочевидные проблемы.
Так и оказалось, когда я попробовал создать файл test.txt, он создался в папке с компилятором, а не рядом с main.exe.
Есть правильных 2 решения:
1) в настройках windows добавить в PATH путь до компилятора.
2) временно изменить PATH через конфиг.
Так как я сторонник portable программ, которые работают без установки и изменения реестра, я выбрал для себя 2 решение.
ссылка на канал | ссылка на группу
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 кОм с ручкой
ссылка на канал | ссылка на группу
Нет сил и желания заниматься даже программированием.
Наверное, это называется выгорание.
Надеюсь, arduino сможет вернуть мне настрой снова творить).
Заказал с Китая:
arduino nano v3 type-c
макетную плату
соединительные провода
20 RGB светодиодов
100 резисторов на 220 Ом
5 потенциометров на 10 кОм с ручкой
ссылка на канал | ссылка на группу
👍2
А вот уже правильная сетка с размером клетки 20px.
Код этого проекта после маленького рефакторинга выложу на github.
ссылка на канал | ссылка на группу
Код этого проекта после маленького рефакторинга выложу на github.
ссылка на канал | ссылка на группу
За такой говнокод в обучающих видео надо по рукам бить.
Почему автор не создал массив байтов, где каждый бит отвечает за сегмент индикатора, а индексом которого была бы желаемая цифра минус 1?
Не походили массивы?
А почему вы вообще пишите программу на Си/С++, не зная основных языковых конструкций?
ссылка на канал | ссылка на группу
Почему автор не создал массив байтов, где каждый бит отвечает за сегмент индикатора, а индексом которого была бы желаемая цифра минус 1?
Не походили массивы?
А почему вы вообще пишите программу на Си/С++, не зная основных языковых конструкций?
ссылка на канал | ссылка на группу
🔥1