Ответы пользователя по тегу C++
  • Chrono или ctime?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    ctime - легаси еще из c. chrono - новый стандарт. Более точен гибок и современен.
    Ответ написан
    Комментировать
  • Что это за компилятор?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Судя по ошибке, это компилятор GCC.
    MSVC и Clang выдают чуть-чуть другие сообщения об ошибке.
    Ответ написан
    Комментировать
  • Как написать вариадический оператор по SFINAE для умного указателя на Т, который может быть функцией?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Вот минимальный рабочий пример. В вашей реализации return_type проблема в том, что вы этот шаблон применяете к указателю на функцию. Если там поставить * в специализации шаблона - то все компилируется и даже работает.

    template<typename T>
    struct return_type;
    template<typename R, typename... Args>
    struct return_type<R(*)(Args...)>
    {
    	using type = R;
    };
    
    typedef bool (*function)(int);
    
    template<typename T>
    class smart_pointer {
    public:    
        smart_pointer(T func) : func_(func) {}
        
        template<typename R = typename return_type<T>::type, typename ...Args>
        R operator()(Args... args) const {
            return func_(args...);
        }
        
        T func_;
    };
    
    bool foo(int t) {
        return t % 2 == 0;
    }
    
    
    int main() {
        smart_pointer<function> sm(&foo);
        std::cout << sm(5);
    
        return 0;
    }
    Ответ написан
    Комментировать
  • Почему программа не выдаёт ошибку, если поместить выражение в скобки?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Приоритеты операций.

    Без скобочек сначала выполняется <<. Фактически, у вас написано вот это: (std::cout<<a) == b;
    << - переопределенный оператор для std::cout, он выведет a на экран и вернет ссылку на std::cout, которую потом программа попытается сравнить с b и не сможет, потому что операция такого сравнения не определена.

    Если же поставить скобки, то сначала выполнится ==, результат ее работы - bool - уже потом будет через оператор << выведен в на экран.
    Ответ написан
    Комментировать
  • Зачем использовать кучу если есть стек? а так же где применяются указатели и ссылки?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Проблема стека в том, что там лежат только локальные данные, которые исчезнут вместе с выходом из функции. Кроме того, обычно размер всех переменных на стеке известен во время компиляции. Некоторые языки умеют выделять на стеке массивы переменной длины, но даже не все C++ компиляторы так умеют. В самом стандарте языка c++ - таких масивов нет. Поэтому стек часто не подходит.

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

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

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Потому что у вас неправильно применяется векторизация к задаче. У вас там свертка с ядром 5x5. Т.е. для одного выходного пикселя вы должны сделать 25 умножений и их сложить. Вы же делаете 25*8 уможений для каждого пикселя. Потом как-то странно их еще и суммируете.

    Если у вас уж есть векторизация, то вы какие операции распаралеливаете? Вот эти 25 умножений же, правда? Значит у вас в программе не должно быть вообще вот этих циклов от -2 до 2. Вы эти операции сначала развернули в 25 отдельных, а потом их по 5 или 8 штук объединили в одну векторную операцию.
    Ответ написан
    5 комментариев
  • Какой компилятор выбрать для C++?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    gcc - компилятор языка си. Если вы хотите компилировать C++, то запускать надо g++.

    И вообще gcc - он в экосистеме линукс. Чтобы оно работало под виндой, то надо ставить специальную прослойку эмуляции экосистемы линукса, вроде mingv.

    Под виндой легче использовать компилятор от microsoft: msvc. Легче всего его поставить в комлекте с бесплатной версией visual studio.
    Ответ написан
    2 комментария
  • Код должен выводить только те буквы, которые встречались во всех словах, но вместо этого программа резко завершает работу. Что не так?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    У вас в цикле по iter фигня какая-то происходит. Вы там iter не меняете вообще. А надо или сдвигать на следующий элемент, или, если вы удаляете элемент, переходить к значению, которое вернуло erase - оно как раз возвращает следующий за удаленным элемент.
    Ответ написан
  • Как подключить файл во время работы программы?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Если вам надо в программе выполнить какой-то произвольный код из исходника, то вам надо в программу встроить интерпретатор языка или какой-нибудь JIT-компилятор.

    C C++ все гораздо хуже, но какая-нибудь LUA имеет гораздо более развитый набор утилит именно для этого.
    Ответ написан
    Комментировать
  • Как обойти ошибку Error: Forbidden: bot was blocked by the user в телеграм боте? C++?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Сдается мне, что вникак. Если вас забанили, то никакой код это не исправит.
    Ответ написан
    Комментировать
  • Почему время выполнения программы так сильно различается?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    У вас там работа с диском. Да еще многопоточная. Что там в кеше у SSD окажется, выполняется ли какой-нибудь TRIM в контроллере SSD, индексирует ли что-то какой-нибудь системный процесс, на какое ядро планировщик закинет какие потоки - куча факторов.
    Ответ написан
    Комментировать
  • Почему HBITMAP не записывается в буфер обмена?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Из документации:
    You cannot paste a DIB section from one application into another application.


    Можно после изменения данных в DIB section сделать нормальный битмап через CreateDiBitmap.

    А еще лучше, вместо CreateDIBSection, скопируйте данные из битмапа через GetDIBits, измените их и скопируйте назад в битмап через SetDIBits.
    Ответ написан
    1 комментарий
  • Какая сложность у std::sort?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Это ассимптотическая сложность O(n log n). В ассимптотической сложности константа не имеет значения. И 2n, и 1000n - все одно O(n). При изменении основания логарифма у вас появится лишь константный множитель, который O() игнорирует, ведь log_а (n) = log_b(n) / log_b(a). Поэтому можно использовать вообще любой логарифм.

    В компьютерной науке обычно используют логарифм по основанию 2. Потому что в алгоритмах вылезает именно деление на 2, а не на 10 и тем более не на e.
    Ответ написан
  • Как перевести из матрицы смежности в матрицу инцидентности?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Алгоритм прост: Итерируетесь по всей матрице смежности. Для каждой единички создаете новый столбец в выходной матрице и ставите там 1 на строках с текущей строкий и столбцом во входной матрице.
    Ответ написан
    2 комментария
  • Почему раскладка языка в Windows не переключаются?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Читайте документацию: https://learn.microsoft.com/en-us/windows/win32/ap...

    This function only affects the layout for the current process or thread.


    Эта функция не может поменять раскладку в системе.

    Попробуйте вот это: https://learn.microsoft.com/en-us/windows/win32/ap...
    Ответ написан
    Комментировать
  • Как вернуть значение на которое указывает указатель?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Вот как вы себе представляете: вызов одной и той же функции должен вернуть разные типы для разных индексов?

    Нет, в C++ статическая типизация, одна функция может вернуть только один тип. Из List'а вы только Base вернуть и можете. А уже как-то опросив экземпляр класса с помощью виртуальных методов, вы сможете узнать, какого же он на самом деле типа и скастовать к нему.

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

    Или хранте и возвращайте std::Variant, а не указатели на базовый класс.
    Ответ написан
    4 комментария
  • Как хукнуть функцию из другого приложения?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Еще проще будет дизассемблировать исполняемый файл и заменить условный переход на безусловный в файле. Не во время исполнения, а на диске. Или вообще в начало функции вставить ret 1 куда-нибудь.

    Вот так прям в памяти патчить, то это опасно. Вдруг функция исполняется в момент перезаписи?
    Но если так хочется, то проще прям в памяти захардкодить return true. каким-то образом.

    Вы там куда-то E9 вставили, и так поменяли код команды на jmp. Но адрес поменяли неправильно. Вставьте в первые несколько байт код ret 1 и все заработает.
    Ответ написан
    5 комментариев
  • Чем вызван краш программы?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    А как вы адрес получали? Похоже, что с ним фигня.

    Попробуйте запустить вашу программу в отладчике с брейкпоинтом по загрузке (видимо, нужно будет windbg использовать какой-нибудь. Не знаю, как это сделать в IDE). Пропустите загрузку всех модулей и потом ставьте брейкпойнт в вашем MainThread. Там пройдитесь до, собственно, вызова auth и посмотрите, по какому адресу оно сделает вызов. Потом, посмотрите в отладчике же, а какой же адрес у auth. Они точно совпадают?

    Еще, а не рабатает ли, если auth в вашем взламываемом экзешнике объявить тоже _stdcall? Не помню, какое там соглашение по вызову по стандарту применяется, но надо чтобы они были одинаковы в коде экзешника и в вашей дллке.
    Ответ написан
  • Отличие int32_t от std::int32_t?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Это один и тот же тип. Просто для обратной совместимости, при запихивании его в стандарт, в std::int32_t протащили сишные типы. Вот код.

    Edit: я сначала перепутал, что куда протащили.
    Ответ написан
    Комментировать
  • Что не так в решении задачи?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Проверка числа на простоту не так.
    Во-первых, начинайте c n=2, ибо 1 у вас иначе простым числом будет.

    Во-вторых, в вашем случае надо проверять, что n не делится на все предыдущие простые числа. Вложенным циклом. Ну, или решето эратосфена реализуйте.
    Ответ написан
    Комментировать