• Как сделать сервер маршрутизации?

    @res2001
    Александр Маджугин, К сожалению не силен в iptables, не подскажу как тут правильно поднять NAT.
    Но причем тут "внешний адрес сервера VPS"?
    Вы должны поднять NAT на интерфейсе foritvps, а там какой-то свой адрес используемый внутри fortivpn.
  • Как сделать сервер маршрутизации?

    @res2001
    Александр Маджугин, Раз без openvpn ваш VPS ходит к gitlab успешно, то как минимум нужный маршрут прописан.
    Но этого мало. Т.к. сеть за fortivps сервером ничего не знает о ваших адресах, то ответы будут где-то теряться. Вам нужно настроить NAT на интерфейсе fortivps, тогда в сеть gitlab вы будете попадать с адресом, полученным при подключении к fortivps.
    Когда вы ходите к gitlab без openvpn, то используется адрес интерфейса fortivps. Благодаря NAT можно получить тот же эффект и для удаленных компьютеров.
    И в конце надо добавить маршрут на вашем компе к сети gitlab через openvpn сервер. Это делается опцией push route в конфиге openvpn сервера.
  • Как перенести стандартные пути конфигурационных файлов NeoVim'а в корневую директорию?

    @res2001
    Пишут переменная окружения XDG_CONFIG_HOME указывает на каталог с конфигом: $XDG_CONFIG_HOME/nvim
    Правда это в линуксе.
    https://thevaluable.dev/vim-runtime-guide-example/
  • Как сделать сервер маршрутизации?

    @res2001
    Приведите схему сети, с указанием внутренних IP адресов, белые адреса можете как-нибудь "переименовать". И кратким описанием того что каждый узел должен делать. Схему можете хоть на бумажке от руки нарисовать и сфотографировать, главное чтоб понятно было.
    Вы тут требуете конкретики, какие маршруты прописывать. А сами никакой конкретики не даете. Распечатка ifconfig для одного какого-то хоста малоинформативна.
    Дополнительно можно привести конфиг openvpn сервера.
  • Как правильно компилировать на с++?

    @res2001
    Как все тут писали эта dll не часть MSVS, это часть микрософтовской реализации языков С/С++. Это libc.so и libstdc++.so если проводить аналогии с линуксом, в них содержатся, например реализации cin/cout и printf и вся стандартная библиотека.
    Программу с библиотеками можно линковать динамически (как сейчас), или статически. У каждого варианта есть плюсы и минусы. Вариант линковки задается опциями компилятора. При динамической линковке ты сам должен позаботится о том, что бы на компе, где будет исполняться твоя программа были все необходимые библиотеки. При статической линковке библиотеки содержатся в самом исполняемом файле, при этом твой "хело ворд" будет размером в несколько мегабайт.
    Микрософт свой рантайм распространяет в виде отдельного установщика, где-то в недрах MSVS должен лежать этот установщик или его можно скачать с сайта микрософт.
  • Перенос системы на другой ПК по сети?

    @res2001
    Практически любой софт, снимающий образ с диска умеет писать этот образ на сетевые диски.
    Сетевым диском может выступать, например, диск на винде куда вы будете впоследствии устанавливать этот образ. Но в этом случае это должен быть второй диск, т.к. первый будет использован при записи образа.
  • Открыл bat файл и компьютер висит, что делать?

    @res2001
    Yrgaaa, Оперативка перезагрузиться не может сама по себе, только вместе со всем компом.
    Хорошо бы увидеть батник.
    Если он "бесконечно создавал текстовые файлы" - мог забиться диск. Винда вполне может вести себя неадекватно, если места на загрузочном диске нет.
    Можно попробовать загрузиться с загрузочной флешки и посмотреть что там батник сделал с диском.
    Или если винда хоть как-то загружается, попробовать запустить cmd.exe и из консоли командами исследовать диск, там же можно и удалить весь созданный батником хлам.
  • Почему fopen устанавливает ошибку Invalid argument в errno при fopen в режиме r+ после w и fopen в режиме w+ после r?

    @res2001
    Qubc, Я бы даже сказал - важно всегда проверять возвращаемые значения системных функций (и библиотечных). Исключениями тут могут быть разве что функции типа close, т.к. обычно все равно сделать ничего нельзя и не нужно.

    Я так понимаю, что при r+ и пустом файле хоть ошибка в errno выставляется, но файл все равно открыт (pFile != NULL)?
  • Почему fopen устанавливает ошибку Invalid argument в errno при fopen в режиме r+ после w и fopen в режиме w+ после r?

    @res2001
    Qubc, А w+?
    Вроде r+ сразу что-то пытается прочитать, возможно потому что файл пустой ошибка. Сделайте файл не пустым.
  • Почему fopen устанавливает ошибку Invalid argument в errno при fopen в режиме r+ после w и fopen в режиме w+ после r?

    @res2001
    Qubc, Не то. Буквально errno = 0;
    Когда pFile уже закрыт, то вызывать для него clearerr - вообще смысла нет - он вернет ошибку. И clearerr сбрасывает флаги ошибок файла, а не errno.
  • Как лучше вносить изменения в стороннюю библиотеку С?

    @res2001
    kriptonus, А вы на линуксе собираетесь libmodbus использовать?
  • Как лучше вносить изменения в стороннюю библиотеку С?

    @res2001
    kriptonus, Т.е. вам нужно адаптировать библиотеку под железо. Обычно в таких случаях в библиотеках выделяют уровень абстракции железа (HAL или OSAL обычно называется). Часто он идет как отдельная низкоуровневая библиотека в зависимостях основной библиотеки. Как правило это достаточно не большой API, который надо реализовать и который будет использовать библиотека верхнего уровня. Часто можно взять уже готовые похожие реализации и адаптировать их под себя.
    Не знаю, есть ли в libmodbus свой HAL или получится с CTS. На сколько знаю, CTS часто используют для целей управления потоком приема/передачи в полудуплексном RS485.
  • Как лучше вносить изменения в стороннюю библиотеку С?

    @res2001
    kriptonus,
    переключать преобразователь в режим приема/передачи

    Преобразователь это же ведомое устройство в modbus? А ваша программа, видимо выступает как контроллер?
    Тогда вы должны с помощью библиотеки отправить на ведомое устройство некий пакет с конфигурацией. Я не в курсе, как там это в modbus конкретно работает, не имел с ним дела.
    Универсальная библиотека в принципе не может обеспечить работу со всей массой устройств, поддерживающих modbus. Библиотека, видимо, реализует только низкоуровневый протокол обмена, который описан в каком-то стандарте. А верхний уровень вы должны реализовать в вашем приложении. Для этого не нужно изменять библиотеку.

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

    @res2001
    наименование столбцов не однообразны

    Наименования столбцов роли не играет.
    Играет роль структура. Она должна быть одинаковая, т.е. одни и те же данные должны находится в одних и тех же местах в разных таблицах. Если это список (таблица), то он должен начинаться в определенном месте и колонки должны быть в строго заданном порядке.
    Если структуру не привести к одному виду, то придется писать для каждого варианта размещения свою загрузку и т.п.
    Или же должен быть некий формализованный алгоритм (который можно запрограммировать) по которому можно найти интересующие вас данные в каждой из этих тысяч таблиц.

    Ексел поддерживает встроенные скрипты на VBA, так что поиск по другим таблицам можно реализовать скриптом.
    Или настроить связи с другими таблицами. Но связи придется, видимо, делать вручную, а это несколько тысяч связей ...
  • Почему поведение fscanf ( stdin, "%c", &c ) различается при чтении EOF в msvc и gcc?

    @res2001
    Qubc, Кстати, есть еще одно отличие - в возвращаемых значениях.
    В версии MSVC при Ctrl-Z fscanf возвращает 0, а в gcc - -1.

    Ctrl-Z - это не настоящий EOF, в интернетах называют его "мягкий EOF".
    И он не вызывает закрытие потока, как должно быть при настоящем EOF, после которого любое последующее чтение должно вызывать ошибку.

    Вы какой gcc использовали? Дело ведь происходит под виндой.
    Я потестил на mingw-w64, поведение такое же как вы описываете.
    Но mingw использует стандартную библиотеку от MSVC. Так что есть вероятность, что в обоих случаях виновата микрософт :) Видимо просто разные версии стандартной библиотеки.
    Посмотрел по зависимостям исполняемого файла. В версии от gcc похоже используется fscanf из msvcrt.dll, а в версии от msvc эта библиотека не используется, похоже там вместо fscanf вызывается что-то другое, т.к. символа fscanf я в зависимостях не обнаружил. Но может быть просто плохо искал :)
  • Почему поведение fscanf ( stdin, "%c", &c ) различается при чтении EOF в msvc и gcc?

    @res2001
    Ctrl-Z не вызывает закрытие потока.
    Ctrl-Z - это обычный символ с кодом 26, просто обрабатывается специфически, обработка, видимо, зашита в стандартной библиотеке.
  • Почему поведение fscanf ( stdin, "%c", &c ) различается при чтении EOF в msvc и gcc?

    @res2001
    Детали реализации :)
    Не уверен, что поведение как-то стандартизовано.
    В линуксе, например, совсем другое поведение в терминале на Ctrl-Z - процесс уходит в спячку.
  • Почему вылетает исключение при удалении объекта?

    @res2001
    Dyikot,
    если не использовать интерфейс то ошибки нету

    Ну да, точно! Вы нашли ошибку.
    У вас же указатель приводится к типу интерфейса, а указатель на интерфейс не обязан совпадать по значению с указателем на реальный объект.
    Удаляйте items не внутри UseContainer, а там же где его создаете. При выделении памяти сохраняйте оригинальный указатель (на объект, а не на интерфейс) и его используйте в delete.
    Или смотрите ответ maaGames
  • Как через cmd закрыть процесс по названию загловка в win 2019?

    @res2001
    metalexs, taskkill вполне рабочий вариант. Но фиг знает как там фильтровать по WINDOWTITLE, состоящему из нескольких слов и т.п.

    Но можно делать по другому, фильтровать в tasklist по IMAGENAME (название исполняемого файла) с ключом /v (будет выводить и WINDOWTITLE), а затем в конвеере навешивать фильтр с помощью findstr:
    tasklist /FO table /V /FI "IMAGENAME eq prog.exe" | findstr "Window title"

    Всю эту конструкцию завернуть в цикл for /f, чтоб вытащить PID процесса и уже по PIDу убивать процесс с помощью taskkill.