• Что будет с компьютером, если забыл очистить динамическую память?

    Zoominger
    @Zoominger
    System Integrator
    что забыл дописать delete для указателя. Есть ли что-то в этом плохое?

    Да, будет утечка памяти.
    Это критично для крупных программ и для служб.
    А для хеллоуворлда не страшно, при закрытии программы ОС вернёт занятую ей память.
    Ответ написан
    Комментировать
  • Где ошибка в коде и как ее исправить?

    @menkar3
    spoiler
    Все переписа...

    Замена1 (как сказали выше):
    CONTRY *a[100];
    на
    CONTRY* a = new CONTRY[100];

    Замена2 в main начиная отсюда:
    int winter = a[0]->gettemp_winter();
      int summer = a[0]->gettemp_summer();
    ...
    На
      int winter = a[0].gettemp_winter();
      int summer = a[0].gettemp_summer();
    ...и т.д.

    У вас теперь указатель на массив а не массив указателей, так что все -> меняем на .
    Ответ написан
    1 комментарий
  • Как сделать циклический сдвиг массива на 4 вправо?

    @menkar3
    std::rotate?
    #include <algorithm>
    ...
    int main()
    {
        const int n = 12;
        int a[n] = { 1,2,3,4,5,6,7,8,9,10,11,12 };
        rotate(a, &a[n] - 4, &a[n]);
        for (auto n : a)
        {
            cout << n << " ";
        }
        return 0;
    }
    Ответ написан
    Комментировать
  • Page Guard Hooking на C++, как сделать?

    @menkar3
    Код не запускал, могу ошибаться.
    1. Скорее всего, у вас произошло что-то вроде:
    1. Вся страница памяти защищена PageGuard
    2. Летит исключение STATUS_GUARD_PAGE_VIOLATION не с адреса 0x116F3
    3. VectoredExceptionHandler возвращает EXCEPTION_CONTINUE_SEARCH

    2. Саму copyAddress нужно сделать исполняемой через VirtualProtect (а лучше сразу выделить через VirtualAlloc с PAGE_EXECUTE_READWRITE)
    3. Вы копируете страницу не с начала, а с инструкции push 1388.
    Получаем что-то вроде (1:54 на видео):
    ="MEMORY PAGE"=
    ... push 1388
    ... call ...
    ... cmp ...
    ... call ...
    EB C7 jmp ...
    ...
    ===============
    Т.е. все будет хорошо ровно до момента, когда управление доходит до джампа (переход на следующую итерацию цикла while). Смотрим на двухбайтные джампы и ожидаемо видим, что это скачок назад - т.е. куда-то до push 1388, с которой вы начали копировать. Джампы относительные, так что управление было бы передано куда-то в мусорную память.
    Ответ написан
    Комментировать
  • Как в minetest узнать кто последний изменил блок?

    twix007
    @twix007
    к чему вопрос вообще? идите на игровой форум
    Ответ написан
    Комментировать
  • Как реализовать захват сырого видео с видеокарты в режиме ядра?

    Что бы что-то прочитать из фреймбуфера нужно туда сначала что-то записать.

    Подозреваю, что у вас запущены иксы. А они не используют фреймбуфер. Значит нужно разбираться с api иксов.
    Ответ написан
    5 комментариев
  • Что такое таблица символов компьютера?

    5d403c0be1aa1292813843.png
    Ответ написан
    Комментировать
  • Github можно доверять?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Нельзя.

    Но вы можете просто доверять автору приложения.
    Либо доверять тому, кто сможет проверить исходники на Github (заодно убедиться, что исходники именно те) - то есть вашему другу или знакомому программисту.
    Ответ написан
    2 комментария
  • Какая из серверных систем виртуализации самая распространенная?

    sim3x
    @sim3x
    KVM
    Ответ написан
    Комментировать
  • Как получить дробное число при делении 1 на 1?

    myjcom
    @myjcom Куратор тега C++
    Смотря что нужно.
    #include <iostream>
    #include <iomanip>
    #include <cstdlib>
    
    int main()
    {
      int a = 9;
      int b = 4;
      std::div_t result = div(a, b);
      std::cout << result.quot << " " << result.rem << std::endl;
      // Наверное это
      std::cout.precision(1);
      std::cout << std::fixed << static_cast<double>(a) / b << std::endl;
    }
    Ответ написан
    Комментировать
  • Как создать концепт, в функциях которого есть вывод типа?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Концепт должен применяться к вызывающему коду. Я слегка модифицировал ваш пример для общего случая. Сейчас им можно проверять, содержит ли любой класс метод match с определённой сигнатурой:
    template <class T, class V>
    concept bool HasMethodMatch = requires(T a, V v) {
        { a.match(v) } -> bool;
    };
    
    class A {
    public:
        template <class T>
        bool match(T t) const {
            return t == 1;
        }
    };
    
    template <class V> 
        requires HasMethodMatch<A, V>
    void doSmth(const A& a, V v)
    {
        a.match(v);
    }
    
    int main()
    {
        A a;
        doSmth(a, 5);
        doSmth(a, 5.f);
        doSmth(a, 5.d);
    }

    Для более общего случая, в методе doSmth, класс A можно заменить на ещё один шаблонный параметр. Но, я думаю, что логика теперь более-менее ясна.
    Ответ написан
    6 комментариев
  • Как осуществить поиск в файлах?

    @Hanneman
    Установите Everything. Лучше нее человечество ничего в этом плане не изобрело.
    Ответ написан
    5 комментариев
  • Это одно и тоже с точки зрения стандарта?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Казалось бы, в обоих случаях у нас вызов конструктора,

    А вот и нет. A a(); -- это объявление функции a, без параметров, возвращающей значение типа A.


    И получаем странную ошибку при компиляции:
    ssd1306_128x32_i2c_test.ino:50:3: error: request for member 'f' in 'a', which is of non-class type 'A()'

    В сообщении об ошибке об этом явно написано.
    Ответ написан
  • В чем разница между архитектурой Linux и Windows с точки зрения программиста?

    Adamos
    @Adamos
    С точки зрения системного программиста, Винды и Линь в принципе разные темы, и сравнивать их бессмысленно - ты пишешь либо под одну, либо под другую.

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

    С точки зрения программиста, который выбирает, на какой системе ему строгать свой говнокод (обычный бэкграунд подобных вопросов на Тостере), архитектура системы вообще ни при чем.
    Ответ написан
    2 комментария
  • Как правильно работать с callback функциями в многопоточных программах?

    @OYTIS
    Embedded Software Developer
    Обычно колбэку в таких случаях передается this в качестве параметра (большинство библиотек поддерживают передачу void* параметра колбэкам). Переменную val нужно или объявить публичной, или сделать геттеры/сеттеры или объявить my_callback как friend для MyClass. Переменную нужно защитить так же, как для обычной многопоточной программы. На вскидку здесь могут подойти std::atomic или std::mutex.
    Ответ написан
    5 комментариев
  • Можно ли через CMake собрать проект, собирающийся bash-скриптом?

    @4rtzel
    add_custom_command полезен когда у вас часть исходников генерируются какой-нибудь другой программой (например flex, protobuf). В таком случае OUTPUT будет указывать на сгенерированные файлы с помощью команды COMMAND. Можете посмотреть мой ответ по теме.

    Самый простой способ (но не всегда самый хороший) собрать сторонний не CMake проект -- использовать ExternalProject_Add. Сложности возникают когда надо добавить этот проект как зависимость к своему. Самый очевидный способ -- это использовать find_package с указанием правильных путей. Например для OpenSSL:
    ...
    # Вместо этой строчки также можно указать путь из командой строки:
    # $ cmake -DOPENSSL_ROOT_DIR=/usr/local/ssl -DOPENSSL_LIBRARIES=/usr/local/ssl/lib ..
    set(CMAKE_MODULE_PATH  ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/openssl)
    # Используем FindOpenSSL.cmake для поиска
    find_package(OpenSSL REQUIRED)
    ...

    Проблема этого способа, что ExternalProject_Add выполняется на этапе сборки (вызов make), а не на этапе конфигурации (вызов cmake), find_package не сработает, если уже нет собранной версии openssl где-то в ${CMAKE_CURRENT_SOURCE_DIR}/openssl.

    Другой вариант добавление зависимости -- использовать комбинацию target_link_directories и target_link_libraries. Пример:
    target_link_directories(my_target ${CMAKE_CURRENT_SOURCE_DIR}/openssl/lib)
    target_link_libraries(my_target PRIVATE crypto ssl)

    Проблема этого способа, что мы привязываемся к конкретному пути и названиям библиотек (хотя должны зависеть только от таргетов).

    Во многих проектах такие проблемы решаются, так называемым, SuperBuild'ом. Это когда у вас есть главный CMakeLists.txt файл в которым все остальные проекты (включая ваш) определены как ExternalProject. Тогда можно будет нормально строить зависимости между ними и вызовы типа find_package будут работать, но это уже другая история.
    Ответ написан
    2 комментария
  • Зачем std::forward иметь две сигнатуры и явно указывать тип?

    @Mercury13
    Программист на «си с крестами» и не только
    std::forward предназначен для использования в шаблонах; без шаблона можно использовать старый добрый std::move.
    Кроме того, std::forward налажен таким образом, что шаблонный параметр надо указывать явно.

    Задача std::forward — передать далее простую или временную ссылку в зависимости от того, какую ссылку передаёт пользователь.
    Ответ написан
    6 комментариев
  • Зачем std::forward иметь две сигнатуры и явно указывать тип?

    makarenya
    @makarenya
    программист
    Попытка №2, в первой был бред:
    Основной проблемой является то, что внутри метода все параметры имеют тип l-value. То есть модификатор параметра && - это лишь требование, чтобы на место этого аргумента вызывающий код передал r-value (а для шаблонов даже этого не требует, благодаря склейки ссылок). И раз так, то ваш метод my_forward переделает вернёт l-value ссылки вообще для всех аргументов.

    Отсюда берётся необходимость явно указывать тип аргумента - чтобы использовался именно выведенный тип, а не l-value на этот тип. Ну и почему 2 специализации: если указать явно тип аргумента и явно специализировать функцию каким-нибудь r-value, то my_forward будет ожидать строго r-value, и являющееся l-value значение параметра туда не подойдёт.

    В объяснение моих мыслей, код
    #include <iostream>
    
    template<typename T>
    decltype(auto) my_forward(T&& arg)
    {
        return static_cast<T&&>(arg);
    }
    
    template <typename T, typename K>
    void forward(T&& t, K&& k)
    {
        std::cout << std::is_same<int&&, decltype(my_forward(t))>::value << std::endl;
        std::cout << std::is_same<int&, decltype(my_forward(k))>::value << std::endl;
        std::cout << std::is_same<int&&, decltype(std::forward<T>(t))>::value << std::endl;
        std::cout << std::is_same<int&, decltype(std::forward<K>(t))>::value << std::endl;
    }
    
    int main()
    {
        int lval = 10;
        forward(10, lval);
        return 0;
    }


    вернёт
    0
    1
    1
    1

    То есть предположение что my_forward вернуло int&& для первого параметра - не верно!
    Ответ написан
    4 комментария
  • Зачем std::forward иметь две сигнатуры и явно указывать тип?

    @MarkusD Куратор тега C++
    все время мелю чепуху :)
    Думаю, вот эта статья даст ответы на твои вопросы.

    Если максимально точечно, то это раздел "Реализация идеальной передачи с использованием std::forward" и цитата в нем.
    Еще один момент, который нужно отметить: использование std::remove_reference. На самом деле forward может быть реализован и без использования этой функции. Сжатие ссылок выполнит всю работу, таким образом, применение std::remove_reference для этого избыточно. Однако, эта функция позволяет вывести T& t в ситуации, когда этот тип не может быть выведен (согласно стандарту С++, 14.8.2.5), поэтому необходимо явно указывать параметры шаблона при вызове std::forward.
    Ответ написан
    Комментировать