• Как оптимизировать код с++ с рекурсией в времени?

    @res2001
    Используйте std::div для вычисления остатка и частного одновременно.
    Написано
  • Как подключить библиотеку TgBot к срр проекту?

    @res2001
    Тимофей, Т.к. вы используете vcpkg, то оптимально было бы добавить путь в PATH к каталогу vcpkg/.../bin. Тогда у вас автоматически все библиотеки предоставляемые vcpkg станут доступны.
    Так же не забудьте, что при переносе приложения на другой комп (или изготовлении инсталятора) надо будет тащить с собой и dll (lib не нужен). Тут так же надо будет решать куда положить dll: можно рядом с exe, можно в c:\windows\system32
    Написано
  • Как составить план по изучению языка C++?

    @res2001
    во всех книгах план примерно такой

    Это не план, это оглавление
    тип string является вовсе не типом, а классом

    Классы - это и есть типы. Только это не встроенные типы, а типы определяемые пользователем. В случае с std::string - это тип определяемый стандартной библиотекой, но это не принципиально.
    Кроме классов есть еще структуры, это по сути одно и то же, кроме небольших различий.
    ввод/вывод в консольном приложении осуществляется через объекты cin и cout

    И что? У вас с этим проблемы? Можете использовать и std::printf, но это не "С++ style" :)

    Как тут уже все не однократно писали - больше практики. Делайте задания из книг, придумайте свой проект и пытайтесь его реализовать.
    Написано
  • Как подключить библиотеку TgBot к срр проекту?

    @res2001
    Тимофей, Переложить dll либо в папку с вашим exe файом, либо в каталог, который указан в PATH, либо добавить в PATH собственный путь. Т.е. просто сделать так, чтоб винда по своему алгоритму поиска dll смогла найти нужный вам файл.
    Написано
  • Как подключить библиотеку TgBot к срр проекту?

    @res2001
    Тимофей, На скринах инструкция правильная.
    Я бы не использовал вариант с pragma, а подключал библиотеку "альтернативным" способом. Хотя этот способ собственно основной, а никак не альтернативный. А pragma - как раз альтернативный и поддерживается далеко не всеми компиляторами.
    Проверьте, чтоб lib и dll файлы находились в каталогах, указанных в п.1, а заголовочные файлы библиотеки находились в каталоге Additional Include Directories.
    Написано
  • Ошибка в bat скрипте который изменяет протокол ip версии 4 (tcp/IPv4), как исправить?

    @res2001
    Роман Страх,
    не нравится ему маска все равно + ip пустой

    Предполагаю, что ему больше не нравится пустой IP, а маска как следствие.
    Почему IP пустой? Вы же писали выше, что IP выделить получается. После цикла поиска IP напечатайте содержимое ip_address.
    Кстати, после цикла уже можно использовать стандартный вариант обращения к переменной: echo.%ip_address%
    Написано
  • Ошибка в bat скрипте который изменяет протокол ip версии 4 (tcp/IPv4), как исправить?

    @res2001
    Роман Страх,
    по отдельности получается найти ip , грамотно через tokens выделить только его но все вместе работать не хочет.

    По крайней мере у меня ваш цикл отрабатывает, правда у меня английская винда, пришлось немного подправить строку поиска. Одно но - ip_address будет установлен в последний адрес в списке, если интерфейсов несколько.

    Возможно стоит указать полный вариант команды:
    netsh interface ip set address name="%interface_name%" source=static address=!ip_address! mask=%subnet_mask% gateway=%gateway%

    Можете так же выдернуть команду из батника и выполнить ее в ком.строке целиком, без консоли netsh.
    Написано
  • Как исправить ошибку буфера с UART?

    @res2001
    Павел Соколов,
    для обработки ERROR_IO_PENDING как раз и применяется WaitForSingleObject

    В случае чтения вызов WaitForSingleObject только после WaitCommEvent.
    Я же пишу о том, что ReadFile может вернуть ERROR_IO_PENDING, даже в вашем случае.

    Таймауты сейчас скорее всего роли не играют. Но в таком случае их лучше не использовать.

    Зачем использовать EV_ERR когда мы передаем и получаем одинаковое кол-во байт? Куда переполнится буфер если мы всего для теста запускаем 1 отправку и 1 чтение, а запас в 1,5х объема?

    Имею ввиду промежуточный буфер ядра, а не ваши буфера, которые вы передаете в ReadFile.
    Если вы не успеваете почему то вычитывать данные при их большом количестве, то буфер ядра может переполнится и будут пропуски данных.
    Написано
  • Как исправить ошибку буфера с UART?

    @res2001
    Павел Соколов,
    "ожидание блока байтов с прочтением их всех"

    Вот с прочтением "их всех" у вас и проблема.
    Хотя бы обработайте возвращаемое значение ReadFile и возможный даже в этом случае ERROR_IO_PENDING.
    Хрен с ней с асинхронщиной, можете оставить как есть, но использование ReadFile надо поправить.
    В текущем виде ReadFile - это потенциальное место где возможны ваши проблемы.

    Таймауты странные. Почему 10 везде? Я бы высчитывал значение таймаута чтения для каждой операции чтения исходя из размера буфера и заполнял им только ReadTotalTimeoutConstant. Остальное в 0.

    Так же не плохо бы добавить обработку SetCommMask(EV_ERR) - помимо ошибок обмена, можно будет отлавливать переполнение буфера. Вы же теряете байты.
    Написано
  • Как исправить ошибку буфера с UART?

    @res2001
    Павел Соколов,
    это обеспечивает асинхронные EV_RXCHAR и EV_TXCHAR

    У вас и работа с EV_RXCHAR по сути синхронная - установили флаг - дождались события. Можно просто использовать синхронную WaitCommEvent с тем же эффектом.
    Про EV_TXCHAR в примере кода вообще нет упоминания.

    Возможно вам для чего-то еще нужен асинхронный режим. Но из приведенных фрагментов кода это никак не следует.

    Я не просто так указал verilog здесь, потому что я не уверен 100% что здесь нет ее вины.

    Тем более нет смысла усложнять. Делайте максимально просто, чтоб сократить возможное количество ошибок на этой стороне.
    Написано
  • Как исправить ошибку буфера с UART?

    @res2001
    Павел Соколов, На счет 1 байта - чтоб операция ReadFile не завершалась на чтении каждого байта можно предварительно установить таймауты:
    https://learn.microsoft.com/en-us/windows/win32/ap...
    https://learn.microsoft.com/en-us/windows/win32/ap...

    Наличие таймаута не гарантирует, что прочитается заданное количество байт за это время.
    Написано
  • Как исправить ошибку буфера с UART?

    @res2001
    Павел Соколов,
    синхронно относительно кого?

    Синхронно относительно вызова ReadFile, т.е. если ReadFile вернул управление, то вы сейчас предполагаете, что операция чтения завершена успешно. Но это не гарантируется ОС.
    Цикл проблему не решает

    А у вас сейчас нет цикла совсем? И вы не ловите на каждый байт событие EV_RXCHAR? И при этом совершаете больше телодвижений, чем с одним ReadFile. И я нигде не говорил про 1 байт - сколько вычитает, столько и вернет. А на счет проблемы - см. предыдущий абзац
    Написано
  • Как вернуть двумерный массив?

    @res2001
    niten_d0raku, Да, первый вариант не верен, согласен.
    Второй - вполне рабочий.

    Вместо варианта со структурой, предложенного pvvv, можно использовать std::array. Но т.к. std::array - одномерный массив, то придется делать его вложенным. Зато кастовать не надо. А на приемной стороне использовать auto, чтоб не морочиться с написанием сложносочиненного типа.
    По сути это тот же вариант со структурой, только структура стандартная.

    Если подойти по серьезному, то лучше собственную структуру нарастить всеми нужными методами для доступа к элементам по индексу и т.п. Тогда структура сойдет за полноценный кастомный класс массива.
    Написано
  • Ошибка в bat скрипте который изменяет протокол ip версии 4 (tcp/IPv4), как исправить?

    @res2001
    Проблема в получении локального ip адреса (он остается пустым) почему -то, в чем может быть проблема ?

    1. в for /f нужен пробел между замыкающей двойной кавычкой и одинарной.
    2. Для отладки фильтра - выдерните выражения фильтра из for /f и выполните его просто в командной строке, естественно с заменой переменных и т.п. Добейтесь, чтоб в командной строке у вас был правильный результат. Полученное выражение потом используйте в батнике.
    Также пишет Недопустимый параметр mask (192.168.100.123).

    3. Это видимо уже при вызове netsh. Тут точно так же выполните команды вручную из командной строки, добейтесь правильного выполнения. Затем используйте полученную команду в батнике.
    netsh имеет собственную командную строку, просто запустите netsh без аргументов, внутри можно выполнять все те команды, которые передаете в параметрах. Доступна подробная справка по командам и параметрам. Рекомендую.
    Точно не уверен, но возможно для изменения некоторых параметров через netsh потребуется повышение привилегий.
    Написано
  • Как написать динамическую библиотеку на C++ при помощи CMake в среде QTCreator, которую потом можно будет импортировать в проекты на Python?

    @res2001
    Александр Ананьев, В вопросе от Qt фигурирует только qtcreator, его можно отлично использовать в проектах и без самого Qt, к тому же с cmake он прекрасно управляется.
    Mar_4, Тема довольно обширная, вряд ли кто-то где-то вам расскажет все пошагово. Придется вникать и разбираться.
    Вариантов реализации может быть несколько с использованием разных технологий, доступных в питоне.
    Если реально много сложных структур надо прокидывать в питон, то, возможно, лучше использовать самый сложный (и наиболее универсальный) вариант: https://docs.python.org/3/extending/extending.html
    Возможно получится обойтись грамотным использованием numpy и т.п. модулей для питона, ускоряющих вычисления. Попробуйте это для начала. Хотя бы для того, что бы потом было с чем сравнивать производительность, возможно овчинка не будет стоить выделки.
    Написано
  • Как вывести значение указателя без иннициализации?

    @res2001
    Deita,
    всегда думал что это зависит от ОС, и в последнее время на Windows 11 никакого мусора там не видел.

    От ОС не зависит.
    Автоматические переменные (ваш случай) хранятся в стеке. Стек постоянно используемая вашим приложением область памяти, выделяется 1 раз при старте приложения и освобождается (весь стек) при выходе из приложения. Да, первоначально при выделении стека, возможно, память под ним обнуляется (тут я точно не знаю). Но по мере использования освобождение стековых переменных не приводит к обнулению памяти занимаемой переменной. Таким образом новые переменные, которые будут занимать место в памяти там же где были предыдущие (освобожденные) переменные будут иметь первоначальное значение то, что осталось от предыдущих переменных.
    В вашей примитивной программе, возможно, вы будете всегда получать в переменных нули. Но стоит сделать программу чуть сложнее, например, функционал выделить в отдельную функцию, а в main вызывать эту функцию в цикле несколько раз. Можно будет увидеть, что переменные в функции без инициализации будут содержать мусор, точнее в этом примере будут содержать значения оставшиеся от предыдущего запуска функции.

    Реальные программы содержат десятки (сотни/тысячи) функций и их вызовов, поэтому ваш пример не показателен в этом отношении и на нем не стоит делать далеко идущих выводов.

    И еще момент. Поведение может зависеть от того собрана ли программа с отладочной информацией или нет. В случае наличия отладочной информации поведение может зависеть от компилятора. Например некоторые компиляторы могут принудительно вставлять код очистки при выходе из функций или например проверку на выход за границы памяти и т.п. Очень частая ситуация, когда в отладочном режиме программа вроде бы работает, а в релизном не работает. И это является показателем наличия в программе ошибок, которые в отладочном режиме не проявляются, а в релизе проявляются, из-за особенностей данного конкретного компилятора при сборке программы в отладочном режиме. С этими ошибками надо бороться.
    Написано
  • Как вывести значение указателя без иннициализации?

    @res2001
    Хорошо бы увидеть оригинальный текст задания, а не ваш пересказ.
    Вопрос по заданию:
    "без инициализации" относится к указателям или к памяти на которую ссылаются указатели?
    В обоих случаях ваша реализация не корректна.

    Но если речь о не инициализированных указателях, то можно ничего не писать, т.к. результат изначально ясен:
    Если указатели (да и любые автоматические переменные) не инициализировать, то в них будет содержаться какой-то мусор, который когда-то был записан по этим адресам памяти.
    Если обратится к памяти на которую указывает такой "мусорный" указатель то в любых современных ОС, где есть виртуальная память, вы получите ошибку. В линуксе это будет SIGFAULT, в винде Access Denied, программа аварийно завершится на попытке доступа к не выделенной памяти.
    Иногда может и не быть ошибок, если вдруг, совершенно случайно, мусор в указателе образует какой-то адрес, который уже был выделен процессу. Тогда вы прочитаете оттуда что-нибудь. Но шансы на такой исход крайне не велики. Но если даже каким-то чудом это случится и вы успешно прочитаете значение, то после записи новых значений с программой может происходить ВСЕ ЧТО УГОДНО (UB), т.к. вы не знаете куда вы записали это значение, какие процессы используют это значение (ведь та память для чего-то была выделена), что должно реально находится по этим адресам и т.д. и т.п.
    И это при том, что надо будет еще побороть ошибки на этапе компиляции, т.к. компилятор то же следит за тем, чтоб вы не обращались к не инициализированным переменным.
    Написано
  • Как получить хендл без OpenProcess?

    @res2001
    На сколько я знаю хендл указывает на некую структуру в ядре привязанную к текущему процессу. Получить циферки хэндла из другого процесса может как-то и можно, но т.к. в твоем процессе в ядре этой структуры не будет, то и использовать ты его не сможешь.

    Кроме получения хэндла через CreateProcess, OpenProcess и GetCurrentProcess хэндлы могут наследоваться дочерними процессами, но для этого, надо включить наследование хэндла внутри оригинального процесса и запустить из него дочерний процесс.
    Написано
  • Почему ReadProcessMemory не может прочитать память и возвращает 299?

    @res2001
    DanilkaC, https://learn.microsoft.com/ru-ru/windows/win32/de...
    Судя по тому, что 299 ошибка -это ERROR_PARTIAL_COPY, то, возможно, выход за пределы выделенной памяти в процессе.
    module может у вас и корректен, но (module + 0x17361E8) может стать не корректным. Или размер читаемых данных не корректен.
    Написано