Задать вопрос
Ответы пользователя по тегу C++
  • Как реализовать алгоритм на С++?

    @rPman
    у тебя два пути, вместо массивов использовать списки (если нужен не последовательный доступ то придется с индексами, это +log(n) требований памяти) на основе std:list и индекса std:map (сильно фрагментирует память, что плохо в общем случае но просто для разработки) или расширять размер памяти под массив (с копированием содержимого из старого в новый), обычно увеличивают в два раза по мере роста массива - std:vector.

    Так же есть готовая реализация, хранит массив крупными кусками std:deque (это если нужно итеративно по списку идти)
    Ответ написан
  • Могут ли возникнуть проблемы при одновременном чтении и записи в разных потоках переменной?

    @rPman
    без использования синхронизации стандарт говорит что будет неопределенное состояние.

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

    А еще есть кеши процессора, переупорядочивание инструкций или к примеру простой цикл может быть размножен на несколько операций (например четыре повторения но цикл уменьшится в 4 раза), если это будет эффективнее для процессора, и соответственно реально записывать переменную только на каждый шаг цикла, ну а соседний поток будет считывать значение только по по каждому шагу цикла

    Ну и конечно же, внезапно, может все работать как ожидается, без глюков.

    p.s. если size_t не укладывается в битность текущей архитектуры, например будет занимать два слова вместо одного, то и записывать в память будет неатамарным способом, и возможна ситуация, когда соседний поток считывает число из двух половинок, одну с одной итерации цикла, а другую с другой, получив что то типа 0000 9999 -> 0001 0000 число 0000 0000
    Ответ написан
    2 комментария
  • Отрисовка наложений в windows?

    @rPman
    Настоятельно рекомендую вместо сложного встраивания в логику отображения, разместить поверх окна свое, с прозрачностью, двигать окно параллельно и отрисовывать только там где это необходимо

    Из неудобств - необходимость отслеживать z-order окон, что бы корректно перекрывать только нужное окно
    Ответ написан
    Комментировать
  • Как повторить такую "отрисовку" в терминале на Linux?

    @rPman
    За раскраску символов в терминале отвечает сам терминал, а управление - ESC последовательности
    ты просто выводишь в stdout среди обычного текста последовательности вида
    "\033[31m" - весь последующий текст будет красным
    "\033[0m" - весь последующий текст стандартного цвета

    документаций много, с разной степенью удобства, гугл показал отличный коментарий на stackoverflow
    Ответ написан
    Комментировать
  • Как синхронизировать процессы используя только std?

    @rPman
    c++11 и есть стандарт std::thread, std::mutex, std::lock_guard, std::unique_lock, std::condition_variable
    типа так:
     std::mutex m;
     // ...
     {
      std::lock_guardstd::mutex lock(m);
      // критическая секция
     }
    Ответ написан
  • На чём создать прогу для обработки больших данных?

    @rPman
    Смутно помню десятилетия назад у меня была задача приведения данных из разных структурно форматов (миниатрюные базы данных из нескольких таблиц с какими то полями, структура была простой, что то типа дерева - объект и вокруг него описания, но списки полей, отсутствие единых справочников и т.п. превращали процесс в ад), так вот, утилита для причесывания всего этого легче всего писалась на microsoft visual studio с использованием WinForms, на нем было невероятно просто писать простой интерфейс к базе данных, особенно когда у тебя много разных простых но уникальных формочек, большая часть работы была мышевозекательной, а программирование оставалось для граничных ситуаций, обработки ошибок и собственно аналитика.

    В последствии я краем глаза поглядываю на то что предлагается разработчикам для решения такого типа задач, и мне не нравится тенденция к усложнению. Если говорить конкретно про microsoft visual studio, то WinForms заменил WPF, мне показалось это не так удобно, сложнее.. может писать действительно сложные вещи с долгой поддержкой на современных инструментах было бы правильнее, но когда у тебя проект здесь и сейчас и через пару суток ты его уничтожишь за ненадобностью (данные обработал, конвертировал и забыл), альтернативы я не вижу.
    Ответ написан
  • Есть ли разница между *p++ и p++?

    @rPman
    *p++

    Унарный оператор * (если знак перед операндом и слева нет другого операнда) это значение по адресу, на который указывает операнд (в твоем случае это p который ссылка на char (*char) выше равен buf, который инициализирован массивом символов строки "123456\x00" (0 символ в конце не показывают и не учитывают в типе константы, но он есть)
    Затем идет унарный оператор ++ (правосторонний) который увеличивает на 1 значение операнда слева, т.е. *p
    Т.е. данная строка увеличивает на 1 первый (точнее нулевой) элемент массива, и кстати в твоем коде это строка-константа, и так делать нельзя и поведение будет неопределенным (зависит от компилятора).

    *p++ - увеличит ссылку p на следующий элемент и вернет его значение, совсем забыл про приоритеты, сам я стараюсь брать в таких случаях в скобки *(p++)
    p++

    увеличение адреса на 1, т.е. теперь p будет указывать не на нулевой элемент а на первый.
    Ответ написан
  • Ретранслятор для управления дроном через интернет?

    @rPman
    Проблема у тебя возникнет гораздо раньше - на аппаратном уровне (до выбора протокола).

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

    Но если прямо очень очень надо и есть время и деньги на эту возню, то:

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

    - изменить методику управления, реализовав по максимуму автопилот
    дрон должен сам летать, держать курс, обходить (или хотя бы останавливаться) препятствия, справляться с длительной потерей сигнала и т.п.
    Т.е. ты не управляешь креном и высотой, а говоришь куда и с какой скоростью лететь и главное? что делать, если по таймауту не получит следующий сигнал.

    - подумать о легальности процесса, в россии (да я думаю так или иначе везде) кажется без разрешения такого типа дроны запрещены, детские игрушки пускать можно только в прямой видимости и только на небольшой высоте (есть карты разрешений, на каких высотах где можно а где нельзя, на сколько я помню там очень много мест 'нельзя')
    Ответ написан
    2 комментария
  • Как перевести программу на С++ в бот Телеграм?

    @rPman
    Писать самого бота на c++ странно, Олег отличные ссылки привел.

    Формально, телеграм бот работает с сервером телеграма через http запросы и является веб сервером, но на низком уровне делать это будет неудобно (хотя примитивный бот, читающий и отправляющий ответы пользователям - это пара http запросов, на баше в 10 строчек пишется. Ну а c++ функционал пусть остается таковым, вызывать как отдельное приложение.
    Ответ написан
    Комментировать
  • Как устранить ошибку библиотеки C++ при обновлении игры?

    @rPman
    https://help.ea.com/en/help/the-sims/the-sims-4/th...
    Minimum requirements
    Operating system: 64-bit required. Windows 10.
    Полагаю обновление ломает совместимость. Такие вещи обычно специально проводят, что бы полностью исключить пользователей с win7, поищи, может кто то проверку сломал в обновлении?
    Ответ написан
  • Как сделать эмуляцию клика мыши на python без задействования основного курсора?

    @rPman
    Поищи в nox аналог adb подключения для отладки приложений, с его помощью можно симулировать нажатия
    Ответ написан
    Комментировать
  • Можно ли использовать dll в Ubuntu?

    @rPman
    .dll это динамически подключаемая библиотека для windows.
    Создавать приложения для windows можно и в linux, например готовый тулчейн можно установить с пакетом mingw-64 (32-битная версия не поставляется в репозитариях но думаю можно найти) а по факту он использует gcc который умеет кросскомпиляцию, но вручную разбираться придется во многом.

    С некоторыми шансами можно установить windows компилятор в wine... в общем можно но не просто. Как минимум нужно будет собрать информацию об архитектуре, установить необходимые зависимости (vcredist например) и много чего, что в windows стоит по умолчанию, но по лицензионным ограничениям поставляться установленным сразу в linux не может.
    Ответ написан
    2 комментария
  • Возможно ли использовать модель LLAMA-405B на обычном железе 64GB + 8GB?

    @rPman
    Да, уже считал, и это действительно реально, с относительно небольшими затратами (16-20т.р.) если тебя устроит скорость исполнения в 15-30 секунд на токен (на твоем железе llama31-70b на процессоре и 64гб оперативке будет работать токен в 1-1.5 секунд).

    Необходимо собрать самый дешевый pcie nvme ssd программный raid0, купив контроллер pcie-x16 3.0 или 4.0 из четырех разъемов nvme либо четыре pcie-4x дешевых 3.0 и закупить самые дешевые nvme ssd диски от 128гб (со скоростями чтения от 2гбайт/сек).

    Затем собрать из них raid0 с чередованием (win/linux это поддерживают) и разместить на нем gguf файл. llama.cpp поддерживает загрузку файла с весами с диска, без выделения оперативной памяти (но она нужна на контекстное окно, в зависимости от его размера это будут десятки гигабайт). Файл будет считываться по кругу целиком, по разу на токен, а значит скорость будет определяться именно этим. 2гб/с*4 диска = 8гб/с, 256гб 4бит квантизация будет считываться за 32 секунды.

    Есть еще ограничения в скорости исполнения из-за процессора, но по уму, если бы была оперативная память то типовой десктопный процессор работал бы на скорости 15-20 секунд на токен.
    Ответ написан
    7 комментариев
  • Какие библиотеки и как использовались для создания Minecraft Bedrock?

    @rPman
    Майнкрафт был создан на собственном движке и написан на java, позже часть движка значительно модернизирована с помощью мода optyfine (текстур паки и шейдеры, поддержку этого в Майнкрафте так и не допили), там ещё есть моды движка но не такие значимые.

    Помимо графического движка, есть движок для модификаций - forge (тоже не единственный, например fabric) с mcp, собственно поддерживаемый движок для создания модификаций, способных невероятным образом менять проведение игры и это (а так же свободное лицензирование, до покупки майкрософтом) сделал игру популярной.

    Там есть ещё куча других нюансов, которые важны для качества результата но далёкие от графического движка, типа лянчера и способа хранения ресурсов для мультиверсионности, централизованного curseforge,..
    Ответ написан
    2 комментария
  • Почему для самого класса статическая переменная использует правильное значение, но при попытке вывести его, выдаёт 1?

    @rPman
    static int Print(){
    это ФУНКЦИЯ
    для ее вызова нужно использовать скобки
    Bacteria::Print()
    иначе ты получаешь ее адрес
    Ответ написан
    7 комментариев
  • Как передать массив как поле класса(см. код)?

    @rPman
    Если размерность массива - константа, можно использовать готовый шаблон std:array
    std::array<тип или класс элемента, размер массива> myArray;

    Или создай свой шаблон с походим функционалом. Параметры шаблона будут доступны как обычная переменная.

    Если размер не константа, тогда передавай размер массива прямо в конструкторе
    class MyWorld
    { private:
      size_t size;
      public:
      MyWorld(size_t size) {this->size=size;}
      ...
    }
    // использовать
    MyWorld world(123);
    Ответ написан
    Комментировать
  • Почему при меньшем размере блока потоков в группе, скорость такая же?

    @rPman
    Производительность кода на gpu сильно зависит от динамики обращения к оперативной памяти, достаточности кеша и аппаратных возможностей железа (сколько банков памяти).

    Например последовательный доступ к данным значительно эффективнее случайного.

    Если процессор не используется, то в худшем количество потоков должно быть не больше банков памяти (десятки).

    ...
    Ответ написан
    Комментировать
  • Какой компилятор выбрать для C++?

    @rPman
    gcc это образцово показательная реализация компилятора c++ и c, на нем обкатываются очередные стандарты, я бы еще с оглядкой думал про llvm clang, но с его помощью по простому ты не получишь windows exe (или уже можно?).

    Если тебе важен именно мир windows, то майкрософт, с завидным постоянством ломающая стандарты в угоду своей монополии, то конечно используй майкрософтовский компилятор mscc (идет в поставке с ms visual studio и как отдельный sdk).

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

    Исправляй ошибку - проблема исчезнет.
    Ответ написан
  • Почему время выполнения программы так сильно различается?

    @rPman
    Любой вопрос о производительности своего приложения нужно начинать с профилирования.
    google: c++ profiler, первая же статья с хабра как пример.

    И да отсутствие 100% нагрузки на все ядра уже повод задуматься что что то делаешь не так (или приложение упирается в недостаточно высокую скорость чтения файлов как пример). Кстати напоминаю, современные ядра что у intel что у amd - виртуальные, мало того, есть модели десктопных процессоров, где некоторые ядра не такие же как остальные (читай медленнее) а значит выкачивать 100% эффективности не так просто. Например многопоточные приложения числодробилки я сразу запускаю на 1/2 от количества ядер процессора (иначе можно получить замедление вместо ускорения).

    Для начала попробуй зафиксировать для своего однопоточного приложения определенные ядра, например с помощью taskset (google: linux cpu core affinity for specified application). Если делать тупо, то перебирай доступные ядра по одному (может быть по два, так как асинхронные методы могут внутри себя использовать потоки, для реализации асинхронности тех действий для которых они в ОС не реализованы), иначе нужно проанализировать свои ядра по отдельности бенчмарками и принимать решение обосновано.
    Ответ написан
    Комментировать
  • Почему консоль всегда выводит, что я програл?

    @rPman
    c = rand() % 2;у тебя тут ошибка, c у тебя равно символу с кодом либо 0 либо 1,
    if (u == c)
    а сравниваешь с символом '0' либо '1', у них код 48 и 49 соответственно

    поэтому добавляй к c еще код символа '0' (он в ascii кодировке перед '1')
    c = rand() % 2+'0';
    p.s. из-за исторических наслоений, символ не считается несовместимым типом с числом, иначе бы ты увидел эту ошибку в сообщениях компилятора
    Ответ написан
    Комментировать