Ответы пользователя по тегу C++
  • Как сделать эмуляцию клика мыши на 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. из-за исторических наслоений, символ не считается несовместимым типом с числом, иначе бы ты увидел эту ошибку в сообщениях компилятора
    Ответ написан
    Комментировать
  • Как вшить .mp4 файл в .exe С++?

    @rPman
    Используя пайпы. В зависимости от используемой ОС, можно создавать файл, содержимое которого будет определяться вашим запущенным приложением. Приложение соответственно будет извлекать файл из своих ресурсов (можно просто разместить в .data секции) и отправлять его в пайп.

    Пайп это такой файл, который на диске не занимает места (кроме собственно его имени), все записи которого одним процессом могут быть прочитаны другим (там даже буфера нет на это). Недостатки - это файл-поток, по нему нельзя перемещаться seek, т.е. к примеру mp4 по уму таким образом можно разместить, а вот avi (точнее RIFF) - нет, так как при открытии проигрыватели пытаются прочитать конец файла.

    В windows есть механизм (требует admin доступа) регистрации своего windows filesystem filter driver, на более продвинутом уровне позволяет фактически симулировать файловую систему

    upd. еще проще, открывать сторонний плеер по http ссылке, а приложение запускает http веб сервер, отдающий файлы из ресурсов. Правда не все плееры умеют работать с сетью (смутно помню что штатный winxp не умел и нужно было скачивать media player у майкрософта)
    Ответ написан
    Комментировать
  • Как запустить mp4 файл из ресурсов в проигрывателе C++?

    @rPman
    Лучшее что можно посоветовать это библиотеки ffmpeg или vlc (искать соответственно lib...) и другие. На сколько я понимаю самая простая библиотека это gstreamer, есть под windows.

    Я попросил gpt4 накорябать код чтобы проигрывание шло именно из ресурсов, не проверял, возможно он не будет работать как ожидается но идею можно взять из него. В данном случае он использует stream созданный из данных в памяти.
    spoiler
    #include <gst/gst.h>
    #include <glib.h>
    #include <iostream>
    #include <fstream>
    #include <vector>
    
    GstFlowReturn new_sample (GstElement *sink, std::vector<char>* data) {
        GstSample *sample;
        g_signal_emit_by_name (sink, "pull-sample", &sample);
        if (sample) {
            GstBuffer *buffer = gst_sample_get_buffer(sample);
            gst_buffer_fill(buffer, 0, data->data(), data->size());
            gst_sample_unref(sample);
            return GST_FLOW_OK;
        }
        return GST_FLOW_ERROR;
    }
    
    int main(int argc, char *argv[]) {
        GstElement *pipeline, *appsrc;
    
        /* Initialize GStreamer */
        gst_init (&argc, &argv);
    
        /* Build the pipeline */
        std::string pipeline_str = "appsrc name=source ! video/quicktime ! decodebin ! videoconvert ! autovideosink";
        pipeline = gst_parse_launch(pipeline_str.c_str(), NULL);
    
        /* Setup appsrc */
        appsrc = gst_bin_get_by_name(GST_BIN(pipeline), "source");
        if(!appsrc) {
          std::cout << "Unable to get appsrc" << std::endl;
          return -1;
        }
    
        /* Read data into buffer */
        std::ifstream file("file.mp4", std::ios::binary);
        std::vector<char> buffer((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>());
    
        /* Setup necessary signals */
        g_signal_connect(appsrc, "need-data", (GCallback)new_sample, &buffer);
    
        /* Start playing */
        gst_app_src_set_size((GstAppSrc*) appsrc, buffer.size());
        gst_element_set_state(pipeline, GST_STATE_PLAYING);
    
        /* Wait until error or EOS */
        GstBus *bus;
        GstMessage *msg;
        bus = gst_element_get_bus(pipeline);
        msg = gst_bus_timed_pop_filtered(bus, GST_CLOCK_TIME_NONE, (GstMessageType)(GST_MESSAGE_ERROR | GST_MESSAGE_EOS));
    
        /* Free resources */
        if (msg != NULL)
            gst_message_unref(msg);
        gst_object_unref(bus);
        gst_element_set_state(pipeline, GST_STATE_NULL);
        gst_object_unref(pipeline);
    
        return 0;
    }
    Ответ написан
    Комментировать
  • Как в C++ создать массив с неизвестным числом элементов?

    @rPman
    Можно, если размер во время инициализации - константа, описать тип через шаблоны
    template<typename T, size_t size>
    class MyArray
    {
    T data[size];
    ...
    }
    докинув методов для работы с массивом, включая оператор[]... а еще лучше, воспользоваться готовым std::array
    Ответ написан
  • Как вернуть двумерный массив?

    @rPman
    Помню очень очень давно, когда мне нужен был объект двумерный массив с заданными константами размерами (и достаточно маленький чтобы не перегружать стек), а так же мне не нравилось что двумерные массивы требовали дополнительный массив ссылок, который еще нужно было инициализировать, я создавал класс (формально два, так как перегружать оператор [] можно только один раз, для второй перегрузки нужен класс посредник), симулирующий поведение двумерного массива на одномерном, при этом сам массив определялся не как ссылка на него, а как собственно сам объект
    нытье
    сейчас я код свой старый не найду, мне лень но я попросил chatgpt все написать, и о чудо, bing copilot не справился (отвратительно, майкрософт испортила хороший инструмент) хотя он понял концепцию но умудрился наделать кучу ошибок, пришлось чинить, в прошлом году он прекрасно с таким простым кодом справлялся. Не так, если воспользоваться площадкой для ботов coze, там используется gpt4, то результат получается верным (нет он тоже напортачил в подсчете смещения в массиве), это именно майкрософтовский сопилот тупой
    template<typename T,size_t RowNum, size_t ColNum>
    class Array2D {
    private:
    	T arr[RowNum*ColNum];
    
    public:
    	class Proxy
    	{
    	private:
    		T* _arr;
    
    	public:
    		Proxy(T arr[]) : _arr(arr) {}
    
    		T& operator[](size_t index)
    		{
    			return _arr[index];
    		}
    	};
    
    	Proxy operator[](size_t index)
    	{
    		return Proxy(&arr[index*ColNum]);
    	}
    };
    
    typedef Array2D<int, 3, 5> mas35;
    
    mas35 test()
    {
    	return *(new mas35); // с этим нужно быть предельно осторожным, так как бездумно можно получить утечки памяти
    }
    
    int main()
    {
    	mas35 a=test();
    	a[1][0] = 5;
    // ...
    	return 0;
    }
    Ответ написан
    Комментировать
  • Как сделать удаленный доступ для к программе под windows для нескольких пользователей (аля RDP)?

    @rPman
    На текущий момент, если пользователей - до десятка (больше сложнее чисто технически) проблему одновременной работы нескольких пользователей за одним компютером можно решить аппаратным способом. А точнее с помощью ibik aster.

    При этом, работать все будет нативно, без прослоек, т.е. можно запускать 3d приложения/игры, никаких лагов и задержек.

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

    Необходимо к одному компьютеру подключить нужное количество мониторов (видеокарты обычно имеют 3-4 порта, можно в одну машину вставить любые самые дешевые gpu, хоть через рейзеры), клавиатур и мышек (usb удленители, в т.ч. есть по ethernet кабелю до 200 метров). Приложение ibik aster (примерно в 100 раз дешевле лицензий на windows server) и настраиваешь рабочие места - каждому свой монитор, клавиатуру, мышку, звуковуха (если использовать телевизор с динамиками, то по hdmi будет идти звук) и даже свой ip адрес (там как то не совсем корректно реализовано но в каких то случаях работает).

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

    p.s. Само собой, то же самое можно сделать на linux бесплатно. multiseat штатными утилитами если 1 gpu на одно рабочее место, если же на одну видеокарту нужно несколько рабочих мест, тогда сложнее, с помощью xephyr (это xserver в окне) и чуть чуть скриптов.

    upd. кстати, это можно совместить с vnc/rustdesk/... настраиваешь фейковые мониторы (заглушки стоят 100-200р), без клавиатуры и мышки, каждое рабочее место настраиваешь свой vnc, и к этому монстру можно подключаться удаленно по сети. Тонкие клиенты можно сделать хоть из смартфона/смарт_тв
    Ответ написан
    1 комментарий
  • Возможно ли автоматически конвертировать большой проект с Java на C++?

    @rPman
    Все верно тебе ответили - ручками.

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

    Результат будет хуже чем если все делать руками но возможно самую тупую но объемную работу можно будет взять от туда.

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

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

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

    Если что под твою задачу лучше делать цикл while и считать количество 'новых слов' а не количество шагов, зачем тебе эти шаги
    Ответ написан
    Комментировать
  • Как создать exe файл с интерпретатором angel script?

    @rPman
    AngelScript sdk это и есть набор инструментов и библиотека по компиляции и запуску скриптов с интеграцией их в своем c++ приложении.

    Ответ я не знаю но я открываю документацию и там все красиво с примерами написано

    Вот так ты компилируешь скрипт
    Вот так ты запускаешь метод в скрипте

    Внутри sdk в каталоге sdk/samples есть примеры проектов visualstudio
    Ответ написан
    Комментировать
  • Что означает T()?

    @rPman
    T() вызовет конструктор по умолчанию для типа T, тут это переменная шаблона, т.е. тот тип что указан при определении переменной класса List<имя_типа_или_класса>, который собственно тут описан.

    В данном случае возвращать будет новый экеземпляр объекта T в качестве значения аргумента data по умолчанию, если конструктор класса Node будет вызван без аргументов.

    Если честно у меня вопрос, что будет если тип T будет указан скалярный, типа int, определено ли значение по умолчанию для таких типов?
    upd. погуглил пишут да, в контексте шаблонов это нормально и значение по умолчанию определено
    Ответ написан
    4 комментария
  • Как сделать так, чтобы математический знак + не был функцией?

    @rPman
    В c++ существует способ переопределить поведение операторов для своих классов, такие операторы как ++ и -- это unary операторы (могут располагаться как перед оператором так и после с различным поведением) но невозможно изменить ситуации как именно + и - могут быть унарными, так как из размещение в режиме unary допускается только перед переменной.
    // можно
    выражение++
    // но нельзя
    выражение+
    // можно
    +выражение


    чтобы переопределить унарный + нужно написать
    MyClass operator+()
    {
      // выполнить действия с this
      return MyClass(value);
    }


    На сколько я знаю твой код (nujno==+) никак нельзя сделать валидным (препроцессор кстати тоже не позволит переопределить поведение +), да и == - бинарный оператор (нет варианта с его одинарным использованием)
    Ответ написан
    Комментировать