Задать вопрос
  • Имеет ли место быть использование кодогерерирующих макросов для Debug версии приложения, а на Realise их отсутствие?

    @res2001
    Acaunt, Это уже нюансы.
    Я имел ввиду, что сам механизм уже есть, причем он стандартизирован (правда в Си, но и в плюсах его вполне можно использовать). На его основе вы можете сделать свой макрос или constexpr, содержащий логическое значение:
    #ifndef NDEBUG
    constexpr bool DEBUG = true;
    #else
    constexpr bool DEBUG = false;
    #endif

    И далее уже использовать этот DEBUG, причем следить за правильностью его настройки в системе сборки уже не надо.
    assert - к теме вопроса отношения не имеет, но на прямую имеет отношение к NDEBUG да и вообще инструмент полезный, многие его игнорируют, но я использую практически в каждой функции/методе. Если правильно расставить в ассерте инварианты на входе в функцию, то заметно облегчает отладку кода в случае возникновения ошибок. Кроме того, ассертом вы показываете читающему код коллеге какое состояние ожидает функция на входе.
    Написано
  • Выставить rdp в интернет но доступ к порту разрешен определённый IP - норм или стрем?

    @res2001
    В целом согласен с Dieman666, плюсанул.
    Но если лень с этим вариантом заморачиваться, то альтернатива RDP поверх ВПН.
    Написано
  • Как считать из stdin русский текст и вывести его как wchar_t?

    @res2001
    Максим,
    Вряд ли пользователь не хочет, чтобы за него меняли кодировку консоли.

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

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

    3. Посмотрите на родные утилиты ком.строки винды (dir, findstr и т.п.) - они прекрасно работают с той кодировкой, которая выставлена прямо сейчас у вас в консоли, ничего не меняют и текст выводится корректно и никаких побочных эффектов.
    Правда и у микрософт встречаются косяки в утилитах, сейчас уже на вскидку не скажу в каких, но натыкался. Например у wmic были какие-то странности с выводом, так что приходилось как-то дополнительно это обходить, правда странности не связаны с кодировкой.

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

    PS: Сейчас мне эта тема не актуальна, давно уже разрабатываю под другие ОС, изменений не отслеживаю. Просто поделился собственным опытом.
    Написано
  • Используете ли вы static не inline, и для чего?

    @res2001
    Нужда в static полях классов регулярно появляется, как правило их необходимость диктует сама логика работы класса (т.е. то для чего он создается).
    Как наиболее общий вариант использования - класс синглтон - можно единственный указатель на класс объявить статиком в самом классе, возвращать его используя то же статический метод GetInstance(), при первом вызове класс создается, дальше возвращается уже готовый указатель.
    Написано
  • Нарушается ли тут strict aliasing rule?

    @res2001
    Подумал тут. Вам надо не эту конструкцию использовать:
    reinterpret_cast<RefMemoryBlockBase*>(
                reinterpret_cast<char*>(data) - sizeof(RefMemoryBlockBase)
            )

    А макрос типа container_of из Си, он не стандартный, но часто используется в разных проектах.
    Container_of использовать для преобразования T* в RefMemoryBlock*, а затем от него уже в RefMemoryBlockBase* стандартным кастом. На плюсах containter_of будет выглядеть как-то так:
    #define container_of(ptr, type, member) \
        (reinterpret_cast<type*>(            \
            reinterpret_cast<char*>(ptr) - offsetof(type, member) \
        ))

    У вас его использовать так:
    container_of(data, RefMemoryBlock , Value);
    На выходе будет RefMemoryBlock*.
    При желании его можно переписать на шаблонах, чтоб избавиться от макросов.
    Использовать container_of будет безопаснее, т.к. в этом случае компилятор сам учтет нужное смещение от Value для вычисления RefMemoryBlock*, а затем и RefMemoryBlockBase*.
    Написано
  • Нарушается ли тут strict aliasing rule?

    @res2001
    Может стоит использовать shared_ptr для счетчиков ссылок?

    Кажется strict aliasing тут не при делах. Какая у вас ошибка при сборке возникает?

    В вашем коде я вижу другие проблемы. Я бы не стал тут использовать наследование, т.к. начинаются зависимости от компилятора - как он расположет данные базового класса относительно данных потомка? Плюс появляется таблица виртуальных методов - где указатель на нее лежит до или после базового класса? В итоге арифметика преобразования указателя может быть не такой простой, как у вас. А какой она должна быть мы не знаем.
    Если хотите идти по этому пути, то делайте RefMemoryBlockBase и RefMemoryBlock максимально простыми, вместо наследования используйте агрегирование, избавьтесь от виртуальных методов.
    В целом идея вполне рабочая. Тот же подход используют для реализации интрузивных контейнеров, можете поискать что-нибудь подходящее и посмотреть как там это реализуют. Например что-нибудь из boost.intrusive.
    Написано
  • Как открыть файл с расширением .xdat?

    @res2001
    Любой файл имеет какой-то формат. Для работы с файлом нужно иметь описание формата.
    Дальше уже дело техники, используя стандартные функции Си (или ОС) для работы с файлами, открыть файл и изменить то что нужно изменить в соответствии с форматом.
    Написано
  • Безопасно ли преобразование reinterpret_cast из указателя в массив?

    @res2001
    Шланг собирает оригинальный код с предупреждением на инициализации массива, но код работает.
    Написано
  • Как работает выравнивание памяти в С в структурах?

    @res2001
    Для обычных структур не нужно играть с выравниванием, т.к. "упаковка" структуры сделает доступ к ее полям более медленным.
    Кстати, далеко не во всех процессорах поддерживается доступ к не выровненным данным. Но самые популярные это, конечно, уже освоили. Например некоторые микроконтроллеры будут вываливаться в ошибку при невыровненном доступе.
    Чаще всего будешь сталкиваться с невыровненным доступом при чтении/записи файлов или приеме/передачи данных по сети. Поэтому обычно в этих случаях требуется процедура сериализации/десериализации.
    Сама структура так же имеет свое выравнивание - обычно оно равно самому большому выравниванию её членов. Но могут быть нюансы, как обычно, но это, скорее всего, уже довольно специфические случаи.
    Написано
  • Как исправить невозможность подключиться к серверу по ssh?

    @res2001
    Сервера то где?
    Если заграничные VDS, то возможно РКН включил белые списки. В этом случае дело не в ssh. Выключат БС - заработает само.

    Если сервера локальные, то, возможно, ssh сервер криво настроен или служба не стартует или фаервол блокирует.
    Написано
  • Что делать, на QEMU всё летает, а реальный Celeron D умирает?

    @res2001
    brar, Какая разница, дает он ответы от ИИ или из головы, если ответ правильный?
    Если не правильный - есть смысл закидать тухлыми яйцами хоть человека хоть ИИ, но аргументируя. Аргумент - "это копипаст ИИ" - не аргумент.

    Я плохо разбираюсь в железе. Но ошибка if(type=0) явно присутствует. Об этой ошибке должен и современный компилятор сообщать в предупреждениях (при включенной опции -Wall). По остальным ошибкам в ответе Андрюха Фростморн судить не берусь.

    Кирилл Ларченко, Вообще рекомендую как минимум опции -Wall -Wextra всегда использовать при сборке и добиваться сборки без предупреждений. Можно дополнительно использовать -Werror что переведет все предупреждения в разряд ошибок. Коротенько тут описаны основные регулировки предупреждений компилятора: https://habr.com/ru/articles/490850/

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

    @res2001
    Единорог Безрогов, Работоспособность батарейки проще всего проверить по часам ПК. Когда батарейка села или не работает после каждого выключения ПК из сети часы сбрасываются и начинают показывать дату что-то типа - 01.01.1970 (тут могут быть другие варианты). Если часы не сбрасываются - батарейка норм.
    Согласен с Zerg89 - скорее всего после чистки шлейф SATA подключили к другому порту, вероятно из-за этого порядок загрузки и поменялся.
    Удалите все не используемые разделы с HDD, чтоб больше не было такой путаницы. Освободившееся пространство диска можно и не объединять с другими разделами, если не охота с этим заморачиваться (это не всегда можно быстро сделать штатными средствами). Обычно раздел UEFI и прочие "служебные" разделы винды не большие.
    Написано
  • Я единственный у кого cppreference.com через раз падает с ERR_TIMED_OUT?

    @res2001
    Аналогично. С некоторых пор (около месяца, может чуть больше) хожу туда через ВПН.
    Написано
  • Почему при передаче указателя в функцию, функция получает копию?

    @res2001
    В Си нет ссылок. Тут только int** arr поможет.
    Написано
  • Как ограничить жор ОЗУ со стороны раздела "изменено"(диспетчер задач)?

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

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

    В стандартном виндовом менеджере задач можно добавить нужные столбцы на вкладке "Details" и по ним сортировать - так можно найти процесс виновник достаточно быстро.
    Написано
  • Почему бинарник скомпилированный через CMake весит больше, чем напрямую скомпилированный через clang++?

    @res2001
    Drovosek01, Скорее всего опции компилятора все таки различаются, cmake может от себя еще что-то добавить, помимо того, что написал ему ты.
    У cmake есть опция, с помощью которой можно выводить командную строку компилятора со всеми итоговыми ключами:
    set(CMAKE_VERBOSE_MAKEFILE ON)
    Добавь ее в cmakelists где-нибудь в начале или передавай через командную строку и после сборки можешь увидеть команды, которые выполняет cmake build.
    Написано
  • Как отключить окно при подключении по RDP Windows 11?

    @res2001
    Теперь еще и rdp файлы предлагают подписывать. Не знал.
    Даже утилиту сделали для подписи: https://learn.microsoft.com/ru-ru/windows-server/a...
    Написано
  • Как отключить окно при подключении по RDP Windows 11?

    @res2001
    Кот Абсолютный, В свое время ставил сертификат на Windows Server RDP с собственного ЦС без проблем.
    Там были какие-то тонкости (связанные, кажется, с использованием сертификата - надо было правильно выставить в запросе), но все решалось легким гуглежом.
    Это было еще во времена WIn Server 2008/20012. Сейчас давно уже не в теме.
    На Letsencrypts, скорее всего, за бесплатно подходящий сертификат не дадут, но за деньги, думаю, что можно в любом ЦС выпустить правильный.
    Написано
  • Как отключить окно при подключении по RDP Windows 11?

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

    На вашем скрине этой галки нет. Вероятно это и есть происки последнего обновления. У себя на винде, каких-то изменений в этом плане не замечал, вроде бы все как обычно. Но возможно, ко мне еще не все обновления прилетели.
    Как вариант, при обновлении в винду добавили/изменили значение какой-то групповой политики, влияющей на возможность сохранения сертификатов и галка перестала отображаться в окне. Если политику отменить - то она снова появиться. Не знаю, существует ли такая политика, это в качестве гипотезы для дальнейшего исследования.

    Но можно и без галки. Есть несколько вариантов, которые приходят в голову сразу:
    1. использовать на сервере официальный сертификат, подписанный широко известным ЦС, например Letsencrypt и т.п.
    2. Развернуть собственный корпоративный ЦС, выдать в нем сертификат для RDP сервера, на всех клиентах установить сертификат ЦС в хранилище "доверенные корневые ЦС", тогда сертификат сервера будет проходить проверку успешно.
    3. Извлечь самоподписанный сертификат сервера, раздать его клиентам, чтоб они так же установили его в "доверенные сертификаты".

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

    @res2001
    SSTP работает в пределах РФ, проблем не было.
    Написано