Задать вопрос
  • Ну разве я переусложнил?

    @res2001
    Desertoad, Если мне надо что-то проверить или поэкспериментировать и если в этом случае задействуются библиотеки мои или сторонние, то я делаю отдельный проект, чтоб основной не засирать. Иногда такие тестовые проекты вырастают в полноценные тесты и я включаю их как тест в основной проект.
    Но чаще такие эксперименты бывают не большие, помещающиеся в одном файле. Тогда вообще никакого проекта не создаю, компилирую руками из ком.строки.

    Эти временные проекты после решения вопроса удаляю, если они больше ценности не представляют, или оставляю.
    Написано
  • Ну разве я переусложнил?

    @res2001
    Desertoad, Ну вроде проблему понял :)
    Тогда вообще нет вопросов, если проблему решил - супер гуд.

    Действительно, при таком стиле разработки, надо будет регулярно править cmakelists.
    У меня несколько другой подход, поэтому мне не актуально.
    Написано
  • Ну разве я переусложнил?

    @res2001
    Ну ты заморочился, конечно :) Надеюсь, в ходе написания, удалось прочувствовать cmake.
    Посмотрел по диагонали, выглядит вроде норм. Если решает ту задачу, которую ставил перед собой, значит все Ок, можно пользоваться. И можешь не слушать ИИ.
    В любом случае - работа проделана не зря и наработал себе достаточно полезных знаний, которые в любом случае пригодятся в дальнейшем.

    Честно говоря, я не понял проблемы, которую призван решать этот код. Вроде в cmake уже все есть.
    У меня обычно довольно большие проекты с кучей исходников, обычно делю их по компонентам и для каждого компонента делаю статическую библиотеку (таргет), потом объединяю все в исполняемый файл.
    Если используется внешняя библиотека, то, как правило, использую динамический ее вариант имеющийся в пакетном менеджере. Ищу с помощью find_package или pkg_check_modules.
    В обоих случаях cmake прекрасно справляется с подключением нужной версии библиотеки. Особых проблем никогда не испытывал.
    Написано
  • Имеет ли место быть использование кодогерерирующих макросов для 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...
    Написано