Задать вопрос
  • Как проверять существование файла C++?

    @res2001
    Developer, ex-admin
    В C++17 есть std::filesystem::exists.
    В более ранних версиях C++ можно после открытия сразу перейти в конец файла и посмотреть текущую позицию. Если позиция 0, то файл либо был пустой при открытии, либо вновь только что созданнался. После этого надо опять вернуться на начало файла.
    Вместо ofstream можно использовать функцию std::fopen, там можно с помощью параметра mode запретить открывать не существующий файл. Если функция вернет пустой FILE*, то либо файл не существует, либо произошла другая ошибка. Можно дальше проанализировать значение переменной errno, чтоб отделить ситуацию отсутствия файла от других возможных ошибок, но это уже платформозависимо.

    Так же можно использовать API ОС для проверки существования файла. В линукс - stat(..).
    Ответ написан
    Комментировать
  • Мало памяти на компьютере. Что делать?

    @res2001
    Developer, ex-admin
    Если есть USB3.0 (синие разъемы), то можно купить внешний HDD/SSD с подключением USB3.0 и установить на него ОС. Или как вариант перенести на внешний диск пользовательский профиль.
    Правда тут другие проблемы могут быть - USB устройства могут отключаться прямо во время работы. Для борьбы с этим можно подключить и залить пластиком разъемы, сам диск жестко закрепить с ноутом. Чтоб не было возможности отсоединить диск или поменять порт диска. Это уменьшит вероятность отключения, но 100% гарантии все равно не даст.
    Ответ написан
  • Как вывести динамический массив внутри синхронизированного потока?

    @res2001
    Developer, ex-admin
    В addv и delv в блоке else вы разблокируете мьютекс и дальше он у вас все время в разблокированном состоянии.
    Так что никакой синхронизации не происходит в принципе.
    Вам не нужно разблокировать мьютекс, просто вместо usleep используйте pthread_cond_timedwait. Внутри этой функции мьютекс неявно разблокируется, потом ждет наступление события (сигнал или таймаут), затем мьютекс снова захватывается и только после этого возвращается управление вызывающему коду.
    Аналогично работает и pthread_cond_wait, только без таймаута.
    В этом случае блок if следует переписать так что бы не было двойного вызова pthread_cond_wait.

    Не увидел в коде где вы инициализируете мьютекс и условную переменную, а так же где вы их удаляете. Без инициализации все функции их использующие будет возвращать ошибки.

    Нужно ВСЕГДА обрабатывать возвращаемые значения системных функций!

    Почему вы потоки используете из std, а мьютекс и условную переменную из pthread? Где логика?
    Ответ написан
    Комментировать
  • Как пройти ошибку в bat файле при присвоении имени файлам?

    @res2001
    Developer, ex-admin
    У вас там ожидалось только имя файла, а вставляется полный путь к файлу, поэтому и ошибка.
    Вот это место в команде "part-^%03d.mp4".
    Замените на "%%~ni.mp4"
    Ответ написан
    6 комментариев
  • Как собрать проект написанные QT в linux?

    @res2001
    Developer, ex-admin
    Принцип тот же, только, обычно, зависимые библиотеки не таскаются вместе с программой, а устанавливаются как зависимости в общие каталоги (/usr/lib и т.п.).
    Создается пакет для используемого в конкретном дистрибутиве пакетного менеджера, по правилам этого пакетного менеджера. В пакете описываются зависимости и при установке вашего софта, зависимости так же будут установлены, если, конечно, они существуют как пакеты в репозиториях дистрибутива.
    Для своего софта можно сделать и поддерживать собственный репозиторий, который можно добавить в пакетный менеджер, или добиться включения в родной репозиторий дистрибутива, или распространять пакет каким-то другим образом (его можно поставить в ручном режиме с помощью того же пакетного менеджера, указав файл пакета).
    Так же возможно распространять ПО в исходниках и пусть каждый желающий сам собирает, в readme описать все зависимости и как их установить в наиболее популярные дистрибутивы. Кстати в исходниках вместе со сборкой софта, вполне возможно сразу собирать пакет для используемого пакетного менеджера. В установке с помощью пакетного менеджера есть преимущества перед установкой с помощью make && make install
    Ответ написан
    Комментировать
  • Как решить проблему потерь пакетов при пробросе порта на tcp server?

    @res2001
    Developer, ex-admin
    что может влиять?

    Много факторов: медленная/высокая скорость на одном из портов и/или не достаточная длина буфера, большая загрузка ЦП во время работы (причем он может быть загружен любой не связанной задачей), плохое качество связи по сети, что приводит к повторной передаче и тормозит текущую передачу, что приводит к переполнению буферов и т.п.
    Учитывая, что в TCP данные не могут теряться, значит они теряются либо по дороге в nc, либо внутри nc.
    Если в nc есть возможность поиграть с размерами буферов - поэкспериментируйте с ними. Но часто универсальные решения не являются оптимальными для конкретной задачи.
    Ответ написан
  • Как правильно передавать функцию в качестве параметра?

    @res2001
    Developer, ex-admin
    Оба варианта правильные. Имя функции это и есть указатель на функцию, так что sizeof(foo) == sizeof(&foo). По сути тут компилятор просто игнорирует операцию взятия адреса от функции.
    Вся функция никогда не передается - только указатель.

    Я бы предпочел второй вариант, т.к. тут явно указано, что надо передавать указатель на функцию.
    На самом деле тип указателя на функцию я бы оформил через typedef, и в параметре указывал бы уже имя типа:
    typedef void (*foo_t)();
    void fooPrint(foo_t foo) {
        foo();
    }
    Ответ написан
    4 комментария
  • Как переместить информацию в другой диск?

    @res2001
    Developer, ex-admin
    Для стандартных пользовательских папок, типа Документы, Загрузки, ... в свойствах есть закладка "Расположение". Тут можно указать расположение папки на диске D, и перенести в новое расположение все содержимое предыдущего каталога. Конечно у пользователя должны быть права на папку в новом расположении.

    Вместо переноса папок по отдельности, можно перенести весь каталог с профилем пользователя на диск D: Это удобно, т.к. помимо прочего и временный каталог, и кэш браузера, и прочие User AppData перенесутся то же.
    Процедуру переноса описывал тут уже несколько раз тут или тут или там.
    Я обычно это делаю сразу после установки винды, пока профиль еще чистый. Но и с не пустым профилем это вполне реально сделать.
    Ответ написан
    Комментировать
  • Как правильно записать в файл?

    @res2001
    Developer, ex-admin
    Для вывода в файл следует использовать объект ofstream. ifstream предназначен для чтения из файла.
    Для выравнивания, форматирования и т.п. смотрите модификаторы ввода/вывода: https://en.cppreference.com/w/cpp/io/manip
    Ответ написан
    Комментировать
  • Как узнать диапазон сетей?

    @res2001
    Developer, ex-admin
    172.29.0.0 - это адрес подсети с маской 16 (255.255.0.0).
    Для сети из 30 узлов достаточно сети с маской 27 (225.225.225.224). n=5 - полагаю это как раз про маску.
    Но в классовой маршрутизации маски не использовались, так что ее задание довольно странно.
    Если задают маску (хоть в каком виде), то значит это уже бесклассовая маршрутизация, а следовательно бессмысленно говорить о сети класса В (и любого другого класса).

    Чтоб узнать адрес 27ой сети, нужно знать фактический адрес узла. В задании его нет. Имея адрес узла, можно наложить на него маску (с помощью битовой операции И) и получить адрес сети.

    Можно порассуждать и например взять произвольный адрес в заданной сети класса В. Например возьмем адрес: 172.29.35.136.
    172.29.35.136 AND 255.255.255.224 => 172.29.35.128 - это адрес сети для узла 172.29.35.136 с маской 255.255.255.224. При этом диапазон адресов в этой сети: 172.29.35.128 - 172.29.35.159. Ёмкость сети - 32 узла. Наш узел 172.29.35.136 входит в этот диапазон.
    Чтоб лучше понять, рекомендую использовать калькулятор в режиме "программиста" и смотреть представление цифр в маске и адресах в двоичном виде.
    Ответ написан
    Комментировать
  • Из-за чего может плавать скорость по wi fi от 1 до 7 мбит?

    @res2001
    Developer, ex-admin
    При загрузке

    Откуда грузите?
    Если из интернета, то виновником может быть сервер откуда вы грузите. А так же любой промежуточный узел по маршруту следования пакетов. То что вам обещает провайдер в договоре - это скорость на "последней миле", т.е. от оборудования провайдера до вашего роутера. Ваш провайдер не может гарантировать такую же скорость до любого сервера в интернет.
    Ответ написан
    Комментировать
  • Как в cmake слинковать статично одну библиотеку?

    @res2001
    Developer, ex-admin
    Я обычно библиотеки подключаю, используя pkg_check_modules.
    Эта функция ищет и динамические и статические библиотеки, используя pkg-config.
    Для статических библиотек возвращается свой набор переменных с префиксом <PREFIX>_STATIC. Для подключения статической библиотеки используйте эти переменные.
    Ответ написан
    Комментировать
  • Можно ли управлять всей программой с помощью скриптового языка?

    @res2001
    Developer, ex-admin
    Так же lua (как и другие скриптовые языки) можно встраивать в собственное приложение.
    Оба варианта имеют место быть, вопрос лишь в том кто главный и кто рулит тут всем.
    При использовании подхода из ответа shurshur главный - интерпретатор скриптового языка (и твое приложение, написанное на этом языке), а твоя С/С++ библиотека - один из модулей используемых скриптом.
    При встраивании главное твое приложение, которое может вызывать скрипты для каких-то своих целей. Скрипты могут использовать объекты твоей программы, для которых ты разрешил это действие.
    Выбор реализации во многом зависит от того, что хочется получить в итоге.
    Ответ написан
    Комментировать
  • Как вернуть первые N максимальных элементов из массива без сортировки массива?

    @res2001
    Developer, ex-admin
    Вместо сортировки можно использовать алгоритм выборки k-той статистики (quik select).
    Алгоритм не полностью сортирует массив, а только те элементы, которые необходимо для получения k-ой статистики. Для вашей задачи алгоритм надо вызывать N раз (с параметром от 1 до N).
    Чтоб не портить оригинальный массив можно сделать копию, содержащую ссылки на элементы оригинального массива и вызывать алгоритм на копии.

    Если N относительно не большое и массив не велик, то можно просто искать максимум N раз. При нахождении очередного максимума заменять значение элемента на минимально возможное и сохранять ссылку на измененный элемент. После нахождения всех N максимумов - восстанавливать значения в массиве.
    Ответ написан
    3 комментария
  • По какой причине несовместимость библиотек?

    @res2001
    Developer, ex-admin
    Тут скорее причина не в "несовместимости", а в "cannot find -lcpprest: No such file or directory"
    Проверьте существует ли библиотека по указанному пути. Скорее всего ее нет.
    Надо разобраться почему ее нет. Я так понимаю, она должна собраться вместе со всем остальным.
    Может не хватает каких-то ключей для сборки и т.п.

    При сборке включите режим verbose и проверьте весь вывод make, есть ли там упоминание о сборке libcpprest.a
    Ответ написан
  • Как получить дату -3 дня?

    @res2001
    Developer, ex-admin
    Батники не умеют работать с датами. Все переменные там - строки.
    Вы можете вручную разделить дату на составные части и вычислить -3 дня.
    Так же можно написать вспомогательный скрипт на JS/VBS, которые умеют работать с датами. В скрипт передавать дату и он будет вычислять -3 дня и выводить ее в stdout, где батником можно эту дату прочитать.
    Или же вы можете использовать powershell вместо cmd, там, наверняка, можно решить вашу задачу без лишних телодвижений.

    Но вам же для чего-то нужна дата "-3 дня". Если знать для чего вы пытаетесь вычислить такую дату, то может найдутся и другие способы ее решения, без вычисления.
    Ответ написан
    9 комментариев
  • Подключение по VPN к RDP: почему не работает?

    @res2001
    Developer, ex-admin
    Подсоединяюсь по VPN в локальную сеть, все ок

    Как вы подсоединяетесь в локальную сеть? Как вы видите, что все Ок?
    Пинги с ВПН клиента до любого компьютера в сети идут? Подозреваю, что пинги не идут.

    Скорее всего вам надо на ВПН клиенте добавить маршрут до сети за ВПН сервером через ВПН адрес маршрутизатора.
    Делается это командой: route add ...
    Для справки смотрите route /?

    Cогласен с Сергей - фаервол может блокировать трафик. Причем фаервол на любом промежуточном узел, а у вас их 3: ВПН клиент, ВПН сервер, RDP сервер. Любой из 3 фаерволов может блокировать трафик.

    Антивирус скорее всего не при делах.

    Прежде чем добиваться работы RDP рекомендую добиться, что бы работал пинг на внутренние адреса в локальной сети. Кроме того антивирус на пинги не влияет, хотя фаервол может блокировать и их.
    Ответ написан
  • Как грамотно это сделать? Сравнение файлов?

    @res2001
    Developer, ex-admin
    Вычислять offset

    Вычислять ничего не нужно. Сравнивайте по символьно, не используя strcmp (или memcmp) и offsetом у вас будет текущий индекс. Кроме того для текстового варианта вам не нужен "глобальный" offset, т.к. вы будете сравнивать построчно. Т.е. offset только внутри данной конкретной строки.
    Для бинарного сравнения - все то же самое, но offset будет глобальный, тут уже сиволы CR и LF роли не играют.
    Имейте ввиду, что в винде перевод строки это CRLF (0x0D 0x0A), а в никсах LF (0x0A)
    Ответ написан
    Комментировать
  • Как запустить exe через cmd?

    @res2001
    Developer, ex-admin
    Вроде cmd не поддерживает URL.
    Попробуйте использовать start для запуска. start /?
    Можно подключить шару, затем запустить программу, после завершения программы отключить шару.
    net use /?
    Ответ написан
    Комментировать
  • Сервер-клиент openvpn win не видят за собой локальную сеть. как исправить?

    @res2001
    Developer, ex-admin
    Подключение ВПН на клиенте и сервере создает дополнительный виртуальный сетевой адаптер со своим IP адресом. Программное обеспечение ВПН отвечает только за трафик, который попадает внутрь ВПН. Все остальное конфигурируется стандартными средствами: таблицы маршрутизации, фаерволы, NAT. В openvpn некоторые настройки таблиц маршрутизации можно (нужно) указывать в конфиге ВПН, а не напрямую править таблицы в ОС. Все это относится к любой ОС - принципы работы openvpn одинаковы в линукс и винде.

    Обычно конфиг клиента делают максимально "легким". Там указывают только необходимые опции для подключения к серверу (протокол, адрес и порт сервера, параметры шифрования и логирования). Все что касается маршрутизации между сетями (route, push route) убирается в конфиг сервера.
    Опция push "route ..." - добавляет маршрут на удаленной стороне. Т.е. если опция указана в конфиге сервера, то маршрут добавляется на стороне клиента.
    Для добавления маршрута на стороне сервера в конфиге сервера используется опция: route

    CCD файлы:
    У вас не правильный синтаксис для опции ifconfig-push.
    Правильный такой: ifconfig-push client_ip mask
    Т.е. IP сервера не требуется указывать.
    В опции iroute указываем сети за этим конкретным клиентом. Эти маршруты добавятся в таблицу маршрутизации сервера при подключении клиента. Не нужно дублировать эти маршруты опциями route в основном конфиге сервера.
    Так же можно в CCD файле указать опцию push route для добавления маршрута клиенту для сети за сервером. Обычно push route указывают в основном конфиге сервера и она работает для всех клиентов.

    Но! Что бы сети за клиентом и сервером могли друг друга видеть они должны знать по каким маршрутам передавать трафик друг для друга. Если ВПН сервер и ВПН клиент являются для своих сетей шлюзами по умолчанию - то проблемы нет, компы внутри сетей и так будут слать весь трафик через них. Но если ВПН сервер и/или ВПН клиент не являются шлюзами по умолчанию для своих сетей, то требуется добавить дополнительные маршурты для соседних сетей через ВПН сервер/клиент. Централизованно маршруты можно добавить через опции DHCP, возможно политиками AD.

    Фаерволы на любом узле могут блокировать трафик. Для отладки взаимодействия сетей через ВПН рекомендую сначала отключить фаерволы на всех тестовых устройствах. После того как настроите маршрутизацию фаерволы включайте по одному, сразу проверяйте работу и вносите изменения в правила фаервола, если необходимо.

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