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

    @rPman
    Какое точное определение неправильного слова и как определить правильное?
    Что сильнее делает слово неправильным, отсутствие буквы? перестановка? подмена? а какое более неправильное? есть ли разница, в какой позиции слова произошла ошибка, в первом символе или остальных?
    Например список слов без ошибок:
    море
    мор
    март

    И вот у нас слова:
    мар - это мор или март?
    маре - это март или море?
    так - это


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

    Я бы взял уже готовую функцию levenshtein (с разными оценками на типы изменений) и для упрощения например брал бы первое слово из списка с минимальной оценкой ошибки.

    Дальше алгоритм
    * Если решать в лоб, никаких ресурсов не хватит, просто для каждого слова из списка вычисляешь оценку на ошибку с правильным, перебирая их до тех пор пока не встретится с оценкой 0.
    Трудоемкость - квадрат на экспоненту от средней длины слова - т.е. долго
    * Предварительно можно исходные анализируемые данные собрать в map слов, чтобы исключить повторения
    * Можно чуть чуть оптимизировать этот алгоритм, если слов с ошибкой в исходном файле мало, перед сравнением искать слово по словарю, построив map заранее, и искать первую минимальную ошибку сравнения, т.е. для правильных слов использовать максимально быстрый алгоритм поиска, исключив их из медленного алгоритма сравнения
    * Дальнейшая оптимизация - расширение последнего шага - можно заранее создать структуру в памяти для всех возможных значений строк с единичным изменением правильных слов (т.е. для каждого правильного слова поместить в map это измененное слово и ссылку на правильное) - получим массив ошибочных слов с ошибкой 1, т.е. все слова с ошибкой 1 могут быть обнаружены со скоростью работы map, так как количество изменений в данном случае сравнимо с количеством используемых символов (умножить на 3) а в задаче речь о словах, т.е. количество символов мало? то на каждое слово в map будет 3*n записей
    * Точно так же можно сделать массив всех ошибочных слов для 2-ух изменений (например 1-изменение на каждую запись от списка с 1-изменением)
    * 3-ех,..4-ех и т.п.

    Очевидно что хранить в памяти такое количество данных очень дорого (можно не хранить в map сами значения, а только хеши для поиска и разруливание коллизий использования этого хеша), плюс предварительное заполнение таких массивов долгое, и имеет смысл только для небольшой глубины (например известно что основное количество ошибочных слов имеет малое количество ошибок, а слова с большим количеством ошибок бесполезны - в реальной задаче поиска ошибок так и есть, никого не интересует случаи когда в слове все буквы ошибочны, обычно речь идет о 2-3 ошибках)

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

    @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++ будет неудобно
    Ответ написан