Задать вопрос
  • Как написать вариадический оператор по 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 Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Вернуть все данные в узле. это же самое что дальше продолжать обходить все внутренние рекурсией или стеком узлы, и составить список. В чем профит то тогда? Как можно вернуть все данные по щелчку.


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

    А профит тут в том, что вы вот так вот обходите не все дерево. а только маленькую его часть.

    Окто дерево используется, чтобы отсечь те объекты, которые сзади или сбоку от камеры и точно не видны. Оно не помогает отсекать объекты, закрытые стеной. Тут, действительно, используется z-buffer.
    Ответ написан
    4 комментария
  • Зачем использовать кучу если есть стек? а так же где применяются указатели и ссылки?

    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
    Разработчик на С++, экс-олимпиадник.
    Единственный способ научиться решать задачи - решать задачи. Много и разных. Если задачи по програмированию, то прорешивайте какой-нибудь leetcode. Если минут за 5 вообще идей нет - смотрите подсказки. Еще через 10 - смотрите чужие решения. Важно только потом все равно эти решения самостоятельно написать потом сразу.
    Ответ написан
    Комментировать
  • Как подключить файл во время работы программы?

    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.
    Ответ написан
  • Как разбить треугольник в прямоугольной области на N треугольников?

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

    При пересечении у вас 2 выпуклых многоугольника. Алгоритм Сазерленда-Коэна тут немного перебор, ибо там один из многоугольников может быть не выпуклым. В вашем фиксированном случае скорее всего нет даже смысла заморачиваться с O(n log n) алгоритмом. Просто научитесь пересекать любые 2 отрезка. После чего пересеките каждую сторону треугольника с каждой стороной квадрата. Не надо считать за пересечение, если 2 отрезка параллельны и накладываются. Получите макимум 12 точек. К ним добавьте 3+4=7 вершины ваших многоугольников. Потом каждую точку проверьте на принадлежность обоим фигурам, и оставьте только те, которые лежат внутри или на границе. Потом постройте выпуклую оболочку из них (погуглите, эта-то задача вообще везде расписана).

    Что касается триангуляции, то у вас там получится выпуклый многоугольник. Так что можно, например, провести все хорды из одной вершины. Если же вам нужна какая-то особо "хорошая" триангуляция, то гуглите "Триангуляция Делоне". Этот алгоритм не строит очень приплюснутых треугольников, где это возможно.
    Ответ написан
    Комментировать
  • Можно ли повредить ОЗУ программой?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    От слишком низкого ничего с памятью не случится, полстл комп не загрузится, из-за неправильной работы памяти.. От слишком высокого, скорее всего, вырубится процессор по перегреву, ведь это же напряжение будет на котнтроллере памяти. Сжечь память вам чипсет не даст, он просто не в состоянии такое большое напряжение выдать.
    Ответ написан
    2 комментария
  • Какой алгоритм приближенного решения Задачи Комивояжера выбрать для регулярных точек?

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

    Очевидно, что шаг от одной вершины к следующей будет не меньше 1, а значит кратчайший путь - тот, который ходит только горизонтально и вертикально. Если сетка не квадратная, то пусть ровно с 2m более длинных вертикаьных ребер будет мнимальным, потому что путь любую горизонтальнюу линию должен будет пересечь хотя бы в 2 точках.

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

    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 комментариев