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

    @rPman
    Настоятельно рекомендую начать изучение c++ с командной строки (буквально hello world писать в текстовом редакторе и собирать, запуская вручную gcc/clang), т.е. тулчейна, затем системы сборки, make, cmake, scons (кстати это питоновские скрипты, описывающие проект) и вот после того как пощупаешь, соберешь чужие проекты, и вот тогда загляни в красивые GUI (idea/qtcreator/eclipse/...)
    Ответ написан
    Комментировать
  • Как будет работать система плагинов, при условии что плагины можно писать на разных языках?

    @rPman
    в комментариях к вопросу все что надо уже сказали.
    Первая проблема - хранение данных (переменные, структуры, объекты), вторая - код.

    1 вариант -. первую проблему предлагали решить стандартом сериализации а вторую - принципиально - пусмть каждый плагин запускается по своему отдельным процессом, и использует какой то способ коммуникаций с основной программой (сеть, IPC и т.п.)

    2 вариант - свести все разнообразие используемых языков программирования к одному (например байткоду), и использовать общий фреймворк, если это позволено, такое есть как для java jvm, так и для .net clr (c#, cpp#, vb#, python#,...) или более современно и предпочтительнее (быстрее, больше возможностей и прочее но и сложнее) - llvm, правда с общим фреймворком будет сложнее.
    В этом варианте код плагинов скорее всего должен будет подгружаться в рантайме используя идеологию dinamic link library, но не обязательно.

    Интересным вариантом может быть линковка во время сборки проекта (не во время выполнения, т.е. потребуется перезапуск, в подавляющем больинстве случаев загрузка плагина на лету не требуется, dll чаще используется как инструмент организации хранения и распространения), отличным примером являются объектные файлы компиляции c/c++ компилятора (на самом деле есть компиляторы и для других языков, даже python с помощью nuitka переводится в c++) и уже на месте с нужной конфигурацией все они собираются линкером в один запускаемый бинарник, и при этом исходные коды не распространяются а процес сборки проходит достаточно быстро (он понадобится при смене конфигурации плагинов или обновлении версии какого либо одного из списка)
    Ответ написан
    4 комментария
  • Как удалить элементы векторов по одинаковому индексу С++?

    @rPman
    может в некоторых крайних случаях работать чуть медленее
    не могу представить ситуацию когда один индекс и список объектов будет медленнее нескольких для каждого поля.
    подскажи в каких
    Ответ написан
  • Какой open source проект написан на труъ Си++?

    @rPman
    можно какой-нибудь ярко выраженный пример кода, на который жалуются коллеги?

    могу предположить
    вместе с c++ обычно идут библиотеки std, даже не так, можно printf а можно cout, можно со строками работать, ковыряясь с байтами самостоятельно, strccpy, while(*buf) и т.п. а можно пользоваться std:string, кучей готовых реализаций (и сильно неэффективного кода но с меньшими шансами на ошибки)
    Ответ написан
    Комментировать
  • Как на Linux читать и изменять память процесса?

    @rPman
    погуглю за тебя
    помимо самого доступа нужно еще и чужие структуры понимать, а это значит использовать как минимум те же версии подключаемых библиотек (в т.ч. статически, что не так просто определить)
    Ответ написан
    Комментировать
  • Проблема с получением времени c++?

    @rPman
    а ты делаешь этот код в цикле с интервалом хотя бы минута?
    совет, равенство делай не строгое, а такое st.wMinute >=21
    и отладка, хотя бы выводи на экран на время поиска проблемы значение st.wMinute
    Ответ написан
    Комментировать
  • Что нужно знать, чтобы написать web server на C++?

    @rPman
    для создания простейшего веб сервера на c++ требуется минимум знаний

    базовые знания devops (умение устанавливать/настраивать необходимый софт разработчика и используемые библиотеки)
    базовые знания языка программирования c++
    базовые знания понимания работы сетей, понятие socket
    базовые знания по тому что такое web server и хотя бы приблизительное понимание http протокола
    базовые знания разработки многопоточных/многопользовательских приложений (даже без знаний про мьютекс/семафор, просто общие положения,так как веб сервер может быть однопоточным но знать/понимать проблему нужно)

    эти знания позволят написать hello world web server
    дальнейшее усложнение задачи потребует больше знаний уже по этой задаче
    Ответ написан
    Комментировать
  • Почему результат вычисления целочисленный?

    @rPman
    pow возвращает тип double
    в первом случае ты его преобразуешь в int и все последующие операции идут с целочисленными типами, в т.ч. и /,
    а в записи в строку он левую часть выражения до / делает типом double и значит деление тоже вызывается для типа double
    Ответ написан
    Комментировать
  • Как лучше оптимизировать такие действия с массивами?

    @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...
    Ответ написан
    Комментировать