Dmitry Develop
رفتن به کانال در Telegram
Этот канал в основном будет интересен новичкам в программировании и людям немного поопытнее. Здесь я буду делиться своими новостями и достижениями в программировании. Разработка, программирование; c++, gcc, g++, gnu, mingw; winapi, windows; vscode.
نمایش بیشتر205
مشترکین
اطلاعاتی وجود ندارد24 ساعت
اطلاعاتی وجود ندارد7 روز
اطلاعاتی وجود ندارد30 روز
آرشیو پست ها
В процессе написания функции, которая будет вычислять количество цифр в числе, в варианте реализации через умножение (как бы вычисление логарифма), я столкнутся с двумя проблемами.
Первая, это переполнение знакового числа при аргументе
INT_MAX и умножении на 10, такой код является UB (undefined behavior), и в моём случае он проявился, как бесконечный цикл и зависание программы навечно.
Вторая, это отсутствие изменения знака числа с отрицательного на положительное при аргументе INT_MIN.
Из-за этого число оставалось отрицательным, проверка в цикле выдавала false, и это приводило к досрочному завершению работы функции и результату 0 знаков.
abs(INT_MIN) возвращает INT_MIN, не знаю почему было сделано именно так вместо возвращения INT_MAX, но можно понять, почему так произошло.
Всё дело в способе хранения знаковых чисел в языке C++ и допустимом диапазоне значений.
Формат two`s complement (двойное дополнение) имеет следующий диапазон допустимых значений: [-2 ^ (N - 1), +2 ^ (N - 1) - 1].
Если рассмотреть 3 битную переменную, то у неё будет следующий диапазон значений: [-4, 3].
И если изменить знак минимального числа -4 для данного диапазона значений, то получится 4, что не может быть в нём представлено, всё просто.
В конкретном случае для этой функции и с текущим алгоритмом нужно строго положительное число, INT_MIN и INT_MAX имеют одинаковое количество цифр, поэтому будет достаточно такого кода:
if(number == INT_MIN)
{
number = INT_MAX;
}
Хотя в будущем хотелось бы отказаться от такого "костыля" и переписать алгоритм по-другому.
Для реализации функции проверки переполнения выражения a * b, пришлось много искать информацию в google, вспомнить законы умножения, которые когда-то давно многим нам в школе рассказывали учителя.
Вот если бы все учителя не только интересно рассказывали и объясняли материал, но и показывали где можно в реальной жизни применить эти знания на практике...
Что ж, мне понадобился переместительный закон умножения (от перестановки множителей произведение не изменяется) и одно из тождественных преобразований (если обе части уравнения умножить или разделить на одно и то же число, не равное нулю, то получится уравнение равносильное данному).
Прежде чем составлять уравнение или неравенство, надо задать вопрос или описать проблему.
Будет ли произведение a и b больше c?
С этого и начнём, пусть a будет первым числом, b будет вторым числом, а c будет INT_MAX, произведение больше которого не должно быть, чтобы не было UB.
a * b > c
a > c / b
a > INT_MAX / b, где b != 0
Так же, чтобы не допустить деления на ноль, этот случай нужно обработать отдельно.
Если один из множителей является нулём, произведение будет всегда ноль (это ещё одно математическое тождество), так что в таком случае можно просто добавить проверку на ноль и вернуть false.
В итоге получается такая простая функция, которая поможет определить переполнение производного и избежать UB кода и сопутствующих проблем:
bool multiplyOverflow(int64_t a, int64_t b)
{
return b != 0 && a > INT64_MAX / b;
}
(Спустя время после тестирования я обнаружил, что функция работает некорректно с отрицательными аргументами и при изменении их порядка, а ещё отрицательный результат проверяет на INT_MAX, хотя нужно на INT_MIN).
Кто умный?
Я умный?
Да нее, сам я ничего не знал и не понимал).
Вот буквально недавно столкнулся с проблемой.
Начал разбираться, читать, анализировать, делать выводы.
И тут бим-бим, бам-бам, бум-бум и пост родился, и типа я такой умный и всё знаю и понимаю)).
Математика и другие точные науки наше всё).
ссылка на канал | ссылка на группуБывает, необходимо m.2 диск новый или из другого ПК подключить, как внешний накопитель, чтобы напрямую установить на него windows, например, или сделать резервную копию данных.
У меня есть два способа подключить диск с таким разъёмом: в мой ноутбук и ПК, у них обоих есть разъём m.2.
Но разбирать каждый раз ноутбук или ПК не удобно и не безопасно.
Я давно хотел себе внешний корпус для m.2 ssd, и сегодня настал тот день, когда я его купил.
Можно сказать, я уже стал любителем техники от производителя ugreen, поэтому именно у него я и купил ugreen CM559.
Так как ещё я любитель универсальности, я стал разбираться: какие бывают контроллеры, какие у них особенности поддержки интерфейсов m.2, какие есть ключи и в чём их особенность, всякий ли m.2 диск подойдёт в m.2 разъём, будет ли поддерживать его контроллер, в общем разбираться, как мне выбрать тот самый универсальный переходник.
Начать решил со спецификации m.2, она предусматривает 12 ключей (или прорезей), интересуют меня не все, а только два из них: это B и M, и три их комбинации: B, M, B & M.
Отличия между ними, если не учитывать контроллер, в поддерживаемом интерфейсе передачи данных, в скорости и в количестве линий.
Ключ B: SATA и / или PCIe x2.
Ключ M: SATA и / или PCIe x4.
Ключ B + M: SATA и / или PCIe x2 (является самым универсальным).
Однако, эта информация ничего не гарантирует, нужно смотреть спецификацию контроллера и его поддержку интерфейсов и разъёма m.2, что печально и создаёт одни трудности.
Ugreen CM559 мне сразу понравился своим внешним видом и массивным радиатором, а так же поддержкой двух протоколов: PCIe и SATA с ключами M или B + M.
Однако, тут очень важно учесть ревизию или номер продукта: есть два CM559, только один с P/N 90408 с контроллером RTL9210B, который поддерживает PCIe и SATA, и диск до 8 TB, а другой с P/N 15511 с контроллером JMS583, который поддерживает только PCIe и диск до 4 TB.
Мне то ли повезло, то ли повлияло моё сообщение продавцу - не знаю, но мне пришёл CM559 именно 90408 модели, как я хотел.
Как я уже говорил, мне он очень понравился по внешнему виду, тяжёленький такой, весь металлический, толстая крышка.
Комплектация богатая: два 10 gbps type c на type c и type c на usb a провода, силиконовый чехол, отвёртка, термопрокладка и запасная защёлка, которую я сейчас обсужу отдельно.
Насчёт пластиковой или резиновой защёлки, это какая-то лютая ошибка и просчёт инженеров ugreen, почему нельзя было просто сделать, как у всех, крепление на бонку и винт?
Тем более, из-за особенностей расположения банок памяти и радиатора на моём ssd диске, они не дают защёлке полностью зафиксировать диск.
Потом я найду бонку или гайку и винт, и по-нормальному зафиксирую диск вместо этого недоразумения.
В остальном мне всё очень понравилось).
(Ugreen, пришлите на обзор мне внешний корпус для 3,5 HDD 😏)
ссылка на канал | ссылка на группу
Всё ещё мучаюсь с китайским велокомпьютером, о котором я говорил в своей группе.
После замены провода и геркона он довольно долгое время работал, но потом снова перестал реагировать на датчик.
Мультиметром в режиме прозвонки я проверил, что датчик на магнит реагирует и обрыва нигде нет.
И что велокомпьютер работает, если пинцетом замыкать его два подпружиненных контакта.
Полдня ещё мучился, но в итоге после всех тестов и экспериментов я обратил внимание на наличие сопротивления между проводами в несколько мегаом.
Подумал, что это довольно большое сопротивление, чтобы микроконтроллер велокомпьютера реагировал на него или оно как-то мешало различать низкий и высокий логический уровень.
Велокомпьютер, если что, считает оборот на переходе между логическими уровнями: с низкого на высокий или с высокого на низкий.
Дальше подумал, а что, если этого сопротивления как раз хватает, чтобы велокомпьютер считывал низкое логическое значение, а когда датчик просаживает напряжение, получается то же низкое логическое значение, и следовательно перехода между уровнями нет и соответственно оборота колеса и какой-либо скорости.
Немного времени спустя я вспомнил закон Ома из школьного курса физики и решил параллельно запаять резистор на 10 мегаом, чтобы при замыкании геркона его сопротивление поделилось на два.
Таким образом я немного сдвинул напряжения разомкнутого и замкнутого геркона.
В итоге я идеально угадал напряжения срабатывания: велокомпьютер снова заработал.
ссылка на канал | ссылка на группу
Разбираюсь с ventoy, хочу научиться устанавливать его вручную без помощи их программы, то есть вручную записать загрузчик, вручную разбить диск и сделать другие этапы.
Сначала было отчаянье, ничего не получалось, не работало, я ничего не понимал.
Но сейчас постепенно начинают появляться успехи).
Возможно, было бы хорошо записать видео и всё-всё рассказать, вместо текстового поста.
Так будет интереснее и информативнее.
ссылка на канал | ссылка на группу
Иногда в группе по vs code я видел желание некоторых людей в терминале скрыть длинный путь до виртуального окружения python или до папки проекта.
У меня такого желания не было, но понять их я могу, всё-таки кастомизация это интересно и удобно.
Например, чтобы вместо:
C:\users\hecker\Desktop\my\very\deep\path\to\my\project> build.bat
Стало такое:
> build.bat
Я видел решение то ли специфичное для python, то ли для конкретной оболочки или терминала, то ли только для linux или macos, типа сделать export какой-то переменной среды и всё получится.
Но для windows cmd мне ни разу не попадалось такое решение, я даже представить не мог, можно ли это сделать и как это реализовано.
Сейчас во время поиска информации для решения одной проблемы я нашёл решение для другой проблемы).
Называется команда (или программа) prompt.
В примере выше использовалась следующая команда: "prompt [$T$H$H$H] $G ".
Почитать какие есть параметры можно по ссылке на документацию или при помощи команды "prompt /?".
ссылка на канал | ссылка на группуИспользовать компилятор mingw в vs code довольно просто.
Если путь до mingw/bin/ указан в переменных среды, то редактор кода и расширения могут автоматически найти g++.exe и получить все необходимые пути и настройки.
Если же компилятор ещё не добавлен в переменные среды или не хочется по какой-либо причине, то можно просто указать полный путь до исполняемого файла компилятора и отладчика, так тоже всё будет работать.
Если предыдущий компилятор можно просто скачать в виде 7z или zip архива, просто разархивировать в любое удобное место, а потом просто запустить gcc.exe или g++.exe без каких-либо дополнительных настроек и трудностей, то с компилятором от microsoft (MSVC, cl.exe) так просто не будет.
Для установки MSVS отдельно от IDE visual studio придётся сначала скачать и запустить Build Tools for Visual Studio 2022, выбрать необходимые рабочие нагрузки (workloads).
Но если после установки вы попробуете запустить компилятор cl.exe, то получите такую ошибку:
>cl.exe
"cl.exe" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.
>
Кстати, установка MSVC будет весить примерно 8 Гб, когда mingw примерно 0.5-2 Гб в зависимости от версии и наличия clang.
Есть несколько способов использовать компилятор cl.exe в vs code:
1) Если вы компилируете вручную и только через терминал, то открываете терминал, запускаете bat файл "C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvarsall.bat" (у вас путь может отличаться) с аргументом x64.
Готово, в данном конкретном терминале будут установлены все переменные среды и компилятор будет работать.
>"C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvarsall.bat" x64
**********************************************************************
** Visual Studio 2022 Developer Command Prompt v17.6.3
** Copyright (c) 2022 Microsoft Corporation
**********************************************************************
[vcvarsall.bat] Environment initialized for: 'x64'
>
2) Создать bat файл, в котором сначала будет запускаться vcvarsall.bat, а потом запускаться cl.exe с нужными аргументами, и tasks.json, в котором будет запускаться скрипт:
call "C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvarsall.bat" x64
cl.exe %*
{
"version": "2.0.0",
"tasks":
[
{
"label": "run cl",
"type": "shell",
"command": "build.bat",
"args":
[
"/Fe:", "main.exe",
"main.cpp"
],
"problemMatcher":
[
"$msCompile"
],
"group":
{
"kind": "build",
"isDefault": true
}
}
]
}
3) Запустить терминал, выполнить "C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvarsall.bat" x64, запустить code.exe (или его ярлык).
Если я найду ещё какие-то другие способы, я дополню этот пост или сделаю отдельный, если помешает лимит символов.
ссылка на канал | ссылка на группуЗа несколько месяцев я увидел много разных интересных или полезных сайтов, которые добавил в свою подборку:
Полезные ссылки для С++ разработчиков
Это довольно старый пост, поэтому многие из вас могли его пропустить, даже при наличии ссылок на этот и многие другие посты в единственном закреплённом сообщении сверху.
Какие ещё интересные или полезные сайты знаете вы, которых ещё нет в моей подборке?
ссылка на канал | ссылка на группу
Ура, в моём списке portable программ теперь появился obs studio).
Скачал программу в виде zip-архива, удалил все старые настройки в %appdata%, удалил уже установленную obs, разархивировал новую obs, запускаю её и вижу, что она сохранила все настройки в %appdata% — не порядок, что это за portable программа, которая выходит за границы своей папки.
Немного поискал, почитал, и нашёл, что есть два пути: добавить аргумент командной строки "--portable" или создать в корне папки obs файл с названием "portable_mode.txt", и только после этого portable программа сохраняет настройки в распакованной папке.
Инструкция:
https://obsproject.com/forum/resources/obs-and-obs-studio-portable-mode-on-windows.359/
Такая же история была с vs code и vs codium, их zip версия тоже требует некоторых действий, чтобы не хранить свои файлы за пределами папки установки.
ссылка на канал | ссылка на группу
Когда я только собрал новый ПК, у меня не было какого-либо sata или M.2 накопителя.
Поэтому я windows установил на внешний usb ssd диск и пользовался так ПК некоторое время.
В играх всё было хорошо и стабильно, но потом я начал замечать графические артефакты, которые были только в игре Dying Light.
Некоторые случайные текстуры, которые от запуска к запуску были разными, заменялись на какую-то разноцветную сетку, и от расстояния немного менялись.
В инвентаре так же вместо правильной текстуры могла быть какая-то другая: карта высот или что-то другое техническое.
Переустановка игры, сброс настроек, обновление видеодрайвера и другие способы не помогли, но после покупки M.2 ssd проблема ушла.
Как думаете, в чём была причина, кто сталкивался?
У диска или контроллера забивался буфер, повредилась файловая система или какая-то другая причина?
ссылка на канал | ссылка на группу
Я не слежу за IT новостями, но эту я совершенно случайно увидел, когда искал есть ли проблема сейчас скачать и установить MSVC в России.
Winlator выпустили android приложение, которое позволяет запускать windows x86 и x86_64 приложения при помощи Wine и Box86/Box64 в операционной системе android.
Официальный сайт разработчика
У habr очень хорошо работает индексация в google: посту всего несколько часов, а он уже есть в поисковой выдаче.
Новость на сайте habr
ссылка на канал | ссылка на группу
Что-то меня vs codium начинает разочаровывать.
Вроде тот же vs code, а трудностей больше.
В vs code я в основном писал на C++, поэтому чуть больше понимаю как работает поддержка и интеграция этого языка, какие инструменты и расширения нужны, чем для других языков.
С переходом на vs codium пришлось отказаться от привычных настроек и расширений и искать другие.
Да, можно установить те же самые расширения через vsix, но с некоторые расширения проверяют название сборки и отказываются работать на неофициальной сборке vs code.
Ладно, для vs codium и C++ я нашёл расширения, которые мне понравились и работают быстрее или дают больше возможностей по сравнению с расширением от microsoft: clangd (llvm-vs-code-extensions.vscode-clangd), Native Debug (webfreak.debug) или CodeLLDB (vadimcn.vscode-lldb).
А вот в случае python я не сразу заметил подвох.
Было установлено расширение python (ms-python.python), вроде всё работало как обычно, но классы и другие сущности из других модулей или файлов не подсвечивались и были белого цвета.
При наведении очень долго редактор кода думает и спустя время показывает объявление и комментарий выделенного символа.
Но перейти к определению не работает, подсказки не работают.
Я даже не заметил, но расширения pylance не было и в vs codium он без модификаций работать из коробки не будет, его даже нет в списке расширений.
Я думал расширение python самодостаточное и ему не нужно для работы какие-то дополнительные зависимости.
По итогу для python я не нашёл какой-то нормальный аналог.
Видимо, придётся вернуться к vs code, так как на python я пишу по работе и мне кроме подсветки синтаксиса нужны и другие привычные в IDE инструменты, как intellisense и другие.
ссылка на канал | ссылка на группу
Вот так вот, занимаешься волонтёрством, следишь за спамом в чатах, удаляешь его или упоминаешь администраторов, а в один прекрасный день ты забанен в одной из групп).
Изменение:
Похоже, это всё произошло из-за нового бота, который меня и забанил.
Администратор группы разобрался в ситуации и разбанил меня).
ссылка на канал | ссылка на группу
Каким-то образом за последнюю неделю я стал популярным и мне начали писать с предложением сверстать сайт по фотографии и написать серверную сторону на node js + express.
Вообще не имел опыта с этим стеком технологий, а на HTML так вообще более 5 лет не писал.
Благо некоторый опыт в поиске и анализе информации помог мне базово разобраться как работает node js и какой код написать, а ещё было просто интересно).
ссылка на канал | ссылка на группу
