• Как проверить переменную любого ссылочного типа на null?

    @res2001
    Developer, ex-admin
    По стандарту ссылка не может указывать на несуществующий объект (NULL), поэтому, если вы сделаете так:
    if (&refTypeParam == null)
    Компилятор запросто может выкинуть этот код в процессе оптимизации, т.к. условие по стандарту никогда не выполнится.
    Вещи типа этой:
    int &v = *(int*)NULL;
    это неопределенное поведение по стандарту. Но на сколько я знаю, такое вполне прокатывает.
    https://stackoverflow.com/questions/4364536/is-nul...
    Ответ написан
    1 комментарий
  • Как реализовать обмен сообщениями между программами, где текст сообщения берется из txt-документа?

    @res2001
    Developer, ex-admin
    Если одна из программ потомок другой - используйте неименованные каналы.
    Если обе программы работают не зависимо друг от друга (не предок и потомок) используйте именованные каналы или unix socket (если платформа никсы).
    Если программы должны работать на разных компах (могут работать и на одном при этом) используйте сокеты.

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

    @res2001
    Developer, ex-admin
    А какая у вас альтернатива?
    Вы можете реализовать весь функционал в своей программе без использования внешнего ПО за вменяемое время?
    Если да - реализуйте, это, конечно, будет лучше.
    Но обычно подобный сложный функционал реализуется в динамических библиотеках. Программы, типа lowrite используют этот функционал. Вы то же можете использовать библиотеку, а не запускать внешнее ПО. Но это, конечно, гораздо сложнее и на это может уйти много времени.
    От установки .net вы можете отказаться, только используя ЯП не связанные с .net.
    lowrite возможно содержиться в других пакетах, более мелких, которые ставятся вместе с libre office, а библиотеки, которые он использует может находится в третьем пакете.
    Ответ написан
    Комментировать
  • Что нужно для защиты локальной сети банка?

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

    Иногда бывает, что некоторые сегменты сети физически отделены от интернет, т.е. используется отдельная кабельная сеть и отдельные коммутаторы никак не связанные с интернет ни через шлюз ни через что-то другое.

    С удаленными офисами связь предпочтительно делать не через интернет, а на базе какого-то оператора связи (или нескольких) формировать собственную корпоративную сеть. Трафик в такой сети передается через ВПН в шифрованном виде. Если какие-то удаленные офисы невозможно подключить к корпоративной сети, то используют интернет + ВПН. ВПН по уму должен строится с использованием сертифицированных средств.

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

    @res2001
    Developer, ex-admin
    или я что то не так понял

    Именно.
    Вы выбрали асинихронный инструмент, не понимая как он работает.
    ioc.run() - запускает цикл обработки асинхроных событий (event loop). Когда он завершается, то вы не сможете уже что-либо получать/передавать.
    Ваша задача добавить нужный вам код в обработчики событий (функции on_xxx()). Как это правильно делать смотрите документацию по библиотеке и возможно другие примеры использования.

    Я никогда не использовал boost.beast и WebSocket, но некоторый опыт асинхронного программирования есть, а принципы асинхронного программирования в любых библиотеках одни и те же.
    Ответ написан
    Комментировать
  • Многострочный литерал C++ u8"один"sv u8"два"sv: что можно убрать?

    @res2001
    Developer, ex-admin
    u8 говорит о том, что строка в кавычках будет в кодировке UTF8: https://en.cppreference.com/w/cpp/language/string_...
    sv - преобразует строку в string_view: https://en.cppreference.com/w/cpp/string/basic_str...
    А нужно оно или нет - решать вам, в зависимости от контекста.
    Ответ написан
  • Как оптимизировать мой код?

    @res2001
    Developer, ex-admin
    В свое время оптимизировал нечто похожее на Windows API. Там просто выводил все в контекст в памяти, а затем копировал этот контекст в контекст устройства вывода (окно). Думаю что-то подобное можно соорудить и в SFML.
    Так же может поможет другой подход - отключение отрисовки и включение ее после того как все будет нарисовано.
    С SFML никогда дела не имел, просто это достаточно общие подходы, на мой взгляд.
    Ответ написан
    Комментировать
  • Как отсортировать повторяющиеся строки на языке СИ?

    @res2001
    Developer, ex-admin
    Проходите по списку и выводе все строки где дата равна указанной. Все.
    Зачем тут сортировка?

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

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

    @res2001
    Developer, ex-admin
    Питон так же используется для подобной схемы. Например в Танках, если не ошибаюсь, его используют.
    В браузерах и node.js используется JS - схема аналогичная.
    В Far manager - Lua.
    Ответ написан
    Комментировать
  • Проблема с двусвязным списком?

    @res2001
    Developer, ex-admin
    В del_node() происходит освобождение памяти, а затем в result вы обращаетесь к освобожденной памяти (второй цикл):
    p = p->next;
    Зачем в result первый цикл? И зачем в программе z?
    Ответ написан
    Комментировать
  • Возможно ли развернуть две одинаковых базы на одном сервере?

    @res2001
    Developer, ex-admin
    Переименуйте файл, сделайте attach, дайте другое имя базе.
    Ответ написан
  • Где здесь путаница?

    @res2001
    Developer, ex-admin
    Зачем это
    r[j] = '\0';
    в цикле? Вынесите из цикла.
    Путаницу в куче я вижу только в том смысле, что памяти выделяется больше, чем нужно. Можно этот момент подрихтовать.
    Сам цикл я бы реализовал немного по другому - так чтобы в одной итерации цикла добавлялись сразу 2 символа из строки и один symbol. В этом случае нужно будет еще обработать оставшийся хвост, если количество символов не четное.

    Добавлено: Проглядел отсутствие освобождения памяти. Оно необходимо, конечно.
    Ответ написан
  • С: Объясните, что не так?

    @res2001
    Developer, ex-admin
    Возможно он хочет увидеть что-то типа этого:
    puts(sort_string(word));
    Но это блаж какая-то.
    Кроме того в sort_string возможна ошибка выделения памяти (которую вы не обрабатываете) и передавать так, без обработки ошибок ... плохо.
    Ответ написан
  • Какие книги по C++ актуальны на 21 год для обучения с нуля?

    @res2001
    Developer, ex-admin
    Для начала берите любую книгу для начинающих. Лафоре подойдет. Берите издание по свежее. Есть и другие книги подобного рода, конечно.
    Страуструп тяжел и не годится для старта.
    Саттер, Мейерс больше для продвинутых.
    C++ Templates для старта точно не нужен.
    Так же не плохо было бы начать что-то читать по алгоритмам.

    Сейчас проблема с изучением С++ в том, что с 2011 года начали регулярно появляться новые стандарты, в них появляются фишки, которых раньше не было, некоторые из них очень полезные. Толстые учебники не успевают переписываться под актуальные стандарты. Но это не большая беда.
    Базовым сейчас является стандарт С++11 (или С++14 - это дополнение к С++11), его применяют уже многие. Более поздние (17, 20) применяются реже, так что можно не гнаться за тем, чтобы в книге они были освещены. Базовые понятия в С++ в целом мало изменились с древних времен. Но кое-что добавилось.
    Кстати, проблема с поддержкой новых стандартов актуальна не только для книг, но и для компиляторов языка.
    После освоения базы и начала практической деятельности сможете дальше продвигаться в изучении языка, ориентируясь на свои реальные потребности.
    Главное в изучении - больше практики - не зацикливайтесь на книгах. В начале старайтесь делать задания из книг. Когда более-менее освоитесь, переходите к своим задачам/интересам.
    Ответ написан
    1 комментарий
  • Как правильно получить ввод строки от пользователя в Cи?

    @res2001
    Developer, ex-admin
    В scanf_s при задании ввода строки, нужно указывать, кроме адреса буфера еще и реальный размер буфера в параметрах. Смотрите пример использования тут: https://en.cppreference.com/w/c/io/fscanf
    Обычный scanf считается не безопасным, и не без оснований, конечно. Поэтому его использование не рекомендуется, о чем в сообщении и пишут. Но это можно обойти, как именно, написано в том же сообщении. Правда задание _CRT_SECURE_NO_WARNINGS влияет не только на использование scanf, но и на пачку других функций.
    Определять #define _CRT_SECURE_NO_WARNINGS нужно до включения любых заголовков стандартной библиотеки. Что бы это определение на них подействовало. Проще всего это сделать в параметрах командной строки компилятора с помощью опции -D_CRT_SECURE_NO_WARNINGS
    Ответ написан
    1 комментарий
  • Как из аналогового сигнала получить вольты?

    @res2001
    Developer, ex-admin
    Не знаю как там в ардуинах, но ...
    Думаю, что аналоговый сигнал подается на АЦП и в программе вы имеете дело уже с дискретным (оцифрованным) сигналом.
    Так вот, в АЦП, обычно существует пара коэффициентов (смещение нуля и масштаб), в документации к АЦП приводится формула как использовать эти коэффициенты с цифровым отсчетом сигнала, что бы получить вольты (кстати, АЦП не обязательно меряет именно напряжение). Обычно формула это что-то вроде: (X + offset)*scale. Но могут быть и другие варианты.
    Коэффициенты на всех АЦП разные. Даже на двух одинаковых АЦП они могут быть разные (и как правило они разные). АЦП калибруются на заводе и коэффициенты зашиваются в чип. В документации к АЦП должен быть описан способ получения этих коэффициентов. Если АЦП многоканальное, то коэффициенты могут быть разными для каждого канала.
    В библиотеке работы с АЦП, обычно присутствуют функции получения калибровочных коэффициентов и может быть даже получение уже преобразованного сигнала.

    Вообще если бы АЦП было идеальным, то преобразовать цифровой отсчет в вольты было бы просто. Например АЦП выдает 16 битные без знаковые отсчеты (т.е. на выходе АЦП числа от 0 до 65535, тип данных uint16_t), диапазон измерений допустим [-5; +5]В. Пусть uint16_t Х - цифровой отсчет, полученный от АЦП, тогда преобразовать его в вольты можно так: ((double)(((int32_t)X) - 0x7FFF)) / 0x7FFF ) * 5.0. При желании можно раскрыть скобки и получить те самые 2 калибровочных коэффициента для идеального АЦП.
    Но т.к. АЦП не идеальны и там присутствуют разнообразные погрешности и помехи, то и появляются те самые калибровочные коэффициенты. Формула преобразования остается примерно той же самой, но используются уже не точные числа, а подобранные коэффициенты.
    Ответ написан
    2 комментария
  • Какую версию стандарта учить/использовать в 2021 году?

    @res2001
    Developer, ex-admin
    Используют ту версию, которая принята в проекте. Обычно, в проекте уже приняты определенные правила, в т.ч. и по используемому компилятору, версии языка и т.п. Ты просто принимаешь эти правила и работаешь в проекте (или не принимаешь и не работаешь).
    Сейчас все используют минимум C++14. C++14 - это небольшой апгрейд над C++11, все значимые изменения были в C++11, так что литература по С++11 вполне подходит.
    Самые "продвинутые" используют С++17 и может быть кто-то уже и С++20.
    Хватает и старых проектов, где большая кодовая база, написана на старых стандартах языка до С++11.

    На самом деле основы языка изменяются мало. Вся ООП обвязка вполне актуальна со времен С++03, кое что добавили, но и старое то же работает.
    Ответ написан
    1 комментарий
  • Что означает void book::buybook()?

    @res2001
    Developer, ex-admin
    У функции объявленной как:
    void func(...);
    нет возвращаемого значения.
    То что функция в данном примере это метод класса значения не имеет.
    Ответ написан
    Комментировать
  • Есть ли какая нибудь функция из встроенных библиотек в с++ для проверки является ли строка числом?

    @res2001
    Developer, ex-admin
    Сконвертируйте строку в число с помощью strtod() (или любой функции из этой серии) и проанализируйте возвращаемое значение и значение второго параметра. По этой информации можно сделать любые нужные выводы.

    Еще есть isdigit() - но она проверяет символ только на цифры, а число может быть разным - например начинаться со знака или если дробное, то в нем будет разделитель дробной части, который может быть первым. Но в простых случаях ее может быть достаточно.
    Ответ написан
    Комментировать
  • Как перекладывать файлы по разным маршрутам?

    @res2001
    Developer, ex-admin
    Аналогичные решения на самописных скриптах регулярно встречал в enterprise среде, да и сам использовал. Потому что гибко, можно заточить как хочется, со всеми вывертами enterprise окружения. Никакой готовый софт обычно не в состоянии обеспечить все потребности на 100%, поэтому используют самописные скрипты.
    На батниках все ваши хотелки можно реализовать, используя дополнительные инструменты командной строки. Если плохо знаете язык, то можете использовать любой известный скриптовый язык или подучить cmd, там не весть какая премудрость. В винде кроме cmd и posh из коробки есть еще VBScript и JScript их то же можно использовать. Хорошо для подобных задач подходит python, но его придется ставить отдельно, часто это бывает не приемлемо.
    Ответ написан
    Комментировать