• Что в CMAKE я должен считать библиотекой?

    @res2001
    Developer, ex-admin
    Вообще обычно бибилотеки ставятся отдельно в систему (для линукс) с помощью стандартного пакетного менеджера.

    Если вашей библиотеки в пакетном менеджере нет, то можно и собирать из исходников.
    В этом случае можно и просто "сувать" все файлы в add_executable. Никто ж вам это запретить не может.
    Но обычно проще, лучше и универсальней для сторонних библиотек создавать свои собственные цели с помощью add_library и уже их подключать к основной цели с помощью target_link_libraries. Библиотеку можно делать как динамическую, так и статическую.
    Если проект достаточно развесистый и содержит например тесты и/или несколько исполняемых файлов, то вообще можно в каждом каталоге проекта создавать отдельную статическую библиотеку. На больших проектах это часто может сэкономить время на компиляции, за счет того что в несколько конечных целей будут линковаться уже готовые библиотеки, а не пересобираться из исходников каждый раз.
    Ответ написан
    3 комментария
  • Bat файл работает через раз как исправить?

    @res2001
    Developer, ex-admin
    В команде call, на соклько помню нужно указывать имя файла с расширением. Она вызывает другой внешний батник. Проверить сейчас поведение команды без указания расширения не могу.
    В любом случае, если тут должен вызваться activate.bat, то надо его смотреть то же.

    По остальным командам вообще не чему тормозить, кроме, конечно питоновского скрипта.
    Ну и не забывайте, что в конце стоит команда pause - она ждет нажатия any key пользователем. Ждать может до посинения.
    Ответ написан
  • Стоит ли учить Boost в 2021 году?

    @res2001
    Developer, ex-admin
    Вполне востребованная библиотека.
    Но учить не стоит. Стоит знать, какие возможности она предоставляет и как ее исопльзовать в своем проекте. Сделать пример с какими-нибудь достаточно сложными компонентами буста, например asio.
    Ответ написан
    Комментировать
  • Как удалить наименьшую цифру из числа?

    @res2001
    Developer, ex-admin
    Проще всего, по моему, перевести число в строку и работать с символами. Находите минимальную цифру перебором, запоминаете ее позицию в строке, копируете остаток строки после минимальной цифры в позицию минимальной цифры.
    Ответ написан
    Комментировать
  • Как скрестить локальное .exe-приложение с интерфейсом управления в веб-браузере?

    @res2001
    Developer, ex-admin
    Проще всего использовать старый добрый интерфейс CGI, его ни кто не отменял и поддержка в веб серверах есть.
    Возможно есть что-то на замену CGI, более свежее и быстрое.

    Другой вариант - встроить веб сервер в приложение. Думаю можно найти какой-то готовый веб сервер в виде библиотеки С/С++ и использовать эту библиотеку (из того что приходит на ум - libonion). Можно написать самому какой-то урезанный вариант веб сервера с минимальным функционалом. Для этого можно использовать какой-либо библиотечный HTTP парсер или опять же написать его самому.
    Ответ написан
    Комментировать
  • Как правильно использовать указатель?

    @res2001
    Developer, ex-admin
    Когда вы передаете в функцию указатель на объект (на что угодно), это значит, что вы можете в функции изменять этот объект и все изменения будут видны вызывающему коду.
    Если вам надо что бы вызывающий код увидел новый указатель, то передайте в функцию указатель на указатель:
    int next_edge(edge_t **out_edge)
    {
      edge_t * tmp = malloc(sizeof(edge_t));
      if(tmp)
      {
         *out_edge = tmp;
         return 1;
      }
      return 0;
    }

    Но обычно проще в таком случае возвращать указатель в возвращаемом значении. Вызывающий код может сравнить возвращенное значение с NULL для выяснения того вернула функция нормальный указатель или произошла ошибка. Так делает, например, функция malloc().
    Ответ написан
    2 комментария
  • Можно ли в tracert увидеть 2 и более роутеров поключенных последовательно?

    @res2001
    Developer, ex-admin
    tracert выполняет обычные пинги (ICMP echo request) с постепенным увеличением значения TTL пакета от 1 и до max hop.
    На любом шлюзе/роутере правилами фаервола можно блокировать ICMP. Тогда на этом хопе tracert покажет * вместо нормальной статистики.
    Ответ написан
    Комментировать
  • EventLoop, потоки и блокировки, как правильно блокировать?

    @res2001
    Developer, ex-admin
    Что касается ImageMemoryCache: в методе get вы возвращаете ссылку на элемент мапы. Блокировка с мапы снимается при выходе из get, но вызывающий код имеет ссылку и может с этим объектом делать все что угодно.
    Параллельно вы можете вызвать clear, который удалит элемент на который осталась ссылка в другом потоке.

    По уму вы должны блокировать мапу до тех пор пока жива любая ссылка на содержимое мапы.
    Второй вариант - создавать в get копии объектов из мапы и возвращать их. При этом изменение этого нового объекта никак не повлияет на объект в мапе. Ну тут можно что-нибудь придумать, сделать какой-то прокси объект и т.п.
    Третий вариант - каждый объект в мапе защищать своим мьютексом.
    Ответ написан
  • OpenVPN на протоколе UDP не видит только отключение клиента в логах?

    @res2001
    Developer, ex-admin
    Используйте в конфиге сервера опцию keepalive. Это заставит OpenVPN отправлять тестовые пинги для проверки соединения.
    https://openvpn.net/community-resources/reference-...
    Ответ написан
    Комментировать
  • Почему массивы в Си заполняются "М"?

    @res2001
    Developer, ex-admin
    Не заполняются они М.
    Если объявляется массив автоматический на стеке без инициализатора, то просто отводится память на стеке (уменьшение/увеличение регистра счетчика стека), никаких "теневых" присваиваний элементам не происходит, элементы массива принимают те значения, которые были в этих ячейках памяти ранее.
    То же самое и с динамическим массивом, только механизам выделения памяти другой.
    По любому адресу в памяти всегда находится какое-то значение, даже если эта память еще не выделена, просто потому что плашка памяти уже вставлена в материнку и на нее подано питание.

    Возможно в вашем случае это и не случайность - вы же не приводите код, которым выделяете память.
    Ответ написан
    7 комментариев
  • Где найти информацию по конфигурации uboot?

    @res2001
    Developer, ex-admin
    У меня был некоторый опыт с uboot, правда для другой ОС

    Если у вас какая-то стандартная покупная плата, то возможно в uboot уже есть готовый config. Обычно производители плат в документации указывают как собрать uboot под их плату (если они поддерживают uboot), либо это можно нагуглить в интернете.
    Если же плата самодельная, то берете самый близкий для вашей платы config (вы же брали за основу какой-то референс дизайн платы, вот эту плату и берите за основу), переименовываете его и вносите в него соответствующие изменения.
    Бывает, что вместе с config'ом требуется вносить изменения и в dts, они в uboot лежат в ./arch/<platform name>/dts. Название используемых dts лежит в переменной CONFIG_DEFAULT_DEVICE_TREE и/или в CONFIG_OF_LIST в config файле.

    Config файл - это просто набор параметров, которые превращаются в набор инструкций #define при сборке.
    С dts все сложнее. Там целый язык описания железа.

    Для сборки uboot рекомендую следующую последовательность:
    1. Заведите для сборки отдельный пустой каталог. Он будет текущим каталогом для всех дальнейших команд
    2. Пусть каталог где лежит сам uboot хранится в переменной UBOOT_DIR. Архитектура процессора вашей платы (например arm) в переменной ARCH. Префикс для кросскомпилятора в CROSS (например arm-linux-gnueabihf-). Имя выбранного defconfig файла в переменной DEFCONFIG (имя указываете вместе с суффиксом _defconfig)
    3. Очистка каталога сборки:
    make -C $UBOOT_DIR ARCH=$ARCH CROSS_COMPILE=$CROSS distclean

    Эта команда пригодится при пересборках в случае изменения конфигурации
    4. Подготовка конфигурации для сборки:
    make -C $UBOOT_DIR ARCH=$ARCH CROSS_COMPILE=$CROSS $DEFCONFIG

    5. Сборка: make -C $UBOOT_DIR ARCH=$ARCH CROSS_COMPILE=$CROSS

    Несколько полезняшек:
    1. Вы можете задавать дополнительную опцию для make: -O <путь>
    Она задает каталог, в котором будет происходить сборка. Этот каталог make создаст сама. Это бывает удобно, если работаете сразу с несколькими конфигами.
    2. В uboot встроен конфигуратор конфигов :) Конфигурация происходит в текстовом режиме с помощью меню, присутствуют подсказки для опций и т.п. Когда вы создали начальную конфигурацию в п.4 выдайте команду:
    make -C $UBOOT_DIR ARCH=$ARCH CROSS_COMPILE=$CROSS menuconfig

    Тут то же можно добавлять опцию -O для выбора каталога с конфигурацией. После исправления конфигурации, не забудьте ее сохранить.
    Дальше нужно дать команду:
    make -C $UBOOT_DIR ARCH=$ARCH CROSS_COMPILE=$CROSS savedefconfig

    Она создаст на основе текущей конфигурации defconfig файл в каталоге сборки. Этот файл можно переименовать в <имя платы>_defconfig и подложить в каталог с конфигами uboot и в дальнейшем использоавть его для сборки.
    3. В каталоге с uboot дайте комаду make help для получения списка возможных опций.
    4. Обычно я собираю uboot под линукс, но та же схема вполне работает и в WSL под виндой. Набор кросс-компиляторов есть в портах (в WSL исопльзовал дистрибутив ubuntu).

    Желаю удачи!
    Ответ написан
    4 комментария
  • Можно ли создать bat файл который будет откатывать изменения?

    @res2001
    Developer, ex-admin
    При чем тут cmd/bat?
    Делайте бэкапы, и восстанавливайте файлы из бэкапов.
    Обычно чем вы создаете бэкапы, тем же инструментом и восстанавливаете.
    Инструментов для бэкапа/восстановления много. В т.ч. можно накропать соответствующие скрипты и на батниках, используя какой-нибудь архиватор.

    Если вы надеялись на простой чудесный способ восстановления без предварительного бэкапа, то такого варианта не существует.
    Ответ написан
    Комментировать
  • Создание файла txt и запись в него C++?

    @res2001
    Developer, ex-admin
    Смотри сначала сюда: https://en.cppreference.com/w/cpp/io/basic_fstream
    Потом сюда: https://en.cppreference.com/w/cpp/io/basic_filebuf/open
    fstream открывает файл по умолчанию (как у тебя) в режиме in|out, а это значит, что если файла не существует, то возникает ошибка (смотри таблицу по второй ссылке). Логика такая, что если ты открываешь файл для чтения (тут не важно, что он открывается еще и для записи) без дополнительных флагов, то файл должен существовать.

    В пару с ifstream, который открывает файл для чтения, существует и ofstream - он открывает файл для записи. При использовании ofstream не существующий файл будет создан (смотри таблицу по второй ссылке).
    Ответ написан
    Комментировать
  • Как раздельно передать сообщения, которые не помешаются в один пакет?

    @res2001
    Developer, ex-admin
    TCP/IP - это набор протоколов, а не только TCP.
    Конкретно протокол TCP - это потоковый протокол, ориентированный на соединение.
    Потоковый - это значит, что данные для вышестоящего уровня, который использует TCP, прядставляются не в виде отдельных пакетов, а в виде потенциально безразмерного потока байтов.
    Так что по TCP вы без труда можете гонять гигабайты, не заморачиваясь на разбиение их по пакетам - TCP сам все разберет на отдельные пакеты, а на принимающей стороне сам все пакеты сложит в поток.
    При этом сохраняется порядок байт, а если что-то потеряется при передаче, то будет повторено еще раз.

    Протокол, который ориентирован на передачу отдельных сообщений (пакетов) - UDP. Он то же входит в набор протоколов TCP/IP.
    Ответ написан
    Комментировать
  • Высвободится ли память,если использовать метод clear() у vector,который был заполнен структурами?

    @res2001
    Developer, ex-admin
    В С++ структура это практически то же самое что и класс.
    Реализуйте в структуре деструктор, в котором будет освобождаться память под name. При удалении элементов в векторе (clear), для каждого существующего элемента будет вызван деструктор.
    Ответ написан
    Комментировать
  • Как создать задачу в планировщике заданий через консоль?

    @res2001
    Developer, ex-admin
    schtasks /?
    Ответ написан
    Комментировать
  • Как найти в строке слова-палиндромы?

    @res2001
    Developer, ex-admin
    Проблема в том, что word у вас массив двойных указателей (**). Тогда как strtok возвращает обычный указатель.
    Из-за этого тут
    if(word[x] != word[y])
    вы сравниваете 2 указателя, а не 2 символа.

    Вообще я бы убрал массив word в принципе. Вы сразу можете вызывать polyndrome после того как нашли очередное слово.
    Ответ написан
    Комментировать
  • Можно-ли отправить внешний ip адрес на e-mail через bat скрипт?

    @res2001
    Developer, ex-admin
    Можно.
    Только сначала требуется узнать этот внешний адрес, а затем отправить его по почте.
    Обе эти задачи средствами которые есть в cmd по умолчанию не решить.
    Но если использовать не cmd, а WSH (то же есть в винде по умолчанию, JScript/VBS) или posh, то это облегчит задачу и уже можно будет ее решить не прибегая к сторонним инструментам.
    Ответ написан
    Комментировать
  • Почему выходит синтаксическая ошибка в команде?

    @res2001
    Developer, ex-admin
    Напишите команду start сразу после do.
    Или можно завернуть start в круглые скобки. Открывающая круглая скобка должна быть после do в той же строке.
    Т.е. for вместе с телом цикла - это одна команда для cmd и она должна быть на одной строке. Круглые скобки позволяют обойти это ограничение.
    Ответ написан
    2 комментария
  • NETBIOS и WINS на Android без домена?

    @res2001
    Developer, ex-admin
    Не стоит связываться с netbios именами, используйте DNS - это надежно, понятно и управляемо, в отличии от netbios, который "вещь в себе".
    Ответ написан
    Комментировать