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

    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 не делится на все предыдущие простые числа. Вложенным циклом. Ну, или решето эратосфена реализуйте.
    Ответ написан
    Комментировать
  • Как "склеить" два файла?

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

    Для винды можно ваш второй файл сделать в виде dll и выпоннять код во время ее загрузки. Чуть подправить исполняемый файл или вообще просто положить dll-ку рядом с exe-шником - и библиотека загрузится.

    Или можно найти пустое место в целевом файле в секции кода. Воткнуть туда вашу функцию и поменять точку входа на нее (а сама функция потом прыгает на изначальную точку входа). Если места нет, то придется увеличивать секцию кода.

    В этом случае, надо изучить устройство PE файла, понимать немного ассемблера.
    Ответ написан
    Комментировать
  • Как компилировать общие файлы двух бинарников один раз?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Да. Любая система сборки будет компилировать только один раз. Будь то cmake, ninja или visual studio.
    Ответ написан
    Комментировать
  • Как в коде метода Лагранджа и Ньютона выводился правильный ответ а не inf?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Так у вас у точек x одинаковые значения. Так вообще-то делать нельзя. Ваше условие x[k] != x[i] - костыль, который ничего и не решат. Вот интерполяция же, она же строит функцию, которая через заданные точки проходит. И вот в этом одинаково x у вас разные значения y - через какую из двух точек должна проходить функция?

    Исправляйте входные данные и все заработает.
    Ответ написан
    Комментировать
  • Как правильно сдвинуть биты?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Идея правильная, но битовые маски - нет. Чтобы взять a7 надо действительно сделать & 0x80. Но для a6 надо брать & 0x40. Потом идут 0x20, 0x10, 0x08, 0x04, 0x02, 0x01.

    Ваше 0x70 - это 0b01110000 - три бита вместо одного. Повторите 16-ричную систему счисления.
    Ответ написан
    1 комментарий