Ответы пользователя по тегу C++
  • Кросскомпиляция, как лучше?

    @rPman
    для windows не густо инструментов
    наверное только mingw штатный или как часть пакета cygwin (там с осторожностью, так как у cygwin свои форматы linux бинарников для запуска под win)

    настоятельно не рекомендую маяться дурью и делать все из под linux
    для windows сборку лучше проводить либо mingw либо visual studio (там есть бесплатный пакет компилятора)
    Ответ написан
    Комментировать
  • Можно ли реализовать графику на стандратных и системных библиотеках?

    @rPman
    если windows.h стандартная, то почему бы не использовать такими же 'стандартными' directx/opengl/vulkan/...?

    и если что у windows есть ее штатная win32api gdi, как минимум спрайты выводить получится и стандартные линии точки элипсы или заливка по шаблону... в общем можно
    Ответ написан
    1 комментарий
  • Как проверить если ли буква в массиве?

    @rPman
    if(myString[i] == letters[i])что? у тебя в цикле сравниваются буквы на равных позициях искомой строки и массива букв, т.е. сначала первую букву hello с первой буквой массива, потом вторую букву hello со второй будквой массива и т.п.

    ты должен отлаживать свой код чтобы понимать где проблема, ты увидил бы это сразу же
    тут нужен двойной цикл, отдельно по буквам hello и отдельно по массиву букв
    Ответ написан
    6 комментариев
  • Есть ли аналог std::string в драйвере уровня ядра windows?

    @rPman
    не уверен что это ответ - string из ntdef.h?
    Ответ написан
    Комментировать
  • Как расположить буквы русского алфавита в порядке от 1 и 32 и работать с их порядковыми номерами?

    @rPman
    char* mychars="абвгдеёжзийклмнопрстуфхчшщьыъэюя";
    
    mychars[0] - первая буква 'а'
    mychars[6] - буква 'ё'

    если надо прямо с 1 то добавь фиктивный символ какой в начало, пробел например

    p.s. приведенный пример для однобайтовой кодировки
    если нужны мультибайтовые то wchar_t (или std::wstring) и строку задать с литерой L"абвг...."
    Ответ написан
    Комментировать
  • Как точно посчитать за какой время выполняется цикл?

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

    Да, Армянское Радио правильно сказал, конкретно это код скорее всего оптимизируется до ничего неделания, так что нужно добавить хоть что то или к примеру в качестве итератора i использовать определенную глобально переменную с пометкой external (тогда компилятор ее точно не выкинет и будет добросовестно итерировать ее на единичку)

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

    Что можно сделать с неодинаковыми результатами - настроить affinity для процесса на одно ядро и повысить приоритет, в этом случае шансы что процесс будет вытеснен будут минимальны... и кстати, антивирус отключи, вот уж процесс, добавляет неопределенности в машину.

    p.s. попробуй собрать свой пример не в msvc а в gcc и/или clang llvm (да еще в разных операционках win/linux), результаты тебя удивят
    Ответ написан
    Комментировать
  • Рекурсивный перебор файлов, как?

    @rPman
    Скорее всего под перебор файлов подразумеваеся получение списка всех файлов на диске

    Рекурсивно - значит нужно написать метод, который должен перечислять список файлов и каталогов в указанном каталоге, и для каждого найденного каталога вызывать самого себя с этим каталогом в параметрах.

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

    @rPman
    Потому что эта функция не умеет играть .mp3 файлы, только waveform audio, при наличии соответствующего драйвера, поддерживаются кодеки (например ac3 или даже mp3, по крайней мере я смутно помню свои эксперименты с этим еще в winxp), но формат файла должен быть все равно riff (т.е. wav или avi, кстати последний под вопросом, сможет ли он выцепить от туда звуковую дорожку, хз)
    https://docs.microsoft.com/en-us/previous-versions...
    The sound specified by pszSound must fit into available physical memory and be playable by an installed waveform-audio device driver.
    Ответ написан
    Комментировать
  • Как получить GMT+3 время в миллисекундах?

    @rPman
    #include <chrono>
    ...
    using namespace std::chrono;
    
    milliseconds ms = duration_cast< milliseconds >(
        system_clock::now().time_since_epoch()
    );
    unsigned __int64 count=ms.count();

    конвертнуть в нужную timezone to_local либо просто добавив (или вычесть?) заранее посчитанное количество миллисекунд
    Ответ написан
    3 комментария
  • Как поместить содержимое файла в байтовый массив на этапе компиляции?

    @rPman
    файл можно превратить в строку с помощью утилиты xxd -i binary, а ее вывод подключить include добавив в начало что то типа
    unsigned char data[]=
    #include "xxd_result.h"
    };

    так же есть другие утилиты по преобразования бинарных файлов в c код, гугл первое же выдает bin2c, плюс написать такую утилиту самому - вопрос на десять минут.

    p.s. gcc линкер может оформлять любые бинарные файлы в объектные (чтобы их можно было подключать во время линковки, а в коде доступ как extern массив байт)
    https://stackoverflow.com/questions/2627004/embedd...
    Ответ написан
    Комментировать
  • Как получить название сети, к которой подключен компьютер?

    @rPman
    все что касается сети можно получить используя консольную утилиту netsh
    с ней работать проще чем ковыряться в WMI хотя последнее более верно
    Ответ написан
    Комментировать
  • Не запускается код на C++, что не так?

    @rPman
    внизу в окне ошибок проскролируй вправо строчку, где написано
    cl командная строка error D8027: нельзя выполнить "C:\Program Files....

    путь явно ссылается на какую то нужную утилиту в папке установки Visual Studio, это значит она установлена не верно, необходимо запустить программу установки заново и выбрать repair (восстановить)
    Ответ написан
  • Что означает данное число 0x55555555555555551 в C++?

    @rPman
    0x55555555555555551 - 16-ричная система исчисления, для его хранения требуется 9 байт, т.е. может быть записано в только как 16-байтовое целое (__int128) или большей разрядности или в классах поддерживающих переменное количество байт для хранения чисел. gnu compiler официально не поддерживает 128бит константы, так что их придется заводить через строки или собирать вручную из чисел меньшей разрядности

    калькулятор говорит это 98382635059784275281 в десятичной системе
    Ответ написан
    Комментировать
  • Возможно ли создать независимый процесс по закрытию основной программы?

    @rPman
    В си решение будет зависеть от выбора платформы, под которую разрабатываешь, для win32 gui вполне возможно что тебе хватит отлавливать закрытие окна на событии WM_CLOSE в твоем главном цикле обработки событий окна, а для posix это регистрация колбек с помощью signal на тип события SIGTERM (там можно и на другие события повеситься, даже к примеру на принудительное завершение ядром процесса по исчерпанию лимита оперативной памяти)...

    Первая же ссылка в гугле по запросу: c++ exit current process callback, направление поиска указано в вопросе. Не все виды завершения работы процесса могут быть отловлены самим процессом, в частности у вопрошающего проблема с консольным приложением в windows... возможно если порыть msdn можно будет найти еще какое решение.
    Ответ написан
  • Как отправлять письма по email через c++?

    @rPman
    google: c++ lib email
    откроет мир готовых библиотек по работе с почтой, выбирай на любой вкус и твою среду и компилятор.

    c++ такой язык что программы на нем достаточно многословные получаются

    p.s. первый же результат из гугла https://github.com/karastojko/mailio

    message msg;
    msg.from(mail_address("mailio library", "mailio@gmail.com"));
    msg.add_recipient(mail_address("mailio library", "mailio@gmail.com"));
    msg.subject("smtps simple message");
    msg.content("Hello, World!");
    
    smtps conn("smtp.gmail.com", 587);
    conn.authenticate("mailio@gmail.com", "mailiopass", smtps::auth_method_t::START_TLS);
    conn.submit(msg);
    это многословно?
    Ответ написан
    Комментировать
  • Как вызвать функцию в зависимости от полученного числа, без использования условных операторов?

    @rPman
    Решение тебе уже сказали - определить функции в массив/map каждую соответственно значению и вызывать.

    Альтернативы не будет. Имя функции не попадает по стандарту в итоговый бинарник, это временная сущность, а значит по имени (сформировав ее к примеру 'func'+n) вызвать никак не получится, но есть исключения, например если требуемые функции - экспортируемые (для dll например), соответственно в зависимости от целевой ОС использовать win32 GetModuleHandle/GetProcAddress, для linux гугл подсказывает dlopen/dlsym.

    Так же можно попробовать проанализировать отладочную информацию, которая будет сохранена в exe-шнике или рядом в файле, само собой код должен быть собран в режиме debug.

    но это страшнейший быдлокод
    Ответ написан
  • Матрица в матрице?

    @rPman
    В c++ есть запись математически схожая с доступом к элементам матрице в математике запись:
    m[x][y] - т.е. мы берем элемент xy матрицы m (формально наоборот конечно, сначала строки Y потом колонки X но в конечном счете разницы никакой, кроме как если важна оптимизация).

    В реальности же эта запись означает что мы берем x-ый массив в списке m и у полученного массива берем y-ый элемент, т.е. m имеет тип массив массивов элементов, и для работы с ним его нужно инициализировать, создав нужное количество массивов одинаковой размерности.

    p.s. иногда, когда хочется 'простоты' инициализации, уменьшения фрагментации памяти, более эффективный доступ последовательный к элементам, можно хранить массив в виде одномерного массива всех элементов матрицы, а доступ к элементам получать, вычисляя смещение в этом массиве как x+y*N, где N - размер матрицы по X, т.е. m[x+y*N], зато когда надо работать последовательно со всеми элементами с лева направо, сверху вниз, можно просто работать по смещению в этом одномерном массиве m[i++]

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

    const int N=3;
    const int M=2;
    int ml[N*M]={1,1,1,2,2,2};
    // матрица:
    // 111
    // 222
    int* m[M];
    for(int i=0;i<M;i++) m[i]=*(ml[i*N]);
    //
    for(int i=0;i<M*N;i++) ml[i]...
    и
    for(int y=0;i<M;i++) 
      for(int x=0;i<N;i++) 
        m[y][x]... // порядок колонки строки тут перевернут, но можно заранее это учитывать и перевернуть везде в коде для удобства восприятия

    p.p.s. может где то ошибся но не принципиально, сто лет не писал на си
    Ответ написан
    Комментировать
  • Как добавить в конец char символы?

    @rPman
    в c++ уже очень давно есть полноценные (и соответственно медленные, но не в реализации а идеологически) строки, класс string с которыми и + прокатит и синтаксически удобные
    Ответ написан
    Комментировать
  • Api gpt-2 на C++?

    @rPman
    там обычные http запросы, подключай любую библиотеку и пользуйся, например libcurl (первый пример из гугла)
    p.s. на c++ будет неудобно
    Ответ написан
  • Как перевести программу c++ в ехе и что бы запускал ось на любом компьютере с Windows?

    @rPman
    Вопрос очень на самом деле сложный.

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

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

    Например создавая проект "Консольное приложение c++" (название приблизительное, не помню точно уже) проект будет автоматически настроен на сборку консольного приложения, лишних библиотек не подключено и т.п. Мало того, возможно понадобится собрать приложение сразу для нескольких архитектур (x86 и x86_64 например), т.е. по набору exe/dll на каждую архитектуру, и бывают случаи когда даже файлы баз данных не переносимы и потребуют свои для каждой.

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

    В самых простых случаях, когда на целевой машине даже не надо создавать ярлык (просто распаковать и все), можно воспользоваться каким-нибудь self extracted archive (у winrar такая опция есть). Иногда инструменты для создания такого пакета есть в самой IDE (точно помню у visual studio для managed .net кода такое было), а иногда это стороннее приложение, для windows рекомендую попробовать inno setup, позволяет создавать не только exe установщик но и msi (специализированный формат windows для установочных архивов), это приложение позволяет описывать процесс установки в виде некоторого языка, не заморачиваясь с интерфейсом.

    p.s. windows нет прямого ограничения по запуску приложений без установки, т.е. просто копируй вручную exe файл и все

    upd. для с++ добавляется еще один челедж, решить, каким компилятором собирать, какими стандартами (стандарт реализация эксепшен try/catch/throw, формат имен подключаемых dll и т.п.), какими базовыми библиотеками (например какая будет использоваться libc) и даже для какой версии ОС собираешь (например собрав под последнюю win10 приложение может не запуститься на win7 или winxp, потому что будет требовать несовместимую версию visual studio redistributable (vcredist*.exe этот пакет обновлений таскают с собой все кому не лень, и кстати по лицензии делать это без разрешения майкрософт низязя)

    Так уж исторически сложилось, что нормально тулчейн найти под windows можно либо:
    * gcc (gnu c compiler) - задает всем остальным, тут полнее реализуют новые стандарты, работает во всех ОС, но при этом есть windows сборка (смотреть у mingw кстати она есть по до все ос, позволяет кросскомпиляцию типа из linux собрать windows exe) а есть cygwin (несовместимая ни с чем, но качественно повторяет linux стандарты)
    Поговаривают что mingw все, кончился :(
    * microsoft visual c++ compiler (идет с visual studio), пытается задавать свои ни с чем не совместимые стандарты, корежит существующие, с целью создать хаос и привязать разработчиков только к windows
    и это у майкрософт получается, к сожалению
    * llvm и clang (это отдельные проекты но когда говорят об одном то и о другом), стандарт стоит особняком, так как llvm это некая виртуальная машина, с очень эффективной реализацией, с jit и оптимизациями
    настроить на windows это еще надо уметь, но есть возможность прописать для использовании в visual studio!
    Ответ написан
    Комментировать